Greasy Fork is available in English.
云图扩展工具
- // ==UserScript==
- // @name 数据工厂_模型结果导出
- // @namespace http://tampermonkey.net/
- // @version 1.9.1
- // @description 云图扩展工具
- // @author siji-Xian
- // @match *://yuntu.oceanengine.com/yuntu_brand/data_factory/model_prediction/model/list?*
- // @icon https://lf3-static.bytednsdoc.com/obj/eden-cn/prhaeh7pxvhn/yuntu/yuntu-logo_default.svg
- // @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";
- var new_element = document.createElement("link");
- new_element.setAttribute("rel", "stylesheet");
- new_element.setAttribute("href", "https://qmsg.refrain.xyz/message.min.css");
- document.body.appendChild(new_element);
- var button2 = document.createElement("button"); //创建一个按钮
- button2.textContent = "导出特征信息熵"; //按钮内容
- button2.style.height = "34px"; //高
- button2.style.lineHeight = "34px"; //行高
- button2.style.align = "center"; //文本居中
- button2.style.color = "#FFF"; //按钮文字颜色
- button2.style.background = "rgb(234,94,32)"; //按钮底色
- button2.style.border = "0px solid #eee"; //边框属性
- button2.style.borderRadius = "2px"; //按钮四个角弧度
- button2.style.marginLeft = "10px";
- button2.style.fontSize = "14px";
- button2.style.padding = "0 15px";
- button2.style.position = "absolute";
- button2.style.top = "49px";
- button2.style.right = "0px";
- button2.style.zIndex = "999";
- button2.addEventListener("click", ()=>urlClick(1)); //监听按钮点击事件
- var button = document.createElement("button"); //创建一个按钮
- button.textContent = "导出数据"; //按钮内容
- button.style.height = "34px"; //高
- button.style.lineHeight = "34px"; //行高
- button.style.align = "center"; //文本居中
- button.style.color = "#FFF"; //按钮文字颜色
- button.style.background = "rgb(234,94,32)"; //按钮底色
- button.style.border = "0px solid #eee"; //边框属性
- button.style.borderRadius = "2px"; //按钮四个角弧度
- button.style.marginLeft = "10px";
- button.style.fontSize = "14px";
- button.style.padding = "0 15px";
- button.style.position = "absolute";
- button.style.top = "0px";
- button.style.right = "0px";
- button.style.zIndex = "999";
- button.addEventListener("click", ()=>urlClick(0)); //监听按钮点击事件
- const getRequestOptions = {
- method: "GET",
- redirect: "follow",
- };
- //获取brand信息
- let brand = localStorage.getItem("__Garfish__platform__yuntu_user") || "";
- let brands = JSON.parse(brand);
- function getQueryVariable(variable) {
- var query = window.location.search.substring(1);
- var vars = query.split("&");
- for (var i = 0; i < vars.length; i++) {
- var pair = vars[i].split("=");
- if (pair[0] == variable) {
- return pair[1];
- }
- }
- return false;
- }
- //message.js
- let loadingMsg = null;
- let xhrList = [];
- (function listen() {
- var origin = {
- open: XMLHttpRequest.prototype.open,
- send: XMLHttpRequest.prototype.send,
- };
- XMLHttpRequest.prototype.open = function (a, b) {
- this.addEventListener("load", replaceFn);
- origin.open.apply(this, arguments);
- };
- XMLHttpRequest.prototype.send = function (a, b) {
- origin.send.apply(this, arguments);
- };
- function replaceFn(obj) {
- if (this?._url?.slice(0, 28) == "/data_factory/api/model/list") {
- xhrList.push(obj.target._reqHeaders);
- }
- }
- })();
- function appendDoc() {
- setTimeout(() => {
- var like_comment = document.querySelectorAll("body")[0];
- if (like_comment) {
- like_comment.append(button); //把按钮加入到 x 的子节点中
- like_comment.append(button2); //把按钮加入到 x 的子节点中
- return;
- }
- appendDoc();
- }, 1000);
- }
- appendDoc();
- function checkElement() {
- const targetElement = document.querySelector(".index__name--cRoDQ");
- if (targetElement) {
- button.style.display = "block";
- button2.style.display = "block";
- } else {
- button.style.display = "none";
- button2.style.display = "none";
- }
- }
- const intervalId = setInterval(checkElement, 1000);
- function fetchFun(url, data, requestOptions = getRequestOptions) {
- const urlData = Object.keys(data)
- .map((v) => `${v}=${data[v]}`)
- .join("&");
- return fetch(`${url}?${urlData}`, requestOptions)
- .then((response) => response.text())
- .then((r###lt) => {
- return JSON.parse(r###lt);
- })
- .catch((error) => console.log("error", error));
- }
- async function task_list() {
- let myHeaders = new Headers();
- myHeaders.append("accept", "application/json, text/plain, */*");
- myHeaders.append("content-type", "application/json;charset=UTF-8");
- myHeaders.append("x-csrf-token", xhrList[0]["x-csrf-token"]);
- let element = document.querySelector(".index__name--cRoDQ");
- let content = element.firstChild.innerText;
- let data = {
- aadvid: getQueryVariable("aadvid"),
- };
- let raw = JSON.stringify({
- limit: "10",
- offset: "0",
- without_detail: true,
- });
- const postRequestOptions = {
- method: "POST",
- headers: myHeaders,
- body: raw,
- redirect: "follow",
- };
- let total = await fetchFun(
- "https://yuntu.oceanengine.com/data_factory/api/model/list",
- data,
- postRequestOptions
- );
- let raw1 = JSON.stringify({
- limit: total?.data?.total,
- offset: "0",
- without_detail: true,
- });
- const postRequestOptions1 = {
- method: "POST",
- headers: myHeaders,
- body: raw1,
- redirect: "follow",
- };
- let res = await fetchFun(
- "https://yuntu.oceanengine.com/data_factory/api/model/list",
- data,
- postRequestOptions1
- );
- let targetObj = res?.data?.items?.filter((v) => {
- return v.model_name === content;
- })[0];
- return targetObj;
- }
- function convertArrayToObject(arr) {
- const headers = arr[0];
- const data = arr.slice(1);
- return data.map((row) =>
- Object.fromEntries(row.map((val, i) => [headers[i], val]))
- );
- }
- function transformData(arr,Maps) {
- const r###lt = [];
- arr.forEach((data) => {
- const transformedDataArray = [];
- data.forEach((bucketData) => {
- const {
- categories,
- feature_id,
- bucket_name,
- cluster_id,
- one_proportion,
- all_one_proportion,
- tgi,
- sort_key,
- } = {...bucketData,...Maps.get(bucketData.feature_id)};
- let transformedData = transformedDataArray.find(
- (d) => d.feature_id === feature_id && d.bucket_name === bucket_name
- );
- if (!transformedData) {
- transformedData = {
- categories,
- feature_id,
- bucket_name,
- };
- transformedDataArray.push(transformedData);
- }
- transformedData[`one_proportion_${cluster_id}`] = one_proportion;
- transformedData[`all_one_proportion_${cluster_id}`] =
- all_one_proportion;
- transformedData[`tgi_${cluster_id}`] = tgi;
- transformedData[`sort_key_${cluster_id}`] = sort_key;
- });
- r###lt.push(transformedDataArray);
- });
- return r###lt;
- }
- async function getData(e) {
- let elements = Array.from(document.querySelectorAll(".dfmp-tag-closable"));
- let textContents = elements.map((element) => element.textContent);
- if (!textContents.length) {
- Qmsg.error("未选择特征!");
- return;
- }
- loadingMsg = Qmsg.loading("正在导出,请勿重复点击!");
- let targetObj = await task_list();
- let inputArray = JSON.parse(targetObj.clustering_info);
- const outputArray = convertArrayToObject(inputArray);
- let data = {
- aadvid: getQueryVariable("aadvid"),
- };
- var myHeaders = new Headers();
- myHeaders.append("authority", "yuntu.oceanengine.com");
- myHeaders.append("accept", "application/json, text/plain, */*");
- myHeaders.append("accept-language", "zh-CN,zh;q=0.9");
- myHeaders.append("content-type", "application/json;charset=UTF-8");
- myHeaders.append("x-csrf-token", xhrList[0]["x-csrf-token"]);
- const postRequestOptions = {
- method: "POST",
- headers: myHeaders,
- body: "{}",
- redirect: "follow",
- };
- let barData = await fetchFun(
- "https://yuntu.oceanengine.com/data_factory/api/model/feature/list",
- data,
- postRequestOptions
- );
- let barDataList = barData?.data?.items?.map((v) => {
- return { categories: v.categories.join("/"), feature_id: v.feature_id };
- });
- const barDataListMap = new Map(
- barDataList.map((item) => [item.categories, item])
- );
- let target = []
- textContents?.forEach((v) => {
- if (barDataListMap.get(v)) {
- target.push(barDataListMap.get(v))
- }
- });
- if (e) {
- expExcel2(target)
- return
- }
- let filtrationData = target.map((v) => {
- return outputArray.filter((t) => {
- return v?.feature_id === t?.feature_id;
- });
- });
- const barDataMap = new Map(
- barDataList.map((item) => [item.feature_id, item])
- );
- let transformData_target = transformData(filtrationData, barDataMap);
- expExcel(transformData_target);
- }
- function expExcel(transformData_target) {
- let title = document.getElementsByClassName("dfmp-table-th-title");
- let titleArr = Array.from(title);
- let contrasts = {};
- titleArr
- .filter((v, i) => {
- return i >= 10;
- })
- .map((v, i) => {
- contrasts[v.textContent + "占比"] = `one_proportion_${i}`;
- contrasts[v.textContent + "TGI"] = `tgi_${i}`;
- });
- let contrast = {
- 特征: "categories",
- 特征值: "bucket_name",
- ...contrasts,
- };
- let fileName = `聚类模型数据`;
- setTimeout(() => {
- let option = {};
- option.fileName = fileName; //文件名
- option.datas = transformData_target.map((v, i) => {
- return {
- sheetName: '',
- // sheetName: sheetName[i],
- sheetData: v.map((item) => {
- return item;
- }),
- sheetHeader: Object.keys(contrast),
- sheetFilter: Object.values(contrast),
- columnWidths: [], // 列宽
- };
- });
- var toExcel = new ExportJsonExcel(option);
- toExcel.saveExcel();
- setTimeout(() => {
- loadingMsg.close();
- }, 1000);
- }, 1000);
- }
- function expExcel2(e) {
- let contrast = {
- 特征: "categories",
- 特征ID: "feature_id",
- };
- let fileName = `特征信息熵`;
- let option = {};
- option.fileName = fileName; //文件名
- option.datas = [{
- sheetName: "",
- sheetData: e,
- sheetHeader: Object.keys(contrast),
- sheetFilter: Object.values(contrast),
- columnWidths: [], // 列宽
- }]
- var toExcel = new ExportJsonExcel(option);
- toExcel.saveExcel();
- setTimeout(() => {
- loadingMsg.close();
- }, 1000);
- }
- function urlClick(e) {
- getData(e);
- }
- })();