Buff显示支付宝汇总余额

可以自定义开始结束时间查询 银行卡收益,支付宝收益

// ==UserScript==
// @name         Buff显示支付宝汇总余额
// @namespace    http://tampermonkey.net/
// @version      2024-08-08
// @description  可以自定义开始结束时间查询 银行卡收益,支付宝收益
// @author       [email protected]
// @match        https://buff.163.com/user-center/asset/
// @match        https://buff.163.com/user-center/asset/recharge/
// @match        https://buff.163.com/user-center/asset/withdraw/
// @icon         https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQjqFRDuBB24QeFyeIV8LAuabCvoz2d1vIFZD4h15NgIEKPFodEdoxmfxu_cQ&s
// @grant        GM.xmlHttpRequest
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_addStyle
// @license MIT
// ==/UserScript==

GM_addStyle(
  `.my-popup{width:200px;display:none;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);background-color:white;padding:20px;border-radius:5px;box-shadow:0 0 10px rgba(0,0,0,0.5);z-index:1000;}.my-popup input{display:block;width:100%;margin-bottom:10px;padding:8px 0;border:1px solid #ccc;border-radius:3px;}.my-popup button{padding:8px 16px;background-color:#4CAF50;color:white;border:none;border-radius:3px;cursor:pointer;}`
);

(function () {
  "use strict";

  function delay(ms) {
    return new Promise((resolve) => setTimeout(resolve, ms));
  }

  ////增加了支付宝余额和银行卡余额,原来的位置不够了,所以宽度改成自动
  let cols = document.querySelectorAll(".user-header .col");
  cols.forEach((col) => {
    col.style.width = "auto";
  });

  /**创建余额dom */
  function createBalanceDom({ title, description, dom_id }) {
    let div = `<div class=col style=border:0><div class=info><div class=f_12px style=margin-bottom:6px>${title} <a class=j_tips_handler data-content=${description} data-direction=right data-title=设置 href=javascript:; id=${dom_id}_config><i class="icon icon_menu icon_menu_setting"></i></a></div><div style=margin-top:4px><strong class="f_18px f_Strong"id=${dom_id}_amount style=color:#4886ff>加载中...</strong></div></div></div> `;
    let dom = document.createElement("div");
    dom.innerHTML = div;
    return dom;
  }
  function createConfigDialogDom({ tag }) {
    let popup = document.createElement("div");
    popup.classList.add("my-popup");
    popup.innerHTML = `开始日期: <input type="date" id="btn_${tag}_config_start" placeholder="开始日期">结束日期:  <input type="date" id="btn_${tag}_config_end" placeholder="结束日期"><button id="btn-${tag}-save">保存</button> `;

    // 点击div显示弹框
    document
      .getElementById(`btn_${tag}_config`)
      .addEventListener("click", function () {
        popup.style.display = "block";
      });

    // 保存按钮点击事件
    popup.addEventListener("click", function (event) {
      if (event.target.id === `btn-${tag}-save`) {
        // 获取输入框的值
        let value1 = document.getElementById(`btn_${tag}_config_start`).value;
        let value2 = document.getElementById(`btn_${tag}_config_end`).value;

        // 保存到本地存储
        GM_setValue(`btn_${tag}_config_start`, value1 + " 00:00:00");
        GM_setValue(`btn_${tag}_config_end`, value2 + " 23:59:59");

        // 关闭弹框
        popup.style.display = "none";
      }
    });
    return popup;
  }
  /** 初始化支付宝余额模块 */
  function initZFB() {
    let zfb_dom = createBalanceDom({
      title: "余额-支付宝",
      description: "设置指定时间段的支付宝余额汇总,提示作用",
      dom_id: "btn_zfb",
    });
    document.querySelector(".user-header > div").appendChild(zfb_dom);

    function initDialogZfb() {
      let popup = createConfigDialogDom({ tag: "zfb" });
      popup.addEventListener("click", () => {
        fetchAllPageData();
      });
      // 将弹框添加到页面
      document.body.appendChild(popup);

      let value1 = GM_getValue("btn_zfb_config_start");
      let value2 = GM_getValue("btn_zfb_config_end");
      if (value1) {
        document.getElementById("btn_zfb_config_start").value = value1.replace(
          " 00:00:00",
          ""
        );
      }
      if (value2) {
        document.getElementById("btn_zfb_config_end").value = value2.replace(
          " 23:59:59",
          ""
        );
      }
    }
    function fetchAllPageData() {
      let currentPage = 1;
      let totalPages = 1;
      let allData = [];
      document.getElementById("btn_zfb_amount").innerText = "加载中...";

      async function fetchPageData() {
        let btn_zfb_config_start = GM_getValue("btn_zfb_config_start");
        let btn_zfb_config_end = GM_getValue("btn_zfb_config_end");

        let params = {
          page_num: currentPage,
          pay_category: "alipay_zft",
          log_category: "sell",
          start_time: new Date(btn_zfb_config_start).getTime() / 1000,
          end_time: new Date(btn_zfb_config_end).getTime() / 1000,
          _: Date.now(),
        };

        try {
          const response = await new Promise((resolve, reject) => {
            GM.xmlHttpRequest({
              method: "GET",
              url: `https://buff.163.com/api/asset/settle/log/?page_num=${params.page_num}&pay_category=${params.pay_category}&log_category=${params.log_category}&start_time=${params.start_time}&end_time=${params.end_time}&_=${params._}`,
              onload: (response) => resolve(response),
              onerror: (error) => reject(error),
            });
          });

          const data = JSON.parse(response.responseText);
          if (Array.isArray(data?.data?.items)) {
            data.data.items.forEach((item) => {
              allData.push(item);
            });
          }

          totalPages = data?.data?.total_page || 0;

          if (currentPage < totalPages) {
            currentPage++;
            await delay(4000);
            await fetchPageData(); // 递归调用
          } else {
            // 所有数据获取完成
            console.log("所有收入:", allData);
            const totalAmount = allData.reduce((acc, item) => {
              return acc + parseFloat(item.amount);
            }, 0);
            document.getElementById("btn_zfb_amount").innerText =
              "¥" + totalAmount.toFixed(2);
          }
        } catch (error) {
          console.error("请求失败:", error);
        }
      }
        
        fetchPageData();
    }
    initDialogZfb();
    fetchAllPageData();
  }
  /** 初始化银行卡余额模块 */
  function initBank() {
    let bank_dom = createBalanceDom({
      title: "余额-银行卡",
      description: "设置指定时间段的银行卡余额汇总,提示作用",
      dom_id: "btn_bank",
    });
    document.querySelector(".user-header > div").appendChild(bank_dom);

    function fetchAllPageData() {
      let currentPage = 1;
      let totalPages = 1;
      let allData = [];
      document.getElementById("btn_bank_amount").innerText = "加载中...";
      async function fetchPageData() {
        let btn_bank_config_start = GM_getValue("btn_bank_config_start");
        let btn_bank_config_end = GM_getValue("btn_bank_config_end");

        let param = {
          page_num: currentPage,
          pay_category: "epay",
          log_category: "sell",
          start_time: new Date(btn_bank_config_start).getTime() / 1000,
          end_time: new Date(btn_bank_config_end).getTime() / 1000,
          _: Date.now(),
        };
        console.log("buff-银行卡列表接口参数:", param);
        try {
          const response = await new Promise((resolve, reject) => {
            GM.xmlHttpRequest({
              method: "GET",
              url: `https://buff.163.com/api/asset/flow/log/?page_num=${param.page_num}&pay_category=epay&log_category=sell&start_time=${param.start_time}&end_time=${param.end_time}&_=${param._}`,
              onload: (response) => resolve(response),
              onerror: (error) => reject(error),
            });
          });

          const data = JSON.parse(response.responseText);
          if (Array.isArray(data?.data?.items)) {
            data.data.items.forEach((item) => {
              allData.push(item);
            });
          }

          totalPages = data?.data?.total_page || 0;

          if (currentPage < totalPages) {
            currentPage++;
            await delay(4000);
            await fetchPageData(); // 递归调用
          } else {
            // 所有数据获取完成
            console.log("所有收入:", allData);
            const totalAmount = allData.reduce((acc, item) => {
              return acc + parseFloat(item.cash_amount_diff);
            }, 0);
            document.getElementById("btn_bank_amount").innerText =
              "¥" + totalAmount.toFixed(2);
          }
        } catch (error) {
          console.error("请求失败:", error);
        }
      }

      fetchPageData();
    }

    let popup = createConfigDialogDom({ tag: "bank" });
    popup.addEventListener("click", () => {
      fetchAllPageData();
    });
    // 将弹框添加到页面
    document.body.appendChild(popup);

    // 将弹框添加到页面
    document.body.appendChild(popup);

    let value1 = GM_getValue("btn_bank_config_start");
    let value2 = GM_getValue("btn_bank_config_end");
    if (value1) {
      document.getElementById("btn_bank_config_start").value = value1.replace(
        " 00:00:00",
        ""
      );
    }
    if (value2) {
      document.getElementById("btn_bank_config_end").value = value2.replace(
        " 23:59:59",
        ""
      );
    }

    fetchAllPageData();
  }

  initZFB();
  initBank();
})();