feat: 添加人群画像批量下载功能
新增人群画像批量下载功能,用户可通过点击按钮下载选中人群的画像数据,并导出为CSV文件。该功能包括人群ID和名称的获取、画像数据的请求与处理、以及CSV文件的生成与下载。
This commit is contained in:
@@ -0,0 +1,188 @@
|
||||
// ==UserScript==
|
||||
// @name 批量下载市场洞察品牌数据
|
||||
// @namespace https://bbs.tampermonkey.net.cn/
|
||||
// @version 0.1.0
|
||||
// @description 下载抖音云图市场洞察品牌数据
|
||||
// @author wan喜
|
||||
// @match https://yuntu.oceanengine.com/yuntu_brand/ecom/product/segmentedMarketDetail/marketProduct?*
|
||||
// @icon https://www.google.com/s2/favicons?domain=oceanengine.com
|
||||
// @require https://cdn.staticfile.net/sweetalert2/11.10.0/sweetalert2.all.min.js
|
||||
// ==/UserScript==
|
||||
|
||||
(function () {
|
||||
"use strict"
|
||||
|
||||
// 创建下载按钮
|
||||
var newButton = document.createElement("button")
|
||||
newButton.innerHTML = "下载品牌数据"
|
||||
newButton.type = "button"
|
||||
newButton.style.height = "34px"
|
||||
newButton.style.lineHeight = "34px"
|
||||
newButton.style.align = "center" // 文本居中
|
||||
newButton.style.color = "white" // 按钮文字颜色
|
||||
newButton.style.background = "#1f4bd9" // 按钮底色
|
||||
newButton.style.border = "1px solid #1f4bd9" // 边框属性
|
||||
newButton.style.borderRadius = "3px" // 按钮四个角弧度
|
||||
newButton.style.marginLeft = '10px'
|
||||
newButton.style.fontSize = '12px'
|
||||
newButton.style.padding = '0 10px'
|
||||
newButton.className = "byted-btn byted-btn-size-md byted-btn-type-primary byted-btn-shape-angle byted-can-input-grouped"
|
||||
newButton.addEventListener("click", handleButtonClick) // 监听按钮点击事件
|
||||
|
||||
// 添加按钮到页面
|
||||
function appendButton() {
|
||||
setTimeout(() => {
|
||||
// 这里需要根据实际页面结构找到合适的位置添加按钮
|
||||
var targetElement = document.querySelector(".操作区域的选择器") // 需要根据实际页面修改
|
||||
if (targetElement) {
|
||||
targetElement.append(newButton)
|
||||
console.log("按钮已添加")
|
||||
} else {
|
||||
console.log("未找到目标元素,继续尝试")
|
||||
appendButton()
|
||||
}
|
||||
}, 1000)
|
||||
}
|
||||
appendButton()
|
||||
|
||||
// 从URL获取参数
|
||||
function getParamsFromUrl() {
|
||||
const url = window.location.href
|
||||
const aadvid = url.split('aadvid=')[1]?.split('&')[0]
|
||||
const reportId = url.split('reportId=')[1]?.split('&')[0]
|
||||
|
||||
return {
|
||||
aadvid,
|
||||
reportId
|
||||
}
|
||||
}
|
||||
|
||||
// 获取请求体参数
|
||||
function getRequestBody() {
|
||||
// 这里需要根据实际情况获取或设置参数
|
||||
// 可以从页面元素中提取,或者让用户输入
|
||||
return {
|
||||
reportId: "", // 需要获取
|
||||
categoryId: "0",
|
||||
contentType: "ALL",
|
||||
startDate: "0",
|
||||
endDate: "2025-03-31",
|
||||
dateType: "MONTH",
|
||||
analysisType: "DRILL_DOWN",
|
||||
itemType: "PRODUCT_BRAND",
|
||||
sortKey: "salesAmount",
|
||||
page: 1,
|
||||
pageSize: 100,
|
||||
order: "ascend"
|
||||
}
|
||||
}
|
||||
|
||||
// 发送请求获取数据
|
||||
async function fetchBrandData(aadvid, body) {
|
||||
const url = `https://yuntu.oceanengine.com/product_node/v2/api/industry/insightBrandStats?aadvid=${aadvid}`
|
||||
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"accept": "application/json, text/plain, */*",
|
||||
"content-type": "application/json"
|
||||
},
|
||||
body: JSON.stringify(body),
|
||||
credentials: "include"
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`)
|
||||
}
|
||||
|
||||
const data = await response.json()
|
||||
return data
|
||||
} catch (error) {
|
||||
console.error("获取数据失败:", error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
// 处理数据并下载CSV
|
||||
function processAndDownloadData(data) {
|
||||
// 假设data.data.list是品牌数据列表
|
||||
if (!data || !data.data || !data.data.list) {
|
||||
throw new Error("数据格式不正确")
|
||||
}
|
||||
|
||||
const brandList = data.data.list
|
||||
|
||||
// 创建CSV内容
|
||||
let csv = ''
|
||||
|
||||
// 添加表头
|
||||
const headers = Object.keys(brandList[0])
|
||||
csv += headers.join(',') + '\n'
|
||||
|
||||
// 添加数据行
|
||||
brandList.forEach(brand => {
|
||||
const values = headers.map(header => {
|
||||
let value = brand[header]
|
||||
// 处理包含逗号的字符串
|
||||
if (typeof value === 'string' && value.includes(',')) {
|
||||
return `"${value}"`
|
||||
}
|
||||
return value
|
||||
})
|
||||
csv += values.join(',') + '\n'
|
||||
})
|
||||
|
||||
// 下载CSV文件
|
||||
const hiddenElement = document.createElement('a')
|
||||
hiddenElement.href = 'data:text/csv;charset=utf-8,%EF%BB%BF' + encodeURI(csv)
|
||||
hiddenElement.target = '_blank'
|
||||
hiddenElement.download = `品牌数据_${new Date().toISOString().slice(0, 10)}.csv`
|
||||
hiddenElement.click()
|
||||
}
|
||||
|
||||
// 按钮点击处理函数
|
||||
async function handleButtonClick() {
|
||||
try {
|
||||
// 显示加载提示
|
||||
const Toast = Swal.mixin({
|
||||
toast: true,
|
||||
position: "top-end",
|
||||
showConfirmButton: false,
|
||||
timer: 3000,
|
||||
})
|
||||
Toast.fire({
|
||||
icon: "info",
|
||||
title: "正在获取数据..."
|
||||
})
|
||||
|
||||
// 获取参数
|
||||
const { aadvid, reportId } = getParamsFromUrl()
|
||||
|
||||
// 获取请求体
|
||||
const requestBody = getRequestBody()
|
||||
requestBody.reportId = reportId
|
||||
|
||||
// 获取数据
|
||||
const brandData = await fetchBrandData(aadvid, requestBody)
|
||||
|
||||
// 处理并下载数据
|
||||
processAndDownloadData(brandData)
|
||||
|
||||
// 显示成功提示
|
||||
Toast.fire({
|
||||
icon: "success",
|
||||
title: "数据下载成功"
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
|
||||
// 显示错误提示
|
||||
Swal.fire({
|
||||
icon: "error",
|
||||
title: "下载失败",
|
||||
text: error.message
|
||||
})
|
||||
}
|
||||
}
|
||||
})()
|
||||
Reference in New Issue
Block a user