siluzan-tso-cli 1.1.14-beta.8 → 1.1.14-beta.9

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 CHANGED
@@ -51,7 +51,7 @@ siluzan-tso init -d /path/to/skills # 写入自定义目录
51
51
  siluzan-tso init --force # 强制覆盖已存在文件
52
52
  ```
53
53
 
54
- > **注意**:当前为测试版(1.1.14-beta.8),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
54
+ > **注意**:当前为测试版(1.1.14-beta.9),供内部测试使用。正式发布后安装命令将改为 `npm install -g siluzan-tso-cli`。
55
55
 
56
56
  | 助手 | 建议 `--ai` |
57
57
  | ----------------------- | ------------------------------------ |
package/dist/index.js CHANGED
@@ -7411,7 +7411,8 @@ async function runAdGroupCreate(opts) {
7411
7411
  campaignId: opts.campaignId,
7412
7412
  campaignName: opts.campaignName,
7413
7413
  manualCpc_EnhancedCpcEnabled: false,
7414
- maxCPCAmount: opts.maxCpc,
7414
+ // 用户传主币种金额,统一 toCentAmount 转「分」(与前端、adgroup-edit 一致)
7415
+ maxCPCAmount: toCentAmount(opts.maxCpc),
7415
7416
  name: opts.name,
7416
7417
  rotationMode: 1,
7417
7418
  statusV2: opts.status ?? "ENABLED",
@@ -13084,8 +13085,8 @@ adCmd.command("campaign-delete").description("\u5220\u9664\u5E7F\u544A\u7CFB\u52
13084
13085
  });
13085
13086
  adCmd.command("adgroup-create").description("\u5728\u5E7F\u544A\u7CFB\u5217\u4E0B\u521B\u5EFA\u641C\u7D22\u5E7F\u544A\u7EC4").requiredOption("-a, --account <id>", "Google \u8D26\u6237 mediaCustomerId").requiredOption("--campaign-id <id>", "\u6240\u5C5E\u5E7F\u544A\u7CFB\u5217 ID").requiredOption("--campaign-name <name>", "\u6240\u5C5E\u5E7F\u544A\u7CFB\u5217\u540D\u79F0").requiredOption("--name <name>", "\u5E7F\u544A\u7EC4\u540D\u79F0").requiredOption(
13086
13087
  "--max-cpc <amount>",
13087
- "\u6700\u9AD8\u5355\u6B21\u70B9\u51FB\u8D39\u7528\uFF08\u6700\u5C0F\u8D27\u5E01\u5355\u4F4D\uFF0C\u5982 100000 = 1 USD\uFF09",
13088
- parseInt
13088
+ "\u6700\u9AD8\u5355\u6B21\u70B9\u51FB\u8D39\u7528\uFF0C\u4E3B\u5E01\u79CD\u91D1\u989D\uFF08\u5982 1.5 \u8868\u793A \xA51.50\uFF1BCLI \u5185\u90E8 \xD7100 \u5199\u5165\u300C\u5206\u300D\uFF09",
13089
+ parseFloat
13089
13090
  ).option("--status <status>", "\u72B6\u6001\uFF1AENABLED | PAUSED\uFF08\u9ED8\u8BA4 ENABLED\uFF09", "ENABLED").option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
13090
13091
  async (opts) => {
13091
13092
  await runAdGroupCreate({
@@ -13507,7 +13508,10 @@ adCmd.command("keyword-delete").description("\u5220\u9664\u641C\u7D22\u5173\u952
13507
13508
  });
13508
13509
  }
13509
13510
  );
13510
- adCmd.command("keyword-edit").description("\u7F16\u8F91\u641C\u7D22\u5173\u952E\u8BCD\uFF08\u6570\u7EC4 body\uFF0C\u5148 list \u518D\u5408\u5E76\uFF09").requiredOption("-a, --account <id>", "Google \u8D26\u6237 mediaCustomerId").requiredOption("--id <keywordId>", "\u5173\u952E\u8BCD ID\uFF08\u6765\u81EA ad keywords --json \u2192 id\uFF09").option("--text <text>", "\u65B0\u5173\u952E\u8BCD\u6587\u672C\uFF08\u5199\u5165 keywordText \u6570\u7EC4\uFF09").option("--match-type <type>", "\u65B0\u5339\u914D\u7C7B\u578B\uFF1ABroad | Phrase | Exact\uFF08\u5199\u5165 matchTypeV2\uFF09").option("--max-cpc <n>", "\u6700\u9AD8\u6BCF\u6B21\u70B9\u51FB\u8D39\u7528 maxCPC\uFF08\u6570\u5B57\uFF0C0 \u8868\u793A\u6309\u5E73\u53F0/\u8BA1\u5212\u9ED8\u8BA4\uFF09").option("--final-url <url>", "\u5173\u952E\u8BCD\u7EA7\u6700\u7EC8\u5230\u8FBE\u7F51\u5740 finalURL").option("--start <date>", "\u5217\u8868\u67E5\u8BE2\u8D77\u59CB\u65E5\u671F YYYY-MM-DD").option("--end <date>", "\u5217\u8868\u67E5\u8BE2\u7ED3\u675F\u65E5\u671F YYYY-MM-DD").option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
13511
+ adCmd.command("keyword-edit").description("\u7F16\u8F91\u641C\u7D22\u5173\u952E\u8BCD\uFF08\u6570\u7EC4 body\uFF0C\u5148 list \u518D\u5408\u5E76\uFF09").requiredOption("-a, --account <id>", "Google \u8D26\u6237 mediaCustomerId").requiredOption("--id <keywordId>", "\u5173\u952E\u8BCD ID\uFF08\u6765\u81EA ad keywords --json \u2192 id\uFF09").option("--text <text>", "\u65B0\u5173\u952E\u8BCD\u6587\u672C\uFF08\u5199\u5165 keywordText \u6570\u7EC4\uFF09").option("--match-type <type>", "\u65B0\u5339\u914D\u7C7B\u578B\uFF1ABroad | Phrase | Exact\uFF08\u5199\u5165 matchTypeV2\uFF09").option(
13512
+ "--max-cpc <n>",
13513
+ "\u6700\u9AD8\u6BCF\u6B21\u70B9\u51FB\u8D39\u7528 maxCPC\uFF0C\u4E3B\u5E01\u79CD\u91D1\u989D\uFF08\u5982 5 \u8868\u793A \xA55\uFF1B\u26A0\uFE0F \u8FD9\u4E2A\u5B57\u6BB5\u540E\u7AEF\u5355\u4F4D\u5C31\u662F\u300C\u4E3B\u5E01\u79CD\u5143\u300D\uFF0CCLI \u76F4\u63A5\u900F\u4F20\u4E0D\u505A \xD7100\uFF0C\u4E0E budget / \u7EC4 maxCPCAmount \u4E0D\u540C\uFF1B0 \u8868\u793A\u6309\u5E73\u53F0/\u8BA1\u5212\u9ED8\u8BA4\uFF09"
13514
+ ).option("--final-url <url>", "\u5173\u952E\u8BCD\u7EA7\u6700\u7EC8\u5230\u8FBE\u7F51\u5740 finalURL").option("--start <date>", "\u5217\u8868\u67E5\u8BE2\u8D77\u59CB\u65E5\u671F YYYY-MM-DD").option("--end <date>", "\u5217\u8868\u67E5\u8BE2\u7ED3\u675F\u65E5\u671F YYYY-MM-DD").option("-t, --token <token>", "Auth Token").option("--verbose", "\u8BE6\u7EC6\u9519\u8BEF\u4FE1\u606F", false).action(
13511
13515
  async (opts) => {
13512
13516
  if (opts.matchType && !["Broad", "Phrase", "Exact"].includes(opts.matchType)) {
13513
13517
  console.error("\n\u274C --match-type \u53EA\u63A5\u53D7 Broad | Phrase | Exact\n");
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "slug": "siluzan-tso",
3
- "version": "1.1.14-beta.8",
4
- "publishedAt": 1777367679688
3
+ "version": "1.1.14-beta.9",
4
+ "publishedAt": 1777368873875
5
5
  }
@@ -200,36 +200,38 @@ siluzan-tso ad adgroup-create \
200
200
  --campaign-id <campaignId> \
201
201
  --campaign-name <campaignName> \
202
202
  --name <adGroupName> \
203
- --max-cpc <金额(微单位)>
203
+ --max-cpc <主币种金额>
204
204
  ```
205
205
 
206
- | 选项 | 说明 | 必填 |
207
- | ------------------------ | -------------------------------------------------- | ---- |
208
- | `-a, --account <id>` | Google mediaCustomerId | ✅ |
209
- | `--campaign-id <id>` | 所属广告系列 ID(来自 `campaigns --json`) | ✅ |
210
- | `--campaign-name <name>` | 所属广告系列名称 | ✅ |
211
- | `--name <name>` | 广告组名称 | ✅ |
212
- | `--max-cpc <amount>` | 最高 CPC 出价(最小货币单位,如 `100000` = 1 USD) | ✅ |
213
- | `--status <status>` | `ENABLED \| PAUSED`(默认 `ENABLED`) | |
206
+ > **金额单位**:`--max-cpc` **主币种金额**(如 `1.5` 表示 ¥1.50),CLI 内部 `Math.round(value × 100)` 写入「分」字段,与前端表单 `arithmetic.times(maxCPCAmount, 100)`、`ad adgroup-edit` 完全一致。**禁止** 按 Google micros(×1,000,000)填写。
207
+
208
+ | 选项 | 说明 | 必填 |
209
+ | ------------------------ | ---------------------------------------------------------- | ---- |
210
+ | `-a, --account <id>` | Google mediaCustomerId | ✅ |
211
+ | `--campaign-id <id>` | 所属广告系列 ID(来自 `campaigns --json`) | ✅ |
212
+ | `--campaign-name <name>` | 所属广告系列名称 | ✅ |
213
+ | `--name <name>` | 广告组名称 | |
214
+ | `--max-cpc <amount>` | 最高 CPC 出价,主币种金额(如 `1.5` = ¥1.50;CLI 内部 ×100)| ✅ |
215
+ | `--status <status>` | `ENABLED \| PAUSED`(默认 `ENABLED`) | |
214
216
 
215
217
  **示例:**
216
218
 
217
219
  ```bash
218
- # 在广告系列下创建广告组,最高 CPC 1 USD
220
+ # 在广告系列下创建广告组,最高 CPC ¥1
219
221
  siluzan-tso ad adgroup-create \
220
222
  -a 6326027735 \
221
223
  --campaign-id campaign_001 \
222
224
  --campaign-name "品牌推广_春季" \
223
225
  --name "核心词_跑步鞋" \
224
- --max-cpc 100000
226
+ --max-cpc 1
225
227
 
226
- # 创建时设为暂停状态
228
+ # 创建时设为暂停状态,最高 CPC ¥1.5
227
229
  siluzan-tso ad adgroup-create \
228
230
  -a 6326027735 \
229
231
  --campaign-id campaign_001 \
230
232
  --campaign-name "品牌推广_春季" \
231
233
  --name "竞品词" \
232
- --max-cpc 150000 \
234
+ --max-cpc 1.5 \
233
235
  --status PAUSED
234
236
  ```
235
237
 
@@ -958,6 +960,10 @@ siluzan-tso ad keyword-delete -a 6326027735 --id 2464982882313 --adgroup-id 1955
958
960
 
959
961
  与网页一致:**先** **`siluzan-tso ad keywords … --json`** 取该关键词完整对象,**再**用本命令提交修改;未改字段随列表结果保留。
960
962
 
963
+ > **⚠️ 金额单位(与系列 / 组的金额字段不同!)**:关键词的 `maxCPC` 字段单位是 **「主币种元」**(直接是元,不是「分」),CLI 直接透传 **不做 ×100 转换**。这与 `ad campaign-edit --budget` / `ad adgroup-edit --max-cpc` 等"用户传元、CLI 内部 ×100"的命令**口径相反**。
964
+ >
965
+ > 验证依据:前端 `KeywordList.vue:266` 用 `filterSpend(maxCPC)` 直接展示原值,对应 `useFormatter.js:86` 的 `filterSpend` 内部不 ÷100(对比 `filterBudget` 显式 ÷100)。
966
+
961
967
  ### `ad keywords --json` 常见键名与 CLI 选项(常用)
962
968
 
963
969
  | 列表 JSON 键名 | 说明 | CLI |
@@ -966,7 +972,7 @@ siluzan-tso ad keyword-delete -a 6326027735 --id 2464982882313 --adgroup-id 1955
966
972
  | `keywordText` | 关键词文案(数组,一般一项) | `--text` → `["..."]` |
967
973
  | `matchTypeV2` | 匹配类型(网页用 Broad / Phrase / Exact) | `--match-type` |
968
974
  | `matchType` | 另一套枚举(如 EXACT),列表里可能仍存在 | 一般随 list 结果保留,勿手改 |
969
- | `maxCPC` | 最高每次点击费用 | `--max-cpc` |
975
+ | `maxCPC` | 最高每次点击费用,**主币种金额**(直接是元,不要 ×100) | `--max-cpc` |
970
976
  | `finalURL` | 关键词级最终到达网址 | `--final-url` |
971
977
  | `adGroupId` / `campaignId` 等 | 层级与统计字段 | 从列表保留 |
972
978
 
@@ -1195,13 +1201,13 @@ siluzan-tso list-accounts -m Google --json -k [mediaCustomerId]
1195
1201
  siluzan-tso ad campaigns -a 6326027735 --json
1196
1202
  # 假设 campaignId = campaign_001,campaignName = "品牌推广_春季"
1197
1203
 
1198
- # 第四步:创建广告组(最高 CPC 1 USD = 100000 微单位)
1204
+ # 第四步:创建广告组(最高 CPC ¥1,主币种金额;CLI 内部 ×100 写入「分」)
1199
1205
  siluzan-tso ad adgroup-create \
1200
1206
  -a 6326027735 \
1201
1207
  --campaign-id campaign_001 \
1202
1208
  --campaign-name "品牌推广_春季" \
1203
1209
  --name "核心词_跑步鞋" \
1204
- --max-cpc 100000
1210
+ --max-cpc 1
1205
1211
 
1206
1212
  # 第五步:查询新建广告组 id
1207
1213
  siluzan-tso ad groups -a 6326027735 --json
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "siluzan-tso-cli",
3
- "version": "1.1.14-beta.8",
3
+ "version": "1.1.14-beta.9",
4
4
  "description": "Siluzan 广告账户管理 CLI — 查询账户、余额、消耗数据,管理绑定关系与充值。",
5
5
  "keywords": [
6
6
  "ad-account",