数银扩展工具
// ==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); } } })();