Greasy Fork is available in English.

5A关系资产_5A人群资产渗透分析

云图扩展工具

// ==UserScript==
// @name         5A关系资产_5A人群资产渗透分析
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  云图扩展工具
// @author       siji-Xian
// @match        *://yuntu.oceanengine.com/yuntu_brand/assets/crowd/distribution?*
// @grant        none
// @icon         https://lf3-static.bytednsdoc.com/obj/eden-cn/prhaeh7pxvhn/yuntu/yuntu-logo_default.svg
// @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/463728-lodash-js/code/lodashjs.js?version=1174104
// @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 button = document.createElement("button"); //创建一个按钮
  button.textContent = "导出数据"; //按钮内容
  button.style.height = "32px"; //高
  button.style.lineHeight = "32px"; //行高
  button.style.align = "center"; //文本居中
  button.style.color = "white"; //按钮文字颜色
  button.style.background = "#1f4bd9"; //按钮底色
  button.style.border = "0px"; //边框属性
  button.style.borderRadius = "0px"; //按钮四个角弧度
  button.style.marginLeft = "10px";
  button.style.fontSize = "14px";
  button.style.padding = "0 15px";
  button.addEventListener("click", urlClick); //监听按钮点击事件

  var button1 = document.createElement("button"); //创建一个按钮
  button1.textContent = "资产渗透分析"; //按钮内容
  button1.style.height = "32px"; //高
  button1.style.lineHeight = "32px"; //行高
  button1.style.align = "center"; //文本居中
  button1.style.color = "white"; //按钮文字颜色
  button1.style.background = "#1f4bd9"; //按钮底色
  button1.style.border = "0px"; //边框属性
  button1.style.borderRadius = "0px"; //按钮四个角弧度
  button1.style.marginLeft = "10px";
  button1.style.fontSize = "14px";
  button1.style.padding = "0 15px";
  button1.addEventListener("click", urlClick1); //监听按钮点击事件

  //message.js
  let loadingMsg = null;
  let loadingMsg1 = null;
  
  //导出文件名
  let fileName = "";

  //默认GET请求
  const getRequestOptions = {
    method: "GET",
    redirect: "follow",
  };

  function appendDoc() {
    setTimeout(() => {
      var like_comment = document.getElementsByClassName(
        "container-QOzF47"
      )[0];
      if (like_comment) {
        like_comment.append(button); //把按钮加入到 x 的子节点中
        like_comment.append(button1); //把按钮加入到 x 的子节点中
        return;
      }
      appendDoc();
    }, 1000);
  }
  appendDoc();

  //query参数获取
  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;
  }

  //获取行业id
  async function getIndustryId(){
    let industry_id_url = `https://yuntu.oceanengine.com/yuntu_ng/api/v1/get_user_info`
    let res = await fetchFun2(industry_id_url,{aadvid:getQueryVariable('aadvid')})
    let industryValue = document.querySelectorAll('.assets-input.assets-input-size-md')[0].value.split('/')[document.querySelectorAll('.assets-input.assets-input-size-md')[0].value.split('/').length - 1]
    let data = res
    let a = data?.data?.brandMetadata?.filter((e)=>{
        let contentData = e?.industry_name.split('/')
        return contentData[contentData.length - 1] == industryValue
    })[0]
    return a.industry_id
  }

  //获取brand信息
  let brand = localStorage.getItem("__Garfish__platform__yuntu_user") || "";
  let brands = JSON.parse(brand);

  //封装网络请求
  function fetchFun2(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((result) => {
        return JSON.parse(result);
      })
      .catch((error) => console.log("error:", error));
  }


  //获取用户筛选条件
  async function getUseData() {
    let benchmark = {
      对比品牌均值: 1,
      行业TOP5品牌均值: 2,
      行业TOP20品牌均值: 3,
      行业TOP50品牌均值: 4,
      行业TOP100品牌均值: 5,
    };
    let industryValue1 = document.querySelectorAll
    (
      ".assets-input.assets-input-size-md"
    )[2].value;
    let industryValue2 = document.querySelectorAll(
      ".assets-input.assets-input-size-md"
    )[3].value;
    return {
      date: industryValue2,
      benchmark: benchmark[industryValue1],
      benchmark_str: industryValue1,
    };
  }

  //An人群item获取
  async function getAnItem(date, benchmark_str) {
    let industry_id = await getIndustryId();
    let data = {
      aadvid: getQueryVariable("aadvid"),
      industry_id,
      brand_id: brands.brand_id,
      date: moment(date).format("YYYYMMDD"),
    };
    let requestData = await fetchFun2(
      "https://yuntu.oceanengine.com/yuntu_ng/api/v1/get_audience_asset_profile",
      data
    );
    let anData = {
      date: moment(date).format("YYYY-MM-DD"),
      benchmark: benchmark_str,
    };
    let res = requestData?.data.profile;
    res.forEach((v, i) => {
      Object.keys(v).forEach((k) => {
        anData["A" + i + "_" + k] = v[k];
      });
    });
    return anData;
  }

  //5A人群资产结构分析
  async function get5Aassets(date, benchmark_str, benchmark) {
    let industry_id = await getIndustryId();
    let data = {
      aadvid: getQueryVariable("aadvid"),
      industry_id,
      brand_id: brands.brand_id,
      date: moment(date).format("YYYYMMDD"),
      card: 0,
      benchmark,
    };
    let requestData = await fetchFun2(
      "https://yuntu.oceanengine.com/yuntu_ng/api/v1/GetAudienceAssetStructure",
      data
    );
    let res = [
      ...requestData?.data?.structure_list,
      ...requestData?.data?.a3_list,
    ];
    let expData = { date: moment(date).format("YYYY-MM-DD") };
    res.map((v) => {
      expData[v.name + "_value"] = v.value;
      expData[v.name + "_rate"] = v.rate;
    });
    return expData;
  }

  let index_5A = 0
  //5A人群资产渗透分析
  async function get5Apenetration(date, benchmark_str, benchmark) {
    let industry_id = await getIndustryId();
    let data = {
      aadvid: getQueryVariable("aadvid"),
      industry_id,
      brand_id: brands.brand_id, 
      date: moment(date).format("YYYYMMDD"),
    };
    let requestData = await fetchFun2(
      "https://yuntu.oceanengine.com/yuntu_ng/api/v1/GetAudienceAssetBig8Profile",
      data
    );
    let res = requestData?.data?.ax_big8_profile[index_5A];
    let contrast = {
      name: "big8_name",
      规模: "big8_cnt",
      占比: "big8_percent",
      渗透率趋势: "big8_permeab",
    };
    let arr = [];
    fileName = `${moment(date).format("YYYY-MM-DD")}A${index_5A}人群资产渗透分析`;
    Object.keys(res).map((v) => {
      arr.push({
        sheetName:
          v == "compete_profile"
            ? "对比品牌"
            : v == "top5_profile"
            ? "行业TOP5品牌"
            : v == "top20_profile"
            ? "行业TOP20品牌"
            : v == "top50_profile"
            ? "行业TOP50品牌"
            : v == "top100_profile"
            ? "行业TOP100品牌"
            : "本品牌",
        sheetData: res[v].length ? res[v] : [{}],
        sheetHeader: Object.keys(contrast),
        sheetFilter: Object.values(contrast),
        columnWidths: [], // 列宽
      });
    });
    expExcel(arr);
  }

  function expExcel(e) {
    let option = {};
    option.fileName = fileName; //文件名
    option.datas = e;
    var toExcel = new ExportJsonExcel(option);
    toExcel.saveExcel();
    if (loadingMsg1) loadingMsg1.close();
    loadingMsg.close();
  }

  async function urlClick() {
    let useData = await getUseData();
    let res = prompt("导出天数(合法值 1~30)", 1);
    let contrast = {
      Benchmark: "benchmark",
      日期: "date",
      人群总资产: "A0_cover_num",
      人群总资产超同行: "A0_position_of_industry",
      A1了解: "A1_cover_num",
      A1了解超同行: "A1_position_of_industry",
      A2吸引: "A2_cover_num",
      A2吸引超同行: "A2_position_of_industry",
      A3问询: "A3_cover_num",
      A3问询超同行: "A3_position_of_industry",
      A4行动: "A4_cover_num",
      A4行动超同行: "A4_position_of_industry",
      A5拥护: "A5_cover_num",
      A5拥护超同行: "A5_position_of_industry",
    };
    let contrast1 = (e) => {
      return {
        日期: "date",
        本品牌A1: "a1_value",
        [e + "A1"]: "a1_compare_value",
        本品牌A2: "a2_value",
        [e + "A2"]: "a2_compare_value",
        本品牌A3: "a3_value",
        [e + "A3"]: "a3_compare_value",
        本品牌A4: "a4_value",
        [e + "A4"]: "a4_compare_value",
        本品牌A5: "a5_value",
        [e + "A5"]: "a5_compare_value",
        // 本品牌主动A3: "a301_value",
        // [e + "主动A3"]: "a301_compare_value",
        // 本品牌被动A3: "a302_value",
        // [e + "被动A3"]: "a302_compare_value",
        本品牌A1占比: "a1_rate",
        [e + "A1占比"]: "a1_compare_rate",
        本品牌A2占比: "a2_rate",
        [e + "A2占比"]: "a2_compare_rate",
        本品牌A3占比: "a3_rate",
        [e + "A3占比"]: "a3_compare_rate",
        本品牌A4占比: "a4_rate",
        [e + "A4占比"]: "a4_compare_rate",
        本品牌A5占比: "a5_rate",
        [e + "A5占比"]: "a5_compare_rate",
        // 本品牌主动A3占比: "a301_rate",
        // [e + "主动A3占比"]: "a301_compare_rate",
        // 本品牌被动A3占比: "a302_rate",
        // [e + "被动A3占比"]: "a302_compare_rate",
      };
    };
    if (res >= 1 && res <= 30) {
      loadingMsg = Qmsg.loading("正在导出,请勿重复点击!");
      let arr = new Array(+res);
      let datas = [];
      let datas_5A = [];
      let end_date = "";
      for (let i = 0; i < arr.length; i++) {
        let data = await getAnItem(
          moment(useData.date).add(-i, "days"),
          useData.benchmark_str
        );
        let get5Adata = await get5Aassets(
          moment(useData.date).add(-i, "days"),
          useData.benchmark_str,
          useData.benchmark
        );
        let get5Aenetration = await get5Apenetration(
          moment(useData.date).add(-i, "days"),
          useData.benchmark_str,
          useData.benchmark
        );
        end_date = moment(useData.date).add(-i, "days");
        datas.push(data);
        datas_5A.push(get5Adata);
        document.getElementsByClassName(
          "qmsg-content-loading"
        )[0].childNodes[2].innerHTML = `导出进度:${Math.round(
          (datas.length / arr.length) * 100
        )}%`;
      }
      if (datas.length === +res) {
        fileName = `${moment(end_date).format("YYYYMMDD")}_${moment(
          useData.date
        ).format("YYYYMMDD")}5A关系资产`;
        let expData = [
          {
            sheetName: `5A关系资产`,
            sheetData: datas.length ? datas : [{}],
            sheetHeader: Object.keys(contrast),
            sheetFilter: Object.values(contrast),
            columnWidths: [], // 列宽
          },
          {
            sheetName: `5A人群资产结构分析`,
            sheetData: datas_5A.length ? datas_5A : [{}],
            sheetHeader: Object.keys(contrast1(useData.benchmark_str)),
            sheetFilter: Object.values(contrast1(useData.benchmark_str)),
            columnWidths: [], // 列宽
          },
        ];
        expExcel(expData);
        datas = [];
      }
    } else if (res === null) {
      return;
    } else {
      alert("输入值有误");
      return;
    }
  }

  async function urlClick1() {
    try {
      let res = prompt("5A:0,A1:1,A2:2,A3:3,A4:4,A5:5");
      if (res) {
        index_5A = parseInt(res);

        let useData = await getUseData();
      
        loadingMsg = Qmsg.loading("正在导出,请勿重复点击!");
        await get5Apenetration(
          moment(useData.date),
          useData.benchmark_str,
          useData.benchmark
        );
      }
    } catch (err) {
      Qmsg.error(err.message+'请刷新页面后重试。');
    }


  }
})();