Greasy Fork is available in English.

数银_自定义人群分析报告

数银扩展工具

// ==UserScript==
// @name         数银_自定义人群分析报告
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  数银扩展工具
// @author       siji-Xian
// @match        *://databank.tmall.com*
// @include      /^https?:\/\/databank\.tmall\.com\/#\/customAnalysisReport\?/
// @icon         https://www.google.com/s2/favicons?domain=oceanengine.com
// @grant        none
// @license      MIT
// @require      https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/3.2.1/jquery.min.js
// @require      https://cdn.bootcss.com/moment.js/2.20.1/moment.min.js
// @require      https://greasyfork.org/scripts/404478-jsonexportexcel-min/code/JsonExportExcelmin.js?version=811266
// @require      https://greasyfork.org/scripts/455576-qmsg/code/Qmsg.js?version=1122361
// ==/UserScript==

(function () {
  "use strict";
  if (
    location.href.startsWith(
      "https://databank.tmall.com/#/customAnalysisReport?"
    )
  ) {
    var new_element = document.createElement("link");
    new_element.setAttribute("rel", "stylesheet");
    new_element.setAttribute(
      "href",
      "https://qmsg.refrain.xyz/message.min.css"
    );

    const button = document.createElement("div");
    button.textContent = "导出数据";
    Object.assign(button.style, {
      height: "34px",
      lineHeight: "var(--line-height, 34px)",
      alignItems: "center",
      color: "white",
      background:
        "linear-gradient(90deg, rgba(0, 239, 253), rgba(64, 166, 254))",
      borderRadius: "5px",
      marginLeft: "10px",
      fontSize: "13px",
      padding: "0 10px",
      cursor: "pointer",
      fontWeight: "500",
    });
    button.addEventListener("click", urlClick);

    const button2 = document.createElement("div");
    button2.textContent = "创建WS连接";
    Object.assign(button2.style, {
      height: "34px",
      lineHeight: "var(--line-height, 34px)",
      alignItems: "center",
      color: "white",
      background:
        "linear-gradient(90deg, rgba(0, 239, 253), rgba(64, 166, 254))",
      borderRadius: "5px",
      marginLeft: "10px",
      fontSize: "13px",
      padding: "0 10px",
      cursor: "pointer",
      fontWeight: "500",
    });
    button2.addEventListener("click", wsClick);

    function appendDoc() {
      const likeComment = document.querySelector(".dt-oui-tabs-nav-wrap");
      if (likeComment) {
        document.body.appendChild(new_element);
        likeComment.append(button2);
        likeComment.append(button);
        return;
      }
      setTimeout(appendDoc, 1000);
    }
    appendDoc();

    function getDate() {
      let date = document.querySelector(
        ".dt-oui-picker.dt-oui-picker-small.dt-oui-date-picker.dt-oui-picker-bg-normal .dt-oui-picker-input input"
      ).value;
      return moment(date).format("YYYYMMDD");
    }

    function getCrowdIdFromHash() {
      let url = new URL(window.location.href);
      let hash = url.hash;
      hash = hash.slice(23);
      let searchParams = new URLSearchParams(hash);
      let crowdId = searchParams.get("crowdId");
      return crowdId;
    }
    let crowdId = getCrowdIdFromHash();
    // 消息队列
    let tableList = [];

    //level1
    let level1Touch = null;

    function wsClick() {
      let date = getDate();
      // 调用函数获取 crowdId 的值
      tableList = []

      let data = {
        method: "/queryDataService/queryDataOnWidget",
        headers: {
          rid: "169338654923136",
          type: "PULL",
        },
        body: {
          args: {
            referer: "databank-customAnalysisReport",
            id: "935209",
            isMock: 0,
            whatIfParam: {
              widgetParamList: [],
              customParamList: [],
            },
            widgetSelections: null,
            selections: [
              {
                dimensionName: "theEqDate",
                restrictList: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: date,
                  },
                ],
                eq: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: date,
                  },
                ],
                lt: null,
                gt: null,
                ge: null,
                le: null,
                ne: null,
                showText: date,
              },
              {
                dimensionName: "theDate",
                restrictList: [
                  {
                    hide: 1,
                    oper: "le",
                    value: date,
                  },
                  {
                    hide: 1,
                    oper: "ge",
                    value: "20230601",
                  },
                ],
                eq: null,
                lt: null,
                gt: null,
                ge: [
                  {
                    hide: 1,
                    oper: "ge",
                    value: "20230601",
                  },
                ],
                le: [
                  {
                    hide: 1,
                    oper: "le",
                    value: date,
                  },
                ],
                ne: null,
                showText: `${getDate()}, 20230601`,
              },
              {
                dimensionName: "level1TouchId",
                restrictList: [
                  {
                    showName: "付费广告",
                    hide: 1,
                    oper: "eq",
                    value: "8",
                  },
                ],
                eq: [
                  {
                    showName: "付费广告",
                    hide: 1,
                    oper: "eq",
                    value: "8",
                  },
                ],
                lt: null,
                gt: null,
                ge: null,
                le: null,
                ne: null,
                showText: "付费广告",
              },
              {
                dimensionName: "crowdId",
                restrictList: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: crowdId,
                  },
                ],
                eq: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: crowdId,
                  },
                ],
                lt: null,
                gt: null,
                ge: null,
                le: null,
                ne: null,
                showText: crowdId,
              },
            ],
            rdPathInfoList: [],
            appId: "6",
          },
        },
      };

      let data1 = {
        method: "/queryDataService/queryDataOnWidget",
        headers: {
          rid: "169338654923543",
          type: "PULL",
        },
        body: {
          args: {
            referer: "databank-customAnalysisReport",
            id: "935208",
            isMock: 0,
            whatIfParam: {
              widgetParamList: [],
              customParamList: [],
            },
            widgetSelections: null,
            selections: [
              {
                dimensionName: "theEqDate",
                restrictList: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: date,
                  },
                ],
                eq: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: date,
                  },
                ],
                lt: null,
                gt: null,
                ge: null,
                le: null,
                ne: null,
                showText: date,
              },
              {
                dimensionName: "theDate",
                restrictList: [
                  {
                    hide: 1,
                    oper: "le",
                    value: date,
                  },
                  {
                    hide: 1,
                    oper: "ge",
                    value: "20230601",
                  },
                ],
                eq: null,
                lt: null,
                gt: null,
                ge: [
                  {
                    hide: 1,
                    oper: "ge",
                    value: "20230601",
                  },
                ],
                le: [
                  {
                    hide: 1,
                    oper: "le",
                    value: date,
                  },
                ],
                ne: null,
                showText: `${getDate()}, 20230601`,
              },
              {
                dimensionName: "level1TouchId",
                restrictList: [
                  {
                    showName: "付费广告",
                    hide: 1,
                    oper: "eq",
                    value: "8",
                  },
                ],
                eq: [
                  {
                    showName: "付费广告",
                    hide: 1,
                    oper: "eq",
                    value: "8",
                  },
                ],
                lt: null,
                gt: null,
                ge: null,
                le: null,
                ne: null,
                showText: "付费广告",
              },
              {
                dimensionName: "crowdId",
                restrictList: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: crowdId,
                  },
                ],
                eq: [
                  {
                    hide: 1,
                    oper: "eq",
                    value: crowdId,
                  },
                ],
                lt: null,
                gt: null,
                ge: null,
                le: null,
                ne: null,
                showText: crowdId,
              },
            ],
            rdPathInfoList: [],
            appId: "6",
          },
        },
      };

      // 创建 WebSocket 连接
      const socket = new WebSocket("wss://ws-insight-engine.tmall.com/");

      // 监听连接成功事件
      socket.onopen = function (event) {
        console.log("WebSocket 连接已建立", new Date());
        Qmsg.info("WebSocket 连接已建立");
        // 在连接成功后发送消息
        socket.send(JSON.stringify(data));
      };

      // 监听接收消息事件
      socket.onmessage = function (event) {
        let eventData = JSON.parse(event.data);
        let ed = eventData.body.axises[0];
        if (ed.name === "level1TouchId") {
          level1Touch = ed.values;
          ed.values.map((v) => {
            data1.headers.rid = v.key;
            data1.body.args.selections[2].restrictList[0].showName = v.showName;
            data1.body.args.selections[2].restrictList[0].value = v.key;
            data1.body.args.selections[2].eq[0].showName = v.showName;
            data1.body.args.selections[2].eq[0].value = v.key;
            data1.body.args.selections[2].showText = v.showName;
            // 在连接成功后发送消息
            socket.send(JSON.stringify(data1));
          });
        } else if (ed.name === "level2TouchId") {
          tableList.push(eventData);
        }
      };

      // 监听连接关闭事件
      socket.onclose = function (event) {
        console.log("WebSocket 连接已关闭", new Date());
        // 在此处进行连接关闭后的处理
        Qmsg.info("WebSocket 连接已关闭");
      };

      // 监听发生错误事件
      socket.onerror = function (error) {
        console.error("WebSocket 发生错误:", error);
        // 在此处处理错误
        Qmsg.info("WebSocket 发生错误");
      };
    }

    //message.js
    let loadingMsg = null;

    function expExcel(e) {
      let mapData = new Map(
        e.map((item) => {
          let value = item.body.axises[0].values.map((v, i) => {
            return { key: v.showName, value: item.body.datas[0].values[i] };
          });
          return [item.headers.rid, value];
        })
      );
      let expData = level1Touch.map((v) => {
        return { key: v.showName, value: mapData.get(v.key) };
      });

      console.log(expData);

      let contrast = {
        '触点':'key',
        '值':'value'
      };

      let option = {};
      option.fileName = "数银"; //文件名
      option.datas = expData.map((v)=>{
        return {
            sheetName: v.key,
            sheetData: v.value.length?v.value:[{}],
            sheetHeader: Object.keys(contrast),
            sheetFilter: Object.values(contrast),
            columnWidths: [], // 列宽
          }
      })
      
      var toExcel = new ExportJsonExcel(option);
      toExcel.saveExcel();
      loadingMsg.close();
    }

    function urlClick() {
      loadingMsg = Qmsg.loading("正在导出,请勿重复点击!");
      expExcel(tableList);
    }
  }
})();