chore: refresh internal release package

This commit is contained in:
admin123 2026-05-19 13:51:27 +08:00
parent 37f7e0b5e6
commit db95a1f565
9 changed files with 1245 additions and 124 deletions

View File

@ -26,9 +26,10 @@
}
// src/background/auth/state.ts
function createLoggedOutAuthState(config) {
function createLoggedOutAuthState(config, lastError) {
return {
isAuthenticated: false,
lastError: lastError ?? null,
resource: config?.apiResource ?? null
};
}
@ -64,6 +65,14 @@
if (!isAuthenticated) {
return createLoggedOutAuthState(config);
}
try {
await options.authClient.getAccessToken(config.apiResource);
} catch (error) {
return createLoggedOutAuthState(
config,
error instanceof Error ? error.message : String(error)
);
}
const claims = await options.authClient.getIdTokenClaims();
return createLoggedInAuthState(claims, config);
},

File diff suppressed because it is too large Load Diff

View File

@ -37,9 +37,9 @@
4. 点击左上角出现的 **"加载已解压的扩展程序"**
5. 选择刚才解压出来的文件夹里的 **`dist-release`** 文件夹
5. 选择刚才解压出来的插件文件夹
⚠️ **重要**必须选择 `dist-release` 这个子文件夹,不要选外层文件夹
⚠️ **重要**如果文件夹里能看到 `manifest.json``content``background``popup` 这些文件和文件夹,说明选对了。
6. 看到绿色的插件卡片出现,就装好了!
@ -72,14 +72,43 @@ https://xingtu.cn/ad/creator/market
## 📝 主要功能
### 1⃣ 导出 Excel 表格
### 1⃣ 导出基础数据基础CSV
- 勾选你想导出的达人(不勾就选全部)
- 选择范围:当前页 / 前5页 / 全部
- 点击 **"导出CSV"**
- 文件自动下载到电脑的"下载"文件夹
### 2⃣ 提交批次
### 2⃣ 导出画像数据画像CSV
当你需要导出达人的画像、内容数据、效果预估时使用:
- 先勾选你想导出画像的达人
- 选择范围:当前页 / 前5页 / 全部
- 点击 **"导出画像CSV"**
- 等待下载完成
- 文件自动下载到电脑的"下载"文件夹
⚠️ **重要**:画像导出必须先勾选达人,因为它会额外请求达人详情页数据,不能默认导出全部。
**画像CSV包含**
- 观众画像、粉丝画像、铁粉画像
- 内容数据:个人视频/星图视频的播放量中位数、完播率、互动率、发布作品、平均时长、平均点赞、平均评论、平均转发
- 效果预估不同视频时长的预期CPM、预期CPE、预期播放量、爆文率
- 秒思api数据看后搜率、看后搜数、新增A3数、新增A3率、CPA3、cp_search
### 3⃣ 按ID导出画像数据
当你想批量查询特定达人ID的画像数据时使用
- 点击 **"按ID导出画像CSV"**
- 在弹出的对话框中输入达人ID每行一个
- 点击确认
- 等待下载完成
**适用场景**已知一批达人星图ID需要批量导出这些达人的画像CSV。
### 4⃣ 提交批次
- 勾选你想提交的达人
- 点击 **"提交批次"**
@ -100,7 +129,7 @@ https://xingtu.cn/ad/creator/market
⚠️ **如果重新加载后还是旧版本**
- 先点击插件卡片的 **"移除"** 删除旧版本
- 然后重新点击 **"加载已解压的扩展程序"**
- 再次选择 `dist-release` 文件夹
- 再次选择新解压出来的插件文件夹
---
@ -136,4 +165,4 @@ A: 重新解压压缩包,然后到 `chrome://extensions` 点"重新加载"
2. 页面截图
3. 扩展 ID从 chrome://extensions 里看)
**记住正确的 ID`**pkjopdibdnomhogjheclhnknmejccffg**`
**记住正确的 ID`pkjopdibdnomhogjheclhnknmejccffg`**

View File

@ -68,6 +68,9 @@ const BUSINESS_VIDEO_METRIC_LAYOUTS: Array<{
{ key: "averageShare", label: "平均转发" }
];
const BUSINESS_VIDEO_SECTION_LABEL = "内容数据";
const BUSINESS_ESTIMATE_SECTION_LABEL = "效果预估";
const BUSINESS_ESTIMATE_LAYOUTS: Array<{
key: BusinessAbilityDurationKind;
label: string;
@ -108,14 +111,14 @@ function buildBusinessAbilityColumns(): AudienceProfileCsvColumn[] {
return [
...BUSINESS_VIDEO_LAYOUTS.flatMap((videoLayout) =>
BUSINESS_VIDEO_METRIC_LAYOUTS.map((metricLayout) => ({
header: `商业能力-${videoLayout.label}-${metricLayout.label}`,
header: `${BUSINESS_VIDEO_SECTION_LABEL}-${videoLayout.label}-${metricLayout.label}`,
readValue: (row: AudienceProfileExportRow) =>
readBusinessVideoValue(row, videoLayout.key, metricLayout.key)
}))
),
...BUSINESS_ESTIMATE_LAYOUTS.flatMap((durationLayout) =>
BUSINESS_ESTIMATE_METRIC_LAYOUTS.map((metricLayout) => ({
header: `商业能力-${durationLayout.label}-${metricLayout.label}`,
header: `${BUSINESS_ESTIMATE_SECTION_LABEL}-${durationLayout.label}-${metricLayout.label}`,
readValue: (row: AudienceProfileExportRow) =>
readBusinessEstimateValue(row, durationLayout.key, metricLayout.key)
}))

View File

@ -45,31 +45,31 @@ const RATE_COLUMNS: CsvColumn[] = [
const BACKEND_METRIC_COLUMNS: CsvColumn[] = [
{
header: "看后搜率",
header: "秒思api-看后搜率",
readValue: (record: MarketRecord) =>
record.backendMetrics?.afterViewSearchRate ?? ""
},
{
header: "看后搜数",
header: "秒思api-看后搜数",
readValue: (record: MarketRecord) =>
record.backendMetrics?.afterViewSearchCount ?? ""
},
{
header: "新增A3数",
header: "秒思api-新增A3数",
readValue: (record: MarketRecord) =>
record.backendMetrics?.a3IncreaseCount ?? ""
},
{
header: "新增A3率",
header: "秒思api-新增A3率",
readValue: (record: MarketRecord) =>
record.backendMetrics?.newA3Rate ?? ""
},
{
header: "CPA3",
header: "秒思api-CPA3",
readValue: (record: MarketRecord) => record.backendMetrics?.cpa3 ?? ""
},
{
header: "cp_search",
header: "秒思api-cp_search",
readValue: (record: MarketRecord) => record.backendMetrics?.cpSearch ?? ""
}
];

View File

@ -91,11 +91,13 @@ describe("audience-profile-csv", () => {
expect(headerLine).toContain("达人信息,连接用户数");
expect(headerLine).not.toContain("抓取状态");
expect(headerLine).not.toContain("失败原因");
expect(headerLine).toContain("商业能力-个人视频-播放量中位数");
expect(headerLine).toContain("商业能力-星图视频-平均转发");
expect(headerLine).toContain("商业能力-1-20s视频-预期CPM");
expect(headerLine).toContain("商业能力-20-60s视频-爆文率");
expect(headerLine).toContain("商业能力-60s以上视频-预期播放量");
expect(headerLine).toContain("内容数据-个人视频-播放量中位数");
expect(headerLine).toContain("内容数据-星图视频-平均转发");
expect(headerLine).toContain("效果预估-1-20s视频-预期CPM");
expect(headerLine).toContain("效果预估-20-60s视频-爆文率");
expect(headerLine).toContain("效果预估-60s以上视频-预期播放量");
expect(headerLine).not.toContain("商业能力-个人视频-播放量中位数");
expect(headerLine).not.toContain("商业能力-20-60s视频-预期CPM");
expect(headerLine).toContain("观众画像-男性占比");
expect(headerLine).toContain("粉丝画像-女性占比");
expect(headerLine).not.toContain("铁粉画像-男性占比");
@ -110,10 +112,10 @@ describe("audience-profile-csv", () => {
expect(headerLine).not.toContain("兴趣TOP");
expect(rowLine).toContain("71.7%");
expect(rowLine).toContain("60%");
expect(readCsvValue(csv, "商业能力-个人视频-播放量中位数")).toBe("3738.4w");
expect(readCsvValue(csv, "商业能力-星图视频-平均转发")).toBe("68.4w");
expect(readCsvValue(csv, "商业能力-1-20s视频-预期CPM")).toBe("120.0");
expect(readCsvValue(csv, "商业能力-20-60s视频-爆文率")).toBe("缺失");
expect(readCsvValue(csv, "内容数据-个人视频-播放量中位数")).toBe("3738.4w");
expect(readCsvValue(csv, "内容数据-星图视频-平均转发")).toBe("68.4w");
expect(readCsvValue(csv, "效果预估-1-20s视频-预期CPM")).toBe("120.0");
expect(readCsvValue(csv, "效果预估-20-60s视频-爆文率")).toBe("缺失");
});
test("leaves distribution cells empty when profile loading fails", () => {

View File

@ -16,12 +16,12 @@ describe("csv-exporter", () => {
"21-60s报价",
"单视频看后搜率",
"个人视频看后搜率",
"看后搜率",
"看后搜数",
"新增A3数",
"新增A3率",
"CPA3",
"cp_search"
"秒思api-看后搜率",
"秒思api-看后搜数",
"秒思api-新增A3数",
"秒思api-新增A3率",
"秒思api-CPA3",
"秒思api-cp_search"
].join(",")
);
});
@ -61,12 +61,12 @@ describe("csv-exporter", () => {
"21-60s报价",
"单视频看后搜率",
"个人视频看后搜率",
"看后搜率",
"看后搜数",
"新增A3数",
"新增A3率",
"CPA3",
"cp_search"
"秒思api-看后搜率",
"秒思api-看后搜数",
"秒思api-新增A3数",
"秒思api-新增A3率",
"秒思api-CPA3",
"秒思api-cp_search"
].join(",")
);
expect(rowLine).toBe(
@ -96,12 +96,12 @@ describe("csv-exporter", () => {
"粉丝数",
"单视频看后搜率",
"个人视频看后搜率",
"看后搜率",
"看后搜数",
"新增A3数",
"新增A3率",
"CPA3",
"cp_search"
"秒思api-看后搜率",
"秒思api-看后搜数",
"秒思api-新增A3数",
"秒思api-新增A3率",
"秒思api-CPA3",
"秒思api-cp_search"
].join(",")
);
expect(rowLine).toBe("Alice,100w,,,,,,,,");