siluzan-tso-cli 1.1.59 → 1.1.60-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/index.js +25 -29
- package/dist/skill/_meta.json +2 -2
- package/dist/skill/assets/campaign-create-keyword-test.fixed.json +0 -6
- package/dist/skill/assets/campaign-create-keyword-test.json +0 -2
- package/dist/skill/assets/campaign-create-template.json +0 -2
- package/dist/skill/assets/campaign-create-template.md +0 -2
- package/dist/skill/assets/plan-extract.example.json +0 -2
- package/dist/skill/assets/scripts/assemble-campaign-from-plan.mjs +0 -2
- package/dist/skill/references/accounts/accounts-list.md +1 -1
- package/dist/skill/references/accounts/accounts-permissions.md +2 -2
- package/dist/skill/references/accounts/finance.md +1 -1
- package/dist/skill/references/accounts/open-account-by-media.md +1 -1
- package/dist/skill/references/accounts/open-account-google-ui.md +1 -1
- package/dist/skill/references/analytics/rag.md +1 -1
- package/dist/skill/references/analytics/reporting.md +5 -5
- package/dist/skill/references/core/setup.md +5 -5
- package/dist/skill/references/google-ads/rules/google-ads-launch-plan-template.md +1 -1
- package/dist/skill/references/misc/tso-home.md +2 -2
- package/dist/skill/references/report-templates/google-ads-diagnosis.md +3 -2
- package/dist/skill/report-templates/GoogleAdsDiagnosisReport.html +7 -5
- package/dist/skill/report-templates/bing-period-report.html +59 -2
- package/dist/skill/report-templates/google-ads-diagnosis.md +3 -2
- package/dist/skill/scripts/install.ps1 +3 -3
- package/dist/skill/scripts/install.sh +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -43,7 +43,7 @@ HTML 报告模板外部资源:**ECharts** 统一使用 `https://staticpn.siluz
|
|
|
43
43
|
在**用户的目标项目根目录**执行(根据用户使用的助手选择 `--ai`):
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
|
-
npm install -g siluzan-tso-cli
|
|
46
|
+
npm install -g siluzan-tso-cli@beta
|
|
47
47
|
siluzan-tso init --ai cursor # 写入 Cursor(默认)
|
|
48
48
|
siluzan-tso init --ai cursor,claude # 同时写入多个平台
|
|
49
49
|
siluzan-tso init --ai all # 写入所有支持的平台
|
|
@@ -51,6 +51,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
|
|
|
51
51
|
siluzan-tso init --force # 强制覆盖已存在文件
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
> **注意**:当前为测试版(1.1.60-beta.2),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
|
|
54
55
|
|
|
55
56
|
| 助手 | 建议 `--ai` |
|
|
56
57
|
| ----------------------- | ------------------------------------ |
|
package/dist/index.js
CHANGED
|
@@ -4051,7 +4051,7 @@ var DEFAULT_API_BASE;
|
|
|
4051
4051
|
var init_defaults = __esm({
|
|
4052
4052
|
"src/config/defaults.ts"() {
|
|
4053
4053
|
"use strict";
|
|
4054
|
-
DEFAULT_API_BASE = "https://tso-api.siluzan.com";
|
|
4054
|
+
DEFAULT_API_BASE = "https://tso-api-ci.siluzan.com";
|
|
4055
4055
|
}
|
|
4056
4056
|
});
|
|
4057
4057
|
|
|
@@ -116498,17 +116498,19 @@ function validateCampaignCreateConfigCore(cfg) {
|
|
|
116498
116498
|
}
|
|
116499
116499
|
validateLocationsFidelity(cfg, campaign, errors);
|
|
116500
116500
|
validateTargetedPlatforms(campaign, errors, warnings);
|
|
116501
|
-
|
|
116502
|
-
|
|
116503
|
-
|
|
116504
|
-
|
|
116505
|
-
|
|
116506
|
-
|
|
116507
|
-
|
|
116508
|
-
|
|
116509
|
-
|
|
116510
|
-
|
|
116511
|
-
|
|
116501
|
+
if (campaign["ChannelTypeV2"] !== "SEARCH") {
|
|
116502
|
+
const targetedLanguages = campaign["targetedLanguages"];
|
|
116503
|
+
if (!Array.isArray(targetedLanguages) || targetedLanguages.length === 0) {
|
|
116504
|
+
pushErr2(errors, "campaign.targetedLanguages \u4E0D\u80FD\u4E3A\u7A7A\uFF08\u82F1\u8BED id=1000\uFF0C\u4E2D\u6587 id=1017\uFF09");
|
|
116505
|
+
} else {
|
|
116506
|
+
for (let i = 0; i < targetedLanguages.length; i++) {
|
|
116507
|
+
const lang = targetedLanguages[i];
|
|
116508
|
+
if (!lang || lang["id"] === void 0 && lang["Id"] === void 0) {
|
|
116509
|
+
pushErr2(
|
|
116510
|
+
errors,
|
|
116511
|
+
`campaign.targetedLanguages[${i}] \u7F3A\u5C11 id \u5B57\u6BB5\uFF08\u540E\u7AEF BuildCampaignCriterion \u8BFB domainCriterion.Id \u6784\u5EFA ResourceNames.LanguageConstant\uFF09`
|
|
116512
|
+
);
|
|
116513
|
+
}
|
|
116512
116514
|
}
|
|
116513
116515
|
}
|
|
116514
116516
|
}
|
|
@@ -117117,6 +117119,11 @@ async function runAdCampaignCreate(opts) {
|
|
|
117117
117119
|
console.error("\n\u274C \u672A\u914D\u7F6E apiBaseUrl\uFF0C\u8BF7\u6267\u884C\uFF1Asiluzan-tso config set --api-base <URL>\n");
|
|
117118
117120
|
process.exit(1);
|
|
117119
117121
|
}
|
|
117122
|
+
const campaignForSubmit = cfg.campaign;
|
|
117123
|
+
if (campaignForSubmit["ChannelTypeV2"] === "SEARCH") {
|
|
117124
|
+
delete campaignForSubmit["targetedLanguages"];
|
|
117125
|
+
delete campaignForSubmit["TargetedLanguages"];
|
|
117126
|
+
}
|
|
117120
117127
|
const campaignWithCents = convertBatchMoneyTreeFromYuan(cfg.campaign);
|
|
117121
117128
|
const ext = campaignWithCents.ExtensionsForBatchJob;
|
|
117122
117129
|
if (Array.isArray(ext) && ext.length > 0) {
|
|
@@ -135530,11 +135537,8 @@ function hasAudienceRows(rows) {
|
|
|
135530
135537
|
return type === "UserList" || type === "CustomAudience" || type === "UserInterest" || type === "CustomIntent" || type === "CombinedAudience" || type === "CustomAffinity" || Number(row.impressions) > 0;
|
|
135531
135538
|
});
|
|
135532
135539
|
}
|
|
135533
|
-
function
|
|
135534
|
-
return rows.some((row) =>
|
|
135535
|
-
const type = String(row.typeV2 ?? "");
|
|
135536
|
-
return type === "RESPONSIVE_SEARCH_AD" || type === "EXPANDED_TEXT_AD";
|
|
135537
|
-
});
|
|
135540
|
+
function hasResponsiveSearchAdRows(rows) {
|
|
135541
|
+
return rows.some((row) => String(row.typeV2 ?? "") === "RESPONSIVE_SEARCH_AD");
|
|
135538
135542
|
}
|
|
135539
135543
|
function campaignsUseBidding(rows) {
|
|
135540
135544
|
return rows.some(
|
|
@@ -135564,22 +135568,14 @@ function reconcileGoldAccount(gold, evidence = {}) {
|
|
|
135564
135568
|
const audiences = evidence.audiences ?? [];
|
|
135565
135569
|
const ads = evidence.ads ?? [];
|
|
135566
135570
|
const presentBecause = (sentence) => `${NOT_QUALIFIED}\u3002${sentence}\u662F\u5426\u8FBE\u6807\u4E0D\u7531\u8BE5\u5BF9\u8C61\u662F\u5426\u5B58\u5728\u51B3\u5B9A\u3002`;
|
|
135567
|
-
const
|
|
135568
|
-
if (
|
|
135569
|
-
noteUnqualified(
|
|
135570
|
-
gold,
|
|
135571
|
-
suggestions,
|
|
135572
|
-
"expandedTextAdQualified",
|
|
135573
|
-
"\u6587\u5B57\u5E7F\u544A",
|
|
135574
|
-
textAdsPresent,
|
|
135575
|
-
presentBecause("\u8D26\u6237\u91CC\u5DF2\u6709\u641C\u7D22\u6587\u5B57\u5E7F\u544A\uFF0C")
|
|
135576
|
-
);
|
|
135571
|
+
const responsiveSearchAdsPresent = hasResponsiveSearchAdRows(ads) || gold.responsiveSearchAdQualified === true;
|
|
135572
|
+
if (responsiveSearchAdsPresent) notes.textAds = true;
|
|
135577
135573
|
noteUnqualified(
|
|
135578
135574
|
gold,
|
|
135579
135575
|
suggestions,
|
|
135580
135576
|
"responsiveSearchAdQualified",
|
|
135581
135577
|
"\u81EA\u9002\u5E94\u641C\u7D22\u5E7F\u544A",
|
|
135582
|
-
|
|
135578
|
+
hasResponsiveSearchAdRows(ads),
|
|
135583
135579
|
presentBecause("\u8D26\u6237\u91CC\u5DF2\u6709\u81EA\u9002\u5E94\u641C\u7D22\u5E7F\u544A\uFF0C")
|
|
135584
135580
|
);
|
|
135585
135581
|
const responsiveDisplay = displayAds(ads);
|
|
@@ -137180,7 +137176,7 @@ var GOLD_CLAIM_RULES = [
|
|
|
137180
137176
|
id: "text-ads-already-exist",
|
|
137181
137177
|
textPattern: /请创建文字广告|没有文字广告|缺少文字广告|未创建文字广告/,
|
|
137182
137178
|
isContradicted: (data) => goldAssetNoted(data, "textAds") || goldAccountFlag(data, "expandedTextAdQualified") === true || goldAccountFlag(data, "responsiveSearchAdQualified") === true,
|
|
137183
|
-
hint: "\
|
|
137179
|
+
hint: "\u641C\u7D22\u521B\u610F\u770B\u81EA\u9002\u5E94\u641C\u7D22\u5E7F\u544A\u3002\u62A5\u544A\u4E0D\u518D\u5355\u5217\u5DF2\u505C\u7528\u7684\u6587\u5B57\u5E7F\u544A\u3002\u7981\u6B62\u5199\u300C\u8BF7\u521B\u5EFA\u6587\u5B57\u5E7F\u544A\u300D\u3002"
|
|
137184
137180
|
},
|
|
137185
137181
|
{
|
|
137186
137182
|
id: "callout-already-exists",
|
package/dist/skill/_meta.json
CHANGED
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
"BudgetId": 0,
|
|
18
18
|
"BudgetBudgetDeliveryMethodV2": "STANDARD",
|
|
19
19
|
"TargetSpend_BidCeilingAmount": 2,
|
|
20
|
-
"ManualCpc_EnhancedCpcEnabled": false,
|
|
21
20
|
"TargetGoogleSearch": true,
|
|
22
21
|
"TargetSearchNetwork": false,
|
|
23
22
|
"TargetContentNetwork": false,
|
|
@@ -37,11 +36,6 @@
|
|
|
37
36
|
],
|
|
38
37
|
"excludedLocations": [],
|
|
39
38
|
"excludedIpAddresses": [],
|
|
40
|
-
"targetedLanguages": [
|
|
41
|
-
{
|
|
42
|
-
"id": 1000
|
|
43
|
-
}
|
|
44
|
-
],
|
|
45
39
|
"targetedPlatforms": [
|
|
46
40
|
{
|
|
47
41
|
"id": 30001,
|
|
@@ -35,7 +35,6 @@
|
|
|
35
35
|
"BudgetId": 0,
|
|
36
36
|
"BudgetBudgetDeliveryMethodV2": "STANDARD",
|
|
37
37
|
"TargetSpend_BidCeilingAmount": 2,
|
|
38
|
-
"ManualCpc_EnhancedCpcEnabled": false,
|
|
39
38
|
"TargetGoogleSearch": true,
|
|
40
39
|
"TargetSearchNetwork": false,
|
|
41
40
|
"TargetContentNetwork": false,
|
|
@@ -49,7 +48,6 @@
|
|
|
49
48
|
"targetedLocations": [{ "id": "2840", "bidModifier": 0, "bidModifierSpecified": false }],
|
|
50
49
|
"excludedLocations": [],
|
|
51
50
|
"excludedIpAddresses": [],
|
|
52
|
-
"targetedLanguages": [{ "id": 1000 }],
|
|
53
51
|
"targetedPlatforms": [
|
|
54
52
|
{ "id": 30001, "bidModifier": 0 },
|
|
55
53
|
{ "id": 30002, "bidModifier": 0 },
|
|
@@ -36,7 +36,6 @@
|
|
|
36
36
|
"BudgetId": 0,
|
|
37
37
|
"BudgetBudgetDeliveryMethodV2": "STANDARD",
|
|
38
38
|
"TargetSpend_BidCeilingAmount": 1.5,
|
|
39
|
-
"ManualCpc_EnhancedCpcEnabled": false,
|
|
40
39
|
"TargetGoogleSearch": true,
|
|
41
40
|
"TargetSearchNetwork": false,
|
|
42
41
|
"TargetContentNetwork": false,
|
|
@@ -50,7 +49,6 @@
|
|
|
50
49
|
"targetedLocations": [{ "id": "2840", "bidModifier": 0, "bidModifierSpecified": false }],
|
|
51
50
|
"excludedLocations": [],
|
|
52
51
|
"excludedIpAddresses": [],
|
|
53
|
-
"targetedLanguages": [{ "id": 1000 }],
|
|
54
52
|
"targetedPlatforms": [
|
|
55
53
|
{ "id": 30000, "bidModifier": 0 },
|
|
56
54
|
{ "id": 30001, "bidModifier": 0 },
|
|
@@ -162,7 +162,6 @@ siluzan-tso ad batch diff --batch-id <taskId> --config-file ./campaign.json --js
|
|
|
162
162
|
| `TargetSpend_BidCeilingAmount` | number | TARGET_SPEND 时 ✅ | 每次点击费用上限(元) |
|
|
163
163
|
| `TargetCpa_BidingAmount` | number | TARGET_CPA 时 ✅ | 目标 CPA(元) |
|
|
164
164
|
| `TargetRoas` | number | TARGET_ROAS 时 ✅ | 目标 ROAS(如 2.5 表示 250%) |
|
|
165
|
-
| `ManualCpc_EnhancedCpcEnabled` | boolean | | 是否增强 CPC |
|
|
166
165
|
|
|
167
166
|
### 网络(后端硬约束)
|
|
168
167
|
|
|
@@ -179,7 +178,6 @@ siluzan-tso ad batch diff --batch-id <taskId> --config-file ./campaign.json --js
|
|
|
179
178
|
| ----------------------- | ---------------------------------------- | :--: | ---------------------------------------------------------------------------------------- |
|
|
180
179
|
| `targetedLocations` | `{ id: string, bidModifier?: number }[]` | ✅ | 至少 1 个;**id 必须来自** `siluzan-tso ad geo search -a <acct> -q <地区名>`(禁止编造) |
|
|
181
180
|
| `excludedLocations` | 同上 | | 排除地区;**不得与 `targetedLocations` 有相同 id**(validate 报错;「刚果」等歧义地名 resolve 后须核对) |
|
|
182
|
-
| `targetedLanguages` | `{ id: number }[]` | ✅ | 英语 1000,中文 1017 |
|
|
183
181
|
| `targetedPlatforms` | `{ id: number, bidModifier?: number }[]` | | **30000 桌面 / 30001 移动 / 30002 平板**;`bidModifier` 为**百分比整数**(见下) |
|
|
184
182
|
| `excludedIpAddresses` | string[] | | 排除 IP |
|
|
185
183
|
| `PositiveGeoTargetType` | number | | |
|
|
@@ -6,9 +6,7 @@
|
|
|
6
6
|
"url": "https://www.example.com",
|
|
7
7
|
"budget": 100,
|
|
8
8
|
"biddingStrategyTypeV2": "MANUAL_CPC",
|
|
9
|
-
"manualCpcEnhancedCpcEnabled": false,
|
|
10
9
|
"maxCpcDefault": 5,
|
|
11
|
-
"languageId": 1000,
|
|
12
10
|
"startTime": "2026-07-15",
|
|
13
11
|
"endTime": "2037-12-30",
|
|
14
12
|
"locations": ["United States", "Canada"],
|
|
@@ -225,7 +225,6 @@ const campaign = {
|
|
|
225
225
|
BudgetShared: false,
|
|
226
226
|
BudgetId: 0,
|
|
227
227
|
BudgetBudgetDeliveryMethodV2: "STANDARD",
|
|
228
|
-
ManualCpc_EnhancedCpcEnabled: Boolean(plan.manualCpcEnhancedCpcEnabled ?? false),
|
|
229
228
|
TargetGoogleSearch: true,
|
|
230
229
|
TargetSearchNetwork: false,
|
|
231
230
|
TargetContentNetwork: false,
|
|
@@ -235,7 +234,6 @@ const campaign = {
|
|
|
235
234
|
targetedLocations: geo.targetedLocations,
|
|
236
235
|
excludedLocations: [],
|
|
237
236
|
excludedIpAddresses: [],
|
|
238
|
-
targetedLanguages: [{ id: Number(plan.languageId ?? 1000) }],
|
|
239
237
|
NegativeKeywordsForBatchJob: negBlocks,
|
|
240
238
|
ExtensionsForBatchJob: buildExtensions(plan.extensions, url),
|
|
241
239
|
AdGroupsForBatchJob: adGroups,
|
|
@@ -170,7 +170,7 @@ siluzan-tso account-history --start 2026-03-01 --end 2026-03-31 --json-out ./sna
|
|
|
170
170
|
| 状态 | 含义 | 下一步操作 |
|
|
171
171
|
| ---------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
172
172
|
| `Pending` | 审核中 | 等待,可反复运行此命令轮询;审核周期因媒体而异 |
|
|
173
|
-
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Yandex 当前没有对应充值界面) |
|
|
173
|
+
| `Approved` | 审核通过 | 运行 `list-accounts -m <媒体>` 确认账户已出现;引导用户充值激活(`config show` 取 `webUrl`,按 `finance.md` 打开对应媒体充值页;例如 Google 为 `https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google`;Yandex 当前没有对应充值界面) |
|
|
174
174
|
| `Rejected` | 被拒 | 查看 `--json-out` 落盘中的 `reason` 字段了解拒绝原因;修改资料后重新提交;若原因不明,引导用户联系丝路赞客服 |
|
|
175
175
|
|
|
176
176
|
---
|
|
@@ -490,7 +490,7 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
490
490
|
|
|
491
491
|
| 功能 | 媒体 | 网页路径 |
|
|
492
492
|
| --------------------------------------- | ------ | ------------------------------------------------- |
|
|
493
|
-
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
|
|
493
|
+
| **账户激活**(邀请他人激活 / 充值激活) | Google | `https://www-ci.siluzan.com/v3/foreign_trade/tso/manageAccounts` |
|
|
494
494
|
|
|
495
495
|
**Agent 建议话术**:
|
|
496
496
|
|
|
@@ -499,5 +499,5 @@ siluzan-tso account email-deauth -c <mediaCustomerId> --invitation-id <id> --res
|
|
|
499
499
|
siluzan-tso config show # 查看 webUrl 字段
|
|
500
500
|
|
|
501
501
|
# 账户激活(Google)→ 引导至账户管理页
|
|
502
|
-
# https://www.siluzan.com/v3/foreign_trade/tso/manageAccounts
|
|
502
|
+
# https://www-ci.siluzan.com/v3/foreign_trade/tso/manageAccounts
|
|
503
503
|
```
|
|
@@ -126,7 +126,7 @@ siluzan-tso config show
|
|
|
126
126
|
|
|
127
127
|
### 充值页链接(按媒体 × 类型)
|
|
128
128
|
|
|
129
|
-
链接模式:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/<page>?mediaType=<mediaType>`;丝路赞钱包:`https://www.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet`(无媒体参数)。
|
|
129
|
+
链接模式:`https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/<page>?mediaType=<mediaType>`;丝路赞钱包:`https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/siluzanWallet`(无媒体参数)。
|
|
130
130
|
|
|
131
131
|
| 充值类型 | `<page>` | 支持媒体(`mediaType` 参数) |
|
|
132
132
|
| ------------------------- | --------------------- | ------------------------------------------- |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 各媒体开户
|
|
2
2
|
|
|
3
|
-
> 网页链接:`https://www.siluzan.com/v3/foreign_trade/tso/accountOpeningHistory?tso=%2Fv3umijs%2Ftso%2FaccountOpeningHistory`
|
|
3
|
+
> 网页链接:`https://www-ci.siluzan.com/v3/foreign_trade/tso/accountOpeningHistory?tso=%2Fv3umijs%2Ftso%2FaccountOpeningHistory`
|
|
4
4
|
> 多命令串联见 `references/core/workflows.md` § 流程一。
|
|
5
5
|
|
|
6
6
|
## Contents
|
|
@@ -65,7 +65,7 @@ siluzan-tso open-account google-wizard
|
|
|
65
65
|
|
|
66
66
|
```bash
|
|
67
67
|
siluzan-tso account-history -m Google
|
|
68
|
-
# 审核通过后:config show → https://www.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
68
|
+
# 审核通过后:config show → https://www-ci.siluzan.com/v3/foreign_trade/tso/recharge/pay?mediaType=Google
|
|
69
69
|
```
|
|
70
70
|
|
|
71
71
|
---
|
|
@@ -190,9 +190,9 @@ siluzan-tso report push receive-emails -m Google [--json-out ./snap]
|
|
|
190
190
|
|
|
191
191
|
| 媒体 | 报告类型 | URL 模板 |
|
|
192
192
|
| ------ | ---------------- | ----------------------------------------------------------- |
|
|
193
|
-
| Google | 日报(Daily) | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
194
|
-
| Google | 小时报(Hourly) | `https://www.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
|
|
195
|
-
| TikTok | 日报 | `https://www.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
193
|
+
| Google | 日报(Daily) | `https://www-ci.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
194
|
+
| Google | 小时报(Hourly) | `https://www-ci.siluzan.com/media-report/hour/{entityId}?culture=zh-CN` |
|
|
195
|
+
| TikTok | 日报 | `https://www-ci.siluzan.com/media-report/publish/{entityId}?culture=zh-CN` |
|
|
196
196
|
|
|
197
197
|
`entityId` 来自 `siluzan-tso report list --json-out ./snap` 中每条记录的 `entityId` 字段。
|
|
198
198
|
|
|
@@ -205,8 +205,8 @@ siluzan-tso report list -m Google --json-out ./snap
|
|
|
205
205
|
|
|
206
206
|
# 第二步:查看 webUrl
|
|
207
207
|
siluzan-tso config show
|
|
208
|
-
# webUrl: https://www.siluzan.com
|
|
208
|
+
# webUrl: https://www-ci.siluzan.com
|
|
209
209
|
|
|
210
210
|
# 第三步:拼接链接(Google 日报)
|
|
211
|
-
# https://www.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
211
|
+
# https://www-ci.siluzan.com/media-report/publish/rpt_abc123?culture=zh-CN
|
|
212
212
|
```
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
## 安装 CLI
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
npm install -g siluzan-tso-cli
|
|
13
|
+
npm install -g siluzan-tso-cli@beta
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
---
|
|
@@ -64,7 +64,7 @@ siluzan-tso config set --api-key <Key> # 或 config 直接写入
|
|
|
64
64
|
siluzan-tso config set --token <Token> # 备用:设置 JWT Token
|
|
65
65
|
```
|
|
66
66
|
|
|
67
|
-
API Key 获取入口:`https://www.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
67
|
+
API Key 获取入口:`https://www-ci.siluzan.com/v3/foreign_trade/settings/apiKeyManagement`
|
|
68
68
|
|
|
69
69
|
```bash
|
|
70
70
|
# 第 1 步:让用户报出手机号后,立刻发码(命令立即返回,不会等待输入)
|
|
@@ -127,9 +127,9 @@ siluzan-tso config show
|
|
|
127
127
|
|
|
128
128
|
```
|
|
129
129
|
构建环境 : production
|
|
130
|
-
apiBaseUrl : https://tso-api.siluzan.com
|
|
131
|
-
googleApiUrl : https://googleapi.mysiluzan.com
|
|
132
|
-
webUrl : https://www.siluzan.com
|
|
130
|
+
apiBaseUrl : https://tso-api-ci.siluzan.com
|
|
131
|
+
googleApiUrl : https://googleapi-ci.mysiluzan.com
|
|
132
|
+
webUrl : https://www-ci.siluzan.com
|
|
133
133
|
apiKey : abcd****1234
|
|
134
134
|
```
|
|
135
135
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
| 日预算 | `campaign.Budget`(**元**,CLI 内部 ×100 转分) |
|
|
43
43
|
| 出价策略 / 上限 / tCPA | `campaign.BiddingStrategyTypeV2`、`campaign.TargetSpend_BidCeilingAmount`、`campaign.TargetCpa_BidingAmount`、`campaign.TargetRoas` |
|
|
44
44
|
| 投放地域 | `campaign.targetedLocations: [{ id: "<geoId>" }]`(**必须**先 `ad geo search` 取 id,禁止编造)、外层 `locations`(与 targetedLocations 同序同量) |
|
|
45
|
-
| 语言 | `campaign.targetedLanguages
|
|
45
|
+
| 语言 | 搜索广告不再提交 `campaign.targetedLanguages`。`DSALanguageCode` 仍是动态搜索广告语言,与广告系列语言不是同一个字段。 |
|
|
46
46
|
| 起止日期 | `campaign.StartTime`、`campaign.EndTime`(YYYY-MM-DD) |
|
|
47
47
|
| 落地页 | 外层 `url`;广告组级 `KeywordsForBatchJob[].FinalURL`、创意级 `AdsForBatchJob[].Finalurl` |
|
|
48
48
|
| 关键词 | `campaign.AdGroupsForBatchJob[].KeywordsForBatchJob`(`MatchTypeV2` + `KeywordText`) |
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
siluzan-tso config show # 取 webUrl
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
首页地址:`https://www.siluzan.com/v3/foreign_trade/tso/home`
|
|
9
|
+
首页地址:`https://www-ci.siluzan.com/v3/foreign_trade/tso/home`
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
@@ -25,7 +25,7 @@ siluzan-tso config show # 取 webUrl
|
|
|
25
25
|
|
|
26
26
|
## 推荐话术
|
|
27
27
|
|
|
28
|
-
1. **「和首页一样的总览」** → 打开 `https://www.siluzan.com/v3/foreign_trade/tso/home`。
|
|
28
|
+
1. **「和首页一样的总览」** → 打开 `https://www-ci.siluzan.com/v3/foreign_trade/tso/home`。
|
|
29
29
|
2. **「某个 Google 账户昨天花了多少」** → `list-accounts -m Google` + `stats -m Google -a <id>`。
|
|
30
30
|
3. **「有待充值账户」** → 说明聚合数据在首页;CLI 可 `list-accounts` + `balance` 逐户排查,或引导充值页。
|
|
31
31
|
|
|
@@ -335,7 +335,6 @@ siluzan-tso google-ads-diagnosis render \
|
|
|
335
335
|
| ------------------ | ----------- | -------- |
|
|
336
336
|
| 转化追踪设置 | 达标/未达标 | |
|
|
337
337
|
| G A与广告账户联结 | | |
|
|
338
|
-
| 文字广告 | | |
|
|
339
338
|
| 自适应搜索广告 | | |
|
|
340
339
|
| 自适应展示广告 | | |
|
|
341
340
|
| 附加结构化信息摘要 | | |
|
|
@@ -345,6 +344,8 @@ siluzan-tso google-ads-diagnosis render \
|
|
|
345
344
|
| 受众群体设置 | | |
|
|
346
345
|
| 出价策略 | | |
|
|
347
346
|
|
|
347
|
+
> 黄金账户表**不含**「文字广告」(`expandedTextAdQualified`,加大型文字广告已停用)。搜索创意只看「自适应搜索广告」(`responsiveSearchAdQualified`)。
|
|
348
|
+
>
|
|
348
349
|
> 黄金账户表**不含**「否定词添加」(`adsNegativeQualified`):collect 未拉取否词数据,render 会剥离该字段。
|
|
349
350
|
>
|
|
350
351
|
> 达标 / 未达标只看接口布尔值。明细里有 `RESPONSIVE_SEARCH_AD`、宣传信息、GA4 转化或受众,**不**把对应行改成达标。
|
|
@@ -353,7 +354,7 @@ siluzan-tso google-ads-diagnosis render \
|
|
|
353
354
|
>
|
|
354
355
|
> 自适应展示广告只挂在暂停系列上:保持未达标,建议写「已有自适应展示广告,所在展示系列已暂停,本期无消耗」,禁止写「请使用」。
|
|
355
356
|
|
|
356
|
-
|
|
357
|
+
**得分**:页面按 `goldAccountScore` 展示。接口原值仍含已停用的 `expandedTextAdQualified`(3 分);该项为 `true` 时,页面扣掉这 3 分。**未达标项数**按当前表内项目重算。
|
|
357
358
|
|
|
358
359
|
---
|
|
359
360
|
|
|
@@ -2096,7 +2096,7 @@
|
|
|
2096
2096
|
const GOLD_ACCOUNT_ITEMS = [
|
|
2097
2097
|
{ key: "conversionTrackingQualified", name: "转化追踪设置" },
|
|
2098
2098
|
{ key: "gaConfigured", name: "G A与广告账户联结" },
|
|
2099
|
-
|
|
2099
|
+
// expandedTextAdQualified 已停用,搜索创意只看自适应搜索广告
|
|
2100
2100
|
{ key: "responsiveSearchAdQualified", name: "自适应搜索广告" },
|
|
2101
2101
|
{
|
|
2102
2102
|
key: "multiAssetResponsiveDisplayAdQualified",
|
|
@@ -5001,10 +5001,12 @@
|
|
|
5001
5001
|
);
|
|
5002
5002
|
// 按当前展示项重算(已排除否词项),勿用可能含 adsNegativeQualified 的接口计数
|
|
5003
5003
|
const unqualifiedCount = totalItems - qualifiedCount;
|
|
5004
|
-
|
|
5005
|
-
|
|
5006
|
-
|
|
5007
|
-
|
|
5004
|
+
// 接口得分仍含已停用的 expandedTextAdQualified(3 分)。展示时扣掉,只保留自适应搜索广告。
|
|
5005
|
+
const rawScore = Number(goldAccount.goldAccountScore);
|
|
5006
|
+
const legacyTextAdPoints = goldAccount.expandedTextAdQualified === true ? 3 : 0;
|
|
5007
|
+
const scoreValue = Number.isFinite(rawScore)
|
|
5008
|
+
? String(Math.max(0, rawScore - legacyTextAdPoints))
|
|
5009
|
+
: "--";
|
|
5008
5010
|
|
|
5009
5011
|
const goldItemSuggestions = goldAccount.goldItemSuggestions || {};
|
|
5010
5012
|
const goldAccountRows = GOLD_ACCOUNT_ITEMS.map((item) => {
|
|
@@ -360,10 +360,34 @@
|
|
|
360
360
|
.table-wrap {
|
|
361
361
|
border: 1px solid var(--border);
|
|
362
362
|
border-radius: var(--radius-md);
|
|
363
|
-
|
|
363
|
+
/* 列多时在表内横向滚动,避免右侧指标被裁掉 */
|
|
364
|
+
overflow-x: auto;
|
|
365
|
+
-webkit-overflow-scrolling: touch;
|
|
366
|
+
scrollbar-width: thin;
|
|
367
|
+
scrollbar-color: #94a3b8 transparent;
|
|
368
|
+
}
|
|
369
|
+
.table-wrap::-webkit-scrollbar {
|
|
370
|
+
height: 8px;
|
|
371
|
+
}
|
|
372
|
+
.table-wrap::-webkit-scrollbar-thumb {
|
|
373
|
+
background: #94a3b8;
|
|
374
|
+
border-radius: 8px;
|
|
375
|
+
}
|
|
376
|
+
.table-wrap.is-scrollable {
|
|
377
|
+
box-shadow: inset -16px 0 12px -14px rgba(15, 23, 42, 0.28);
|
|
378
|
+
}
|
|
379
|
+
.table-wrap.is-scrollable::after {
|
|
380
|
+
content: "左右滑动查看其余列";
|
|
381
|
+
position: sticky;
|
|
382
|
+
left: 0;
|
|
383
|
+
display: block;
|
|
384
|
+
padding: 6px 12px 8px;
|
|
385
|
+
font-size: 0.75rem;
|
|
386
|
+
color: var(--muted);
|
|
364
387
|
}
|
|
365
388
|
table {
|
|
366
|
-
width:
|
|
389
|
+
width: max-content;
|
|
390
|
+
min-width: 100%;
|
|
367
391
|
border-collapse: collapse;
|
|
368
392
|
font-size: 0.86rem;
|
|
369
393
|
}
|
|
@@ -374,6 +398,14 @@
|
|
|
374
398
|
border-bottom: 1px solid var(--border);
|
|
375
399
|
white-space: nowrap;
|
|
376
400
|
}
|
|
401
|
+
/* 名称列换行,避免一条长标题把消耗/点击/转化挤出视口 */
|
|
402
|
+
th:not(.num),
|
|
403
|
+
td:not(.num) {
|
|
404
|
+
white-space: normal;
|
|
405
|
+
word-break: break-word;
|
|
406
|
+
min-width: 6em;
|
|
407
|
+
max-width: 18em;
|
|
408
|
+
}
|
|
377
409
|
td {
|
|
378
410
|
color: var(--text-dim);
|
|
379
411
|
}
|
|
@@ -592,6 +624,19 @@
|
|
|
592
624
|
display: none !important;
|
|
593
625
|
content: none !important;
|
|
594
626
|
}
|
|
627
|
+
.table-wrap {
|
|
628
|
+
overflow: visible;
|
|
629
|
+
}
|
|
630
|
+
.table-wrap table {
|
|
631
|
+
width: 100%;
|
|
632
|
+
}
|
|
633
|
+
th:not(.num),
|
|
634
|
+
td:not(.num),
|
|
635
|
+
th.num,
|
|
636
|
+
td.num {
|
|
637
|
+
white-space: normal;
|
|
638
|
+
max-width: none;
|
|
639
|
+
}
|
|
595
640
|
}
|
|
596
641
|
</style>
|
|
597
642
|
</head>
|
|
@@ -1354,6 +1399,18 @@ ${titleNotice}
|
|
|
1354
1399
|
].join("\n");
|
|
1355
1400
|
renderCharts(data);
|
|
1356
1401
|
setupScrollSpy();
|
|
1402
|
+
markScrollableTables();
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
/** 表格比视口宽时标出来,提示左右滑动,避免右侧指标被看成「没有」。 */
|
|
1406
|
+
function markScrollableTables() {
|
|
1407
|
+
const mark = () => {
|
|
1408
|
+
document.querySelectorAll(".table-wrap").forEach((el) => {
|
|
1409
|
+
el.classList.toggle("is-scrollable", el.scrollWidth > el.clientWidth + 1);
|
|
1410
|
+
});
|
|
1411
|
+
};
|
|
1412
|
+
mark();
|
|
1413
|
+
window.addEventListener("resize", mark);
|
|
1357
1414
|
}
|
|
1358
1415
|
|
|
1359
1416
|
if (document.readyState === "loading") {
|
|
@@ -335,7 +335,6 @@ siluzan-tso google-ads-diagnosis render \
|
|
|
335
335
|
| ------------------ | ----------- | -------- |
|
|
336
336
|
| 转化追踪设置 | 达标/未达标 | |
|
|
337
337
|
| G A与广告账户联结 | | |
|
|
338
|
-
| 文字广告 | | |
|
|
339
338
|
| 自适应搜索广告 | | |
|
|
340
339
|
| 自适应展示广告 | | |
|
|
341
340
|
| 附加结构化信息摘要 | | |
|
|
@@ -345,6 +344,8 @@ siluzan-tso google-ads-diagnosis render \
|
|
|
345
344
|
| 受众群体设置 | | |
|
|
346
345
|
| 出价策略 | | |
|
|
347
346
|
|
|
347
|
+
> 黄金账户表**不含**「文字广告」(`expandedTextAdQualified`,加大型文字广告已停用)。搜索创意只看「自适应搜索广告」(`responsiveSearchAdQualified`)。
|
|
348
|
+
>
|
|
348
349
|
> 黄金账户表**不含**「否定词添加」(`adsNegativeQualified`):collect 未拉取否词数据,render 会剥离该字段。
|
|
349
350
|
>
|
|
350
351
|
> 达标 / 未达标只看接口布尔值。明细里有 `RESPONSIVE_SEARCH_AD`、宣传信息、GA4 转化或受众,**不**把对应行改成达标。
|
|
@@ -353,7 +354,7 @@ siluzan-tso google-ads-diagnosis render \
|
|
|
353
354
|
>
|
|
354
355
|
> 自适应展示广告只挂在暂停系列上:保持未达标,建议写「已有自适应展示广告,所在展示系列已暂停,本期无消耗」,禁止写「请使用」。
|
|
355
356
|
|
|
356
|
-
|
|
357
|
+
**得分**:页面按 `goldAccountScore` 展示。接口原值仍含已停用的 `expandedTextAdQualified`(3 分);该项为 `true` 时,页面扣掉这 3 分。**未达标项数**按当前表内项目重算。
|
|
357
358
|
|
|
358
359
|
---
|
|
359
360
|
|
|
@@ -9,11 +9,11 @@ $ErrorActionPreference = 'Stop'
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
$PKG_NAME = 'siluzan-tso-cli'
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
$PKG_VERSION = '1.1.
|
|
12
|
+
$PKG_VERSION = '1.1.60-beta.2'
|
|
13
13
|
$CLI_BIN = 'siluzan-tso'
|
|
14
14
|
$SKILL_LABEL = 'Siluzan TSO'
|
|
15
|
-
$INSTALL_CMD = 'npm install -g siluzan-tso-cli'
|
|
16
|
-
$WEB_BASE = 'https://www.siluzan.com'
|
|
15
|
+
$INSTALL_CMD = 'npm install -g siluzan-tso-cli@beta'
|
|
16
|
+
$WEB_BASE = 'https://www-ci.siluzan.com'
|
|
17
17
|
|
|
18
18
|
# -- Constants ----------------------------------------------------------------
|
|
19
19
|
$NODE_MAJOR_MIN = 18
|
|
@@ -9,11 +9,11 @@ set -euo pipefail
|
|
|
9
9
|
# -- Package info (injected at build time) ------------------------------------
|
|
10
10
|
readonly PKG_NAME="siluzan-tso-cli"
|
|
11
11
|
# PKG_VERSION 锁定到与本脚本同批构建产物一致的版本,避免与 dist/skill 错位
|
|
12
|
-
readonly PKG_VERSION="1.1.
|
|
12
|
+
readonly PKG_VERSION="1.1.60-beta.2"
|
|
13
13
|
readonly CLI_BIN="siluzan-tso"
|
|
14
14
|
readonly SKILL_LABEL="Siluzan TSO"
|
|
15
|
-
readonly INSTALL_CMD="npm install -g siluzan-tso-cli"
|
|
16
|
-
readonly WEB_BASE="https://www.siluzan.com"
|
|
15
|
+
readonly INSTALL_CMD="npm install -g siluzan-tso-cli@beta"
|
|
16
|
+
readonly WEB_BASE="https://www-ci.siluzan.com"
|
|
17
17
|
|
|
18
18
|
# -- Constants ----------------------------------------------------------------
|
|
19
19
|
readonly NODE_MAJOR_MIN=18
|