@bluevs/vhcli 0.5.7 → 0.5.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/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@bluevs/vhcli",
3
- "version": "0.5.7",
3
+ "version": "0.5.9",
4
4
  "description": "Vision Hub CLI - query projects and resources, designed for AI Agent and developers",
5
5
  "bin": {
6
6
  "vhcli": "scripts/run.js"
7
7
  },
8
8
  "scripts": {},
9
9
  "optionalDependencies": {
10
- "@bluevs/vhcli-darwin-arm64": "0.5.7",
11
- "@bluevs/vhcli-darwin-x64": "0.5.7",
12
- "@bluevs/vhcli-linux-arm64": "0.5.7",
13
- "@bluevs/vhcli-linux-x64": "0.5.7",
14
- "@bluevs/vhcli-win32-arm64": "0.5.7",
15
- "@bluevs/vhcli-win32-x64": "0.5.7"
10
+ "@bluevs/vhcli-darwin-arm64": "0.5.9",
11
+ "@bluevs/vhcli-darwin-x64": "0.5.9",
12
+ "@bluevs/vhcli-linux-arm64": "0.5.9",
13
+ "@bluevs/vhcli-linux-x64": "0.5.9",
14
+ "@bluevs/vhcli-win32-arm64": "0.5.9",
15
+ "@bluevs/vhcli-win32-x64": "0.5.9"
16
16
  },
17
17
  "engines": {
18
18
  "node": ">=16"
@@ -23,6 +23,7 @@
23
23
  },
24
24
  "license": "MIT",
25
25
  "files": [
26
- "scripts/run.js"
26
+ "scripts/run.js",
27
+ "skill/"
27
28
  ]
28
29
  }
package/skill/SKILL.md ADDED
@@ -0,0 +1,383 @@
1
+ ---
2
+ name: vh-skill
3
+ description: VH AI营销平台 - 授权管理、项目操作、广告账户管理、素材报表、媒体平台操作。通过 vhcli CLI 与 VH 平台交互。
4
+ ---
5
+
6
+ # VH SKILL - AI营销平台操作
7
+
8
+ > VH平台(又称「AI营销平台」)的 CLI 工具。覆盖授权、项目管理、广告账户、素材报表、媒体平台操作。
9
+
10
+ ---
11
+
12
+ ## 安装
13
+
14
+ ```bash
15
+ npm install -g @bluevs/vhcli
16
+ ```
17
+
18
+ ### 环境检测与自动安装
19
+
20
+ ```bash
21
+ bash skills/vhcli/scripts/install-skill.sh
22
+ ```
23
+
24
+ 双向检测逻辑:
25
+
26
+ | 场景 | 检测 | 动作 |
27
+ |------|------|------|
28
+ | 先装了 skill,没有 vhcli CLI | `which vhcli` | 自动 `npm install -g @bluevs/vhcli` |
29
+ | 先装了 vhcli,没有 skill | 检测 npm 包内 `skill/` 目录 | 同步到 workspace |
30
+ | 两者都在 + 版本一致 | 比对版本号 | 跳过 |
31
+ | 两者都在 + 版本不同 | 比对版本号 | 同步新版(不覆盖本地 scripts/ 定制) |
32
+
33
+ 首次使用或升级时运行一次即可,后续无需重复执行。
34
+
35
+ ---
36
+
37
+ ## 架构概览
38
+
39
+ ```
40
+ 用户需求
41
+
42
+
43
+ ┌─────────────────────────────┐
44
+ │ 执行前必检流程(见下方) │
45
+ └──────────────┬──────────────┘
46
+
47
+ ┌─────────┼─────────┐
48
+ ▼ ▼ ▼
49
+ 第一层 第二层 第三层
50
+ 平台授权 账户Token 下游操作
51
+ auth project media/google/
52
+ login account- material-report
53
+ token
54
+ ```
55
+
56
+ ---
57
+
58
+ ## 🚨 执行前必检流程(每次操作必须走完)
59
+
60
+ ### Step 1:确认平台用户授权
61
+
62
+ ```bash
63
+ vhcli auth token
64
+ ```
65
+ - 有 token → 继续
66
+ - 无 token → 发起授权(飞书场景用卡片脚本)
67
+
68
+ ### Step 2:查项目列表,引导用户确认项目
69
+
70
+ ```bash
71
+ vhcli project list
72
+ ```
73
+ **⚠️ 即使只有一个项目,也必须让用户确认!**
74
+
75
+ ### Step 3:查项目下广告账户,引导用户确认账户
76
+
77
+ ```bash
78
+ vhcli project accounts --project-id <project_id>
79
+ ```
80
+ **⚠️ 必须让用户确认要操作哪个广告账户!**
81
+
82
+ ### Step 4:初始化该账户的 token 到本地
83
+
84
+ ```bash
85
+ vhcli project account-token --customer-project-id <数字ID> --account-id <账户ID>
86
+ ```
87
+
88
+ ### Step 5:使用 token 进行下游操作
89
+
90
+ 从 `~/.vhcli/ad_tokens.json` 读取对应账户的 token。
91
+
92
+ ### 切换账户
93
+
94
+ 回到 Step 3 → 确认新账户 → 重新 account-token → 继续。
95
+
96
+ ---
97
+
98
+ ## 🚨 铁律:禁止用记忆/缓存冒充实时数据
99
+
100
+ 1. **任何平台数据必须实时查询**,不得用记忆中的旧数据当作查询结果
101
+ 2. 授权过期时立刻发起授权流程
102
+ 3. 记忆中的数据只能作为"提示/参考"
103
+
104
+ ---
105
+
106
+ ## 模块文档索引
107
+
108
+ | 模块 | 文件 | 说明 |
109
+ |------|------|------|
110
+ | 认证 | [docs/auth.md](docs/auth.md) | 平台用户授权(Device Flow) |
111
+ | 项目 | [docs/project.md](docs/project.md) | 项目查询、账户管理、成员管理、配置、开关 |
112
+ | Google | [docs/google.md](docs/google.md) | Google Ads 直接操作 |
113
+ | 素材报表 | [docs/material-report.md](docs/material-report.md) | 素材报表、归因报表、广告预览 |
114
+ | Agent 日志 | [docs/agent.md](docs/agent.md) | 操作记录审计 |
115
+ | 公司/产品 | [docs/company.md](docs/company.md) | 客户公司和产品查询 |
116
+ | TikTok 广告创编 | [docs/tiktok.md](docs/tiktok.md) | 项目级创编任务、表单下拉选项、Spark Ads 授权 |
117
+
118
+ ---
119
+
120
+ ## Token 存储
121
+
122
+ | 文件 | 内容 |
123
+ |------|------|
124
+ | `~/.vhcli/config.yaml` | 平台 server URL、app_id、token |
125
+ | `~/.vhcli/ad_tokens.json` | 各广告账户的 access_token |
126
+
127
+ ### ad_tokens.json 结构
128
+
129
+ ```json
130
+ {
131
+ "<customer_project_id>": {
132
+ "<account_id>": {
133
+ "token": "***",
134
+ "updated_at": "2026-05-19T10:35:53+08:00"
135
+ }
136
+ }
137
+ }
138
+ ```
139
+
140
+ ---
141
+
142
+ ## 飞书授权卡片
143
+
144
+ 位置:`scripts/vh-auth-card.cjs`
145
+
146
+ ```bash
147
+ # 显式传入 target(可选,支持任意格式)
148
+ node skills/vhcli/scripts/vh-auth-card.cjs <oc_xxx|ou_xxx|user:ou_xxx>
149
+
150
+ # 或通过环境变量传入
151
+ OPENCLAW_CHAT_ID=user:ou_xxx node skills/vhcli/scripts/vh-auth-card.cjs
152
+ ```
153
+
154
+ **Target 解析优先级(脚本内置逻辑):**
155
+ 1. `argv[2]` - 显式参数(最高优先)
156
+ 2. `VH_AUTH_TARGET` 环境变量
157
+ 3. `OPENCLAW_CHAT_ID` 环境变量(Agent spawn 时自动传入当前会话 chat_id)
158
+
159
+ **格式自动解析:**
160
+ - `oc_xxx` → 识别为群聊 chat_id
161
+ - `ou_xxx` → 识别为 open_id
162
+ - `user:ou_xxx` → 去掉前缀,取 open_id
163
+
164
+ 自动完成:获取 device code → 发蓝色卡片 → 等待授权 → patch 卡片变色
165
+
166
+ ### Agent 授权交互模式(必须遵守)
167
+
168
+ **核心原则:在哪个会话触发的授权,就把授权卡片发到哪个会话。**
169
+
170
+ #### Target 自动解析规则
171
+
172
+ 从当前 inbound message 的 `chat_id` 字段提取 target:
173
+ - 群聊:`chat_id` 已是 `oc_xxx` → 直接用
174
+ - 私聊:`chat_id` 格式为 `user:ou_xxx` → 去掉 `user:` 前缀,取 `ou_xxx`
175
+
176
+ **Agent 禁止硬编码 target!必须从当前会话上下文动态提取。**
177
+
178
+ 当需要发起授权时,使用 **subagent 方案**:
179
+
180
+ 1. **主 agent 只发一句话**:"已发起授权,飞书会收到授权卡片,点击完成授权后我继续。"
181
+ 2. **spawn subagent** 执行授权脚本:
182
+ ```
183
+ sessions_spawn(mode="run", lightContext=true, task=执行授权脚本并只输出"授权成功"或"授权失败")
184
+ ```
185
+ subagent 任务内容:
186
+ ```bash
187
+ cd /root/.openclaw/workspace && node skills/vhcli/scripts/vh-auth-card.cjs <当前会话的原始chat_id,如 oc_xxx 或 user:ou_xxx,脚本自动解析>
188
+ ```
189
+ 3. **主 agent yield 等待** subagent announce
190
+ 4. **subagent announce 回来后**,主 agent 继续执行用户原始需求
191
+
192
+ #### subagent 严格约束
193
+
194
+ - subagent **只做授权**,不执行任何业务操作
195
+ - subagent 的最终输出(announce 内容)**只允许两种**:
196
+ - `授权成功`
197
+ - `授权失败`
198
+ - 不发消息给用户,不解释过程,不输出其他任何内容
199
+
200
+ #### 主 agent 严格约束
201
+
202
+ - 检测到未授权时,**只发一句话**:"已发起授权,飞书会收到授权卡片,点击完成授权后我继续。"
203
+ - ❌ 禁止发多余的过程描述(如"先帮你查一下"、"正在发起授权"等)
204
+ - ❌ 禁止在授权前后发超过必要的消息
205
+ - 授权成功后直接执行业务,输出结果即可
206
+
207
+ 用户体验顺序:
208
+ ```
209
+ 1 主agent: "已发起授权,飞书会收到授权卡片,点击完成授权后我继续。"
210
+ 2 脚本自动发: 文字"请先完成AI营销平台授权" + 蓝色授权卡片
211
+ 3 用户点击完成授权 → 卡片变绿 + "授权成功,可以开始使用了"
212
+ 4 主agent: 直接输出业务结果
213
+ ```
214
+
215
+ ❗ 禁止:
216
+ - 清除 token(auth login 本身会覆盖)
217
+ - 暴露内部操作过程
218
+ - 在授权脚本内耦合业务逻辑
219
+ - 主 agent 发超过一句话的授权提示
220
+
221
+ ---
222
+
223
+ ## 清理授权
224
+
225
+ ```bash
226
+ # 第一层:清除 vhcli 平台 token
227
+ sed -i '/^token:/d; /^token_type:/d' ~/.vhcli/config.yaml
228
+
229
+ # 第二层:清除账户 token
230
+ rm -f ~/.vhcli/ad_tokens.json
231
+
232
+ # 第三层:清除环境变量
233
+ unset ACCESS_TOKEN
234
+ ```
235
+
236
+ ---
237
+
238
+ ## TikTok 广告创编
239
+
240
+ `vhcli tiktok ...` 驱动 TikTok 广告创编流水线,与 `vhcli media tiktok`(需 `--auth-id`)不同,这里以项目(`--project-id`)为入口,使用 api-key 鉴权。
241
+
242
+ > 完整数据模型、字段映射、错误目录:[docs/tiktok.md](docs/tiktok.md)
243
+
244
+ ### 三层配置(`task submit --config-file`)
245
+
246
+ JSON 顶层包含 `campaign_config` / `adgroup_config` / `ad_config` 三个动态对象:
247
+
248
+ | 层 | 已知字段 |
249
+ |----|---------|
250
+ | `campaign_config` | `campaign_name`, `budget`, `objective_type`, `app_promotion_type` |
251
+ | `adgroup_config` | `adgroup_name`, `location_ids`, `languages`, `app_id`, `gender` |
252
+ | `ad_config` | `ad_name`, `tiktok_account`, `identity_type`, `user_material`, `copywriting`, `selling_points` |
253
+
254
+ 其他 TikTok Marketing API 字段(如 `optimization_goal`、`interest_keyword_ids`、`landing_page_url`、`dark_post_status`)自动路由到对应层的 `extra_params`,无需 CLI 发版。
255
+
256
+ ### 典型工作流
257
+
258
+ 1. **并行**获取元数据:`options --type=identity|app|region|language|minis|audience`、`targeting-search`、`optimization-event`
259
+ 2. 预校验:提交前调用 `dark-post-status`(若 advertiser 或 identity 有 `ads_only_mode=true`,只允许 `dark_post_status=ON`)
260
+ 3. 组装三层 JSON;用唯一 UUID `--request-id` 提交(10 分钟幂等锁,重复 ID 被拒绝)
261
+ 4. 加 `--follow` 轮询最新任务至非 `PENDING`(`submit` 本身不返回 `task_id`)
262
+
263
+ ### 命令
264
+
265
+ ```bash
266
+ # 1) 列出创编任务
267
+ vhcli tiktok task list --project-id po_xxxx [--page-size 10] [--page-number 1]
268
+
269
+ # 2) 提交创编任务(10 分钟幂等锁)
270
+ vhcli tiktok task submit \
271
+ --project-id po_xxxx \
272
+ --resource-id 7234567890123456789 \
273
+ --request-id req_20260521_001 \
274
+ [--creative-app-id app_demo_001] \
275
+ --config-file ./payload.json \
276
+ [--follow] # 每 5s 轮询最新任务至非 PENDING,超时 5 分钟
277
+
278
+ # payload.json 示例
279
+ # {
280
+ # "campaign_config": { "campaign_name": "Demo", "objective_type": "APP_PROMOTION" },
281
+ # "adgroup_config": { "adgroup_name": "Demo", "location_ids": "6252001" },
282
+ # "ad_config": { "ad_name": "Demo", "tiktok_account": "..." }
283
+ # }
284
+
285
+ # 3) 表单下拉(--type 决定返回元素结构)
286
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type language
287
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type region --objective-type APP_PROMOTION --language zh
288
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type identity
289
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type minis
290
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type app
291
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type audience
292
+
293
+ # 4) 校验 dark_post_status(设置 ad_config.dark_post_status 前必须调用)
294
+ vhcli tiktok dark-post-status \
295
+ --project-id po_xxxx \
296
+ --resource-id 7234567890123456789 \
297
+ --identity-id 7888888888888888888 \
298
+ --identity-type CUSTOMIZED_USER \
299
+ [--identity-authorized-bc-id BC_xxx] # identity_type=BC_AUTH_TT 时必填
300
+
301
+ # 5) 优化事件(仅返回 availability_status=READY;--placements 支持逗号分隔或重复传)
302
+ vhcli tiktok optimization-event \
303
+ --project-id po_xxxx \
304
+ --resource-id 7234567890123456789 \
305
+ --app-id 7234567890123456789 \
306
+ --objective APP_PROMOTION \
307
+ --optimization-goal CONVERT \
308
+ --placements PLACEMENT_TIKTOK,PLACEMENT_PANGLE
309
+
310
+ # 6) 兴趣定向树(INTEREST_AND_BEHAVIOR,按顶级分组:video_interaction / general_interest / ...)
311
+ vhcli tiktok targeting-search \
312
+ --project-id po_xxxx \
313
+ --resource-id 7234567890123456789
314
+
315
+ # 7) 批量授权 Spark Ads 帖子(服务端上限 50 并发;返回 identity_id 不匹配或失败的 auth_codes)
316
+ vhcli tiktok spark-ads authorize \
317
+ --project-id po_xxxx \
318
+ --resource-id 7234567890123456789 \
319
+ --tiktok-account 7234567890123456789 \
320
+ --auth-codes "AUTHCODE_AAAA,AUTHCODE_BBBB,AUTHCODE_CCCC"
321
+ ```
322
+
323
+ ---
324
+
325
+ ## 命令速查
326
+
327
+ ```bash
328
+ # 认证
329
+ vhcli auth login # 平台授权
330
+ vhcli auth token # 查看 token
331
+ vhcli config # 完整配置
332
+
333
+ # 项目
334
+ vhcli project list # 项目列表
335
+ vhcli project info --project-id <po_xxx>
336
+ vhcli project accounts --project-id <po_xxx> [--platform-list Meta]
337
+ vhcli project account-token --customer-project-id <N> --account-id <ID>
338
+
339
+ # 授权
340
+ vhcli authorization list [--platform Meta]
341
+
342
+ # 媒体操作
343
+ vhcli media campaign-list --auth-id <N>
344
+ vhcli media ad-list --auth-id <N>
345
+ vhcli media report-get --auth-id <N> --start-date X --end-date Y
346
+
347
+ # 报表
348
+ vhcli material-report get --customer-project-id <N> --platform Meta --start-time X --end-time Y
349
+
350
+ # Google
351
+ vhcli google update-campaign-budget --customer-project-id <N> --account-id <ID> --campaign-id <ID> --target-budget 100
352
+
353
+ # Agent 日志
354
+ vhcli agent operate-record --customer-project-id <N> --account-id <ID> --operator x@x.com --operation-type CREATE --status SUCCESS
355
+
356
+ # 公司/产品
357
+ vhcli company list
358
+ vhcli company product-list
359
+
360
+ # TikTok 广告创编
361
+ vhcli tiktok task list --project-id po_xxxx
362
+ vhcli tiktok task submit --project-id po_xxxx --resource-id <ID> --request-id <UUID> --config-file ./payload.json [--follow]
363
+ vhcli tiktok options --project-id po_xxxx --resource-id <ID> --type language|region|identity|minis|app|audience
364
+ vhcli tiktok dark-post-status --project-id po_xxxx --resource-id <ID> --identity-id <ID> --identity-type CUSTOMIZED_USER
365
+ vhcli tiktok optimization-event --project-id po_xxxx --resource-id <ID> --app-id <ID> --objective APP_PROMOTION --optimization-goal CONVERT --placements PLACEMENT_TIKTOK
366
+ vhcli tiktok targeting-search --project-id po_xxxx --resource-id <ID>
367
+ vhcli tiktok spark-ads authorize --project-id po_xxxx --resource-id <ID> --tiktok-account <ID> --auth-codes "CODE1,CODE2"
368
+
369
+ # API 自省
370
+ vhcli schema # 所有模块
371
+ vhcli schema <module> # 模块端点
372
+ vhcli schema <module.endpoint> # 端点参数
373
+ ```
374
+
375
+ ---
376
+
377
+ ## 核心原则
378
+
379
+ > 在执行任何需求前,必须明确:
380
+ > 1. **谁**在操作(平台授权是否有效)
381
+ > 2. 操作**哪个项目**(必须用户确认)
382
+ > 3. 操作**哪个账户**(必须用户确认)
383
+ > 4. 该账户的 **token 是否已初始化到本地**
@@ -0,0 +1,43 @@
1
+ # Agent - 广告创编操作记录
2
+
3
+ > 记录 Agent 执行的广告创建/修改/删除操作日志,用于审计追踪。
4
+
5
+ ---
6
+
7
+ ## operate_record
8
+
9
+ 记录一次广告创编操作(campaigns/adsets/ads 创建日志)。
10
+
11
+ **CLI:**
12
+ ```bash
13
+ vhcli agent operate-record \
14
+ --customer-project-id <int> \
15
+ --account-id <string> \
16
+ --operator <email> \
17
+ --operation-type <CREATE|UPDATE|DELETE> \
18
+ --status <SUCCESS|FAILED|PARTIAL> \
19
+ [--confirmer <email>] \
20
+ [--campaigns-count <int>] \
21
+ [--adsets-count <int>] \
22
+ [--ads-count <int>] \
23
+ [--detail-json '<json>']
24
+ ```
25
+
26
+ **参数:**
27
+
28
+ | 参数 | 类型 | 必填 | 说明 |
29
+ |------|------|------|------|
30
+ | customer_project_id | int32 | ✅ | 客户项目 ID(数字) |
31
+ | account_id | string | ✅ | 广告账户 ID |
32
+ | operator | string | ✅ | 操作人邮箱 |
33
+ | confirmer | string | | 确认人邮箱 |
34
+ | operation_type | string | ✅ | 操作类型:CREATE / UPDATE / DELETE |
35
+ | status | string | ✅ | 状态:SUCCESS / FAILED / PARTIAL |
36
+ | campaigns_count | int32 | | 创建的 campaign 数量 |
37
+ | adsets_count | int32 | | 创建的 adset 数量 |
38
+ | ads_count | int32 | | 创建的 ad 数量 |
39
+ | detail_json | object | | 操作详情 JSON 对象 |
40
+
41
+ **响应:** CommonResponse
42
+
43
+ **备注:** 这是写入操作(write: true),需要认证。
@@ -0,0 +1,47 @@
1
+ # Auth - 平台用户认证
2
+
3
+ > VH AI营销平台用户级认证(Device Flow),获取平台 token 用于后续所有 API 调用。
4
+
5
+ ---
6
+
7
+ ## login
8
+
9
+ 发起 Device Flow 授权登录。输出授权 URL 和验证码,用户在浏览器完成授权后自动获取 token。
10
+
11
+ **CLI:**
12
+ ```bash
13
+ vhcli auth login
14
+ ```
15
+
16
+ **流程:**
17
+ 1. CLI 输出授权 URL + 验证码
18
+ 2. 用户访问 URL 并输入验证码
19
+ 3. 完成后 token 自动写入 `~/.vhcli/config.yaml`
20
+
21
+ **飞书场景:** 使用 `scripts/vh-auth-card.cjs` 发送交互卡片,无需用户手动复制 URL。
22
+
23
+ ---
24
+
25
+ ## token
26
+
27
+ 查看当前平台 token。
28
+
29
+ **CLI:**
30
+ ```bash
31
+ vhcli auth token
32
+ ```
33
+
34
+ **用途:** 检查是否已认证。有输出 = 已认证,无输出 = 需要 login。
35
+
36
+ ---
37
+
38
+ ## config
39
+
40
+ 查看完整配置信息(server URL、app_id、token 等)。
41
+
42
+ **CLI:**
43
+ ```bash
44
+ vhcli config
45
+ ```
46
+
47
+ **配置文件位置:** `~/.vhcli/config.yaml`
@@ -0,0 +1,47 @@
1
+ # Company - 客户公司与产品查询
2
+
3
+ > 查询客户公司(品牌)和产品信息。
4
+
5
+ ---
6
+
7
+ ## list
8
+
9
+ 列出公司列表,支持分页和搜索。
10
+
11
+ **CLI:**
12
+ ```bash
13
+ vhcli company list [--page-size 20] [--page-num 1] [--company-name <name>]
14
+ ```
15
+
16
+ **参数:**
17
+
18
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
19
+ |------|------|------|------|------|
20
+ | page_size | int32 | | 20 | 每页条数 |
21
+ | page_num | int32 | | 1 | 页码 |
22
+ | company_name | string | | | 按公司名搜索 |
23
+
24
+ **响应:** CompanyListData(含 pagination + list)
25
+
26
+ ---
27
+
28
+ ## product_list
29
+
30
+ 列出产品列表,支持按公司过滤和搜索。
31
+
32
+ **CLI:**
33
+ ```bash
34
+ vhcli company product-list [--page-size 20] [--page-num 1] [--company-id <int>] [--product-name <name>] [--category <cat1,cat2>]
35
+ ```
36
+
37
+ **参数:**
38
+
39
+ | 参数 | 类型 | 必填 | 默认 | 说明 |
40
+ |------|------|------|------|------|
41
+ | page_size | int32 | | 20 | 每页条数 |
42
+ | page_num | int32 | | 1 | 页码 |
43
+ | company_id | int32 | | | 按公司 ID 过滤 |
44
+ | product_name | string | | | 按产品名搜索 |
45
+ | category | []string | | | 按类别过滤 |
46
+
47
+ **响应:** ProductListData(含 pagination + list)
@@ -0,0 +1,34 @@
1
+ # Google - Google Ads 直接操作
2
+
3
+ > Google Ads 广告系列预算等直接操作。
4
+
5
+ ---
6
+
7
+ ## update_campaign_budget
8
+
9
+ 更新 Google 广告系列预算。
10
+
11
+ **CLI:**
12
+ ```bash
13
+ vhcli google update-campaign-budget \
14
+ --customer-project-id <int> \
15
+ --account-id <string> \
16
+ --campaign-id <string> \
17
+ --target-budget <float>
18
+ ```
19
+
20
+ **参数:**
21
+
22
+ | 参数 | 类型 | 必填 | 说明 |
23
+ |------|------|------|------|
24
+ | customer_project_id | int32 | ✅ | 客户项目 ID(数字) |
25
+ | account_id | string | ✅ | 广告账户 ID |
26
+ | campaign_id | string | ✅ | 广告系列 ID |
27
+ | target_budget | float64 | ✅ | 目标预算(USD) |
28
+
29
+ **响应:** CampaignBudgetData
30
+ - campaign_name: 广告系列名称
31
+ - before_budget: 修改前预算
32
+ - after_budget: 修改后预算
33
+
34
+ **备注:** 写入操作,需要认证。