Three TikTok Minis skills for Codex and Claude Code, with the cold-start playbook and five benchmark accounts through 88776-1 (2026-09-30). install.sh links them into ~/.codex/skills and ~/.claude/skills. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
190 lines
15 KiB
Markdown
190 lines
15 KiB
Markdown
---
|
||
name: swads-minis-batch-launch
|
||
description: 把本地剪好的短剧素材(视频、图文、或同组混搭)批量建成 TikTok Minis 计划:按剧上传素材、策源、改名/CBO/配乐、推送、同步、开投、逐条核对,也管追加广告、搬户重建和删除计划。运营手动 /swads-minis-batch-launch 触发,通过 swads MCP 网关完成,不自动加载。
|
||
disable-model-invocation: true
|
||
---
|
||
|
||
# 短剧 Minis 批量搭建
|
||
|
||
一部剧 = 一条广告系列 = 一个广告组覆盖全部国家;素材决定广告数:
|
||
|
||
| 素材形状 | 广告 | 素材分配 |
|
||
|---|---|---|
|
||
| 一个平铺的图片文件夹 + 剧名清单 | 每张图 1 条 | **默认做法**:单图复制成两帧图集,见「图文的两种组法」 |
|
||
| `<剧名>/轮播NN_*/images/*.png` | 每套 1 条 | 每条广告只放它那一套的图 |
|
||
| `<剧名>/**/*.mp4` 或一个视频文件夹 | 每 15 个 1 条 | 全部视频挂同一条广告,超过 15 个顺延到下一条 |
|
||
| 图片 + 视频,运营说「混搭」 | 每张图 1 条 + 视频 1 条 | 同一个广告组里图文广告和视频广告各自独立,见「同组混搭」 |
|
||
|
||
默认口径(运营没说就用这套):9 国一组(AU BR KR CA MX JP TH NZ ID)、日预算 500 USD、CBO 开、
|
||
按广告变现出价 ROAS 1.2、不限系统和年龄性别、英文文案 5 条、卖点 5 个英文话题标签、发布身份 Abigail。
|
||
计划名 `SW-ADS-<产品>-<剧名>-<YYYYMMDD>`(北京日期);纯图文计划在日期前加一节 `图文`,
|
||
视频计划和混搭计划不加。`<产品>` 是小程序名,如 `WISY`、`WISH`。
|
||
|
||
## 文案与素材的红线
|
||
|
||
文案要写冲突、反转、钩子(背叛、出轨、复仇、钱都能写),只避开 TikTok 按字面判违规的两类说法,
|
||
策源 agent 写出来会被打回,自己补丁改文案时先扫一遍:
|
||
|
||
- **性行为直说**:slept with、in bed with、naked、nude、sex(2026-09-21 因此拒审)。
|
||
- **工作或轻松赚钱**:jobs、hiring、salary、income、make money、get rich、work from home,以及任何金额(2026-09-22 一个户因此被封)。
|
||
|
||
素材有下面几类封户风险。素材中心会在 `content_warnings` 里提示**图片**的性内容和诈骗诱饵图,**只提示不拦截**;
|
||
视频不检测,名人脸它也认不出,这两样要靠人看。**这些是提醒运营的,不是让你自己剔图**:运营说全上就全上;你觉得该剔的,
|
||
在开工前清单里列出来问一句,运营不点头就照上。
|
||
|
||
- 明星、名人的脸,包括表情包改图。
|
||
- 像诈骗广告的诱饵图:病变畸形的身体特写、带价签或像商品广告的图、钱/奖品/付款截图。
|
||
- 别人社交帖的截图当整张广告(打码只遮账号,仍是在展示别人的帖子)。
|
||
- 来自被封账户的素材(会被关联)。
|
||
- 优先用剧本身的画面:剧照、片段截图、剧集视频、官方海报。
|
||
|
||
## 本地会话与线上会话
|
||
|
||
判据只有一条:**系统提示里有一节标题是「本批清单」、下面是一段 JSON 清单的,就是线上会话**
|
||
(策源页 `/zh/launch-intake` 开的对话),照 `references/online.md` 办,它与本文件冲突时以它为准。
|
||
没有这一节的是本地会话(运营在本机 Claude Code 里 `/swads-minis-batch-launch`),照下文办。
|
||
|
||
## 边界:只动平台数据,不动代码
|
||
|
||
这套流程只用 MCP 工具和本地上传脚本。能重试的按各节规则重试,不能重试的**停下来写进核对表**
|
||
(报错原文、卡在哪一步、已经上了平台的东西),交给运营。不要去读服务源码找原因,不要改仓库、
|
||
不要 `git commit/push`、不要开 PR、不要动凭据。真是产品缺陷,核对表里那条报错就是提 issue 的全部材料。
|
||
|
||
## 开工前问清楚,别猜
|
||
|
||
1. **素材路径**,以及要跑哪几部剧(默认全部)。
|
||
2. **投放账户**(`external_account_id`)。说不清就 `intake_list_accounts` 列给运营选。账户选错整批都错。
|
||
3. **小程序**。一个户下常挂好几个小程序(SWAVE、WISH、WISY、VEYA、WOVA),**每批都要问投哪个**,
|
||
不按上一批或旧计划的名字推断——投错小程序要删掉整批重建,这事发生过两次。
|
||
4. **剧名**(按排名)。剧集页链接**自己查,不问**:
|
||
`minis_episode_link_list(external_account_id=A, minis_id=<MINIS_ID>, titles=[剧名…])`,`found` 的直接用,
|
||
只把 `missing` 里的剧一次问完;运营回的链接先 `minis_episode_link_set` 记回清单再用。链接只抄不猜,
|
||
问了也没有的剧不建。
|
||
|
||
发布身份从 `intake_upload_context` 的 `identities` 里取 Abigail;这个户没有 Abigail 才问。
|
||
预算、ROAS、国家运营没提就用默认,在开工前清单里写明。
|
||
开不开投放也要问清:运营说「搭建完直接开投」才在推送后开,否则推完停在暂停状态等他说。
|
||
|
||
问完把**开工前清单**给运营看一眼再动手(按剧分好的文件夹可以先跑 `scripts/scan_material_folder.py <素材根目录>` 列出每部剧的文件):剧名 / 组法 / 广告数 / 每条素材数 / 落地页 / 配乐 / 预算 / ROAS / 身份。
|
||
这是唯一免费纠错的机会——素材一旦上平台,撤回就要删计划。
|
||
|
||
## 图文的两种组法
|
||
|
||
运营没说就按**方案一**;两批做法冲突拿不准时先问,别自己定。
|
||
|
||
| | 方案一(默认):单图复制成图集 | 方案二:多图组图集 |
|
||
|---|---|---|
|
||
| 一个图集 | 同一张图 × 2 帧 | 2-4 张相似的不同图 |
|
||
| 广告数 | 每张图 1 条 | 每个图集 1 条 |
|
||
| 分剧 | 图按文件名排好后**按剧排名轮流**发:第 k 张给第 `k mod 剧数` 部,除不尽时排名靠前的剧多一条 | 按 `轮播NN` 文件夹,或按运营确认的分套 |
|
||
| 例 | 48 张图 × 10 部剧:前 8 部各 5 条、后 2 部各 4 条 | 10 部剧 × 3 套 × 3 张 |
|
||
|
||
- **图集里的每一帧都是单独上传的素材**:方案一每张图传两次,文件名加 `-1`/`-2`,拿两个不同的 `asset_id`。
|
||
图文一律不带 `content_sha256`——一次策源的附件 id 必须唯一,按字节复用会把重复的帧并掉。
|
||
- 图片原样上传,不用自己缩放:推送时自动换成 1080×1920 的版本(保持比例,其余补黑边)。
|
||
- 本地会话的配乐:运营给了 `music_id` 就按剧写进每条图文广告;没给就用 `launch_carousel_music_search`
|
||
按剧情搜一首,写进开工前清单让运营确认。
|
||
|
||
## 视频尺寸
|
||
|
||
上传前先 `ffprobe` 看尺寸。正好 9:16 的(720×1280、756×1344、1080×1920)原样传。差一点的(768×1344、
|
||
544×992)TikTok 取封面时会拒:`Unsupported image size. Please upload another image.`,先等比放大到 1920 高
|
||
再居中裁到 1080×1920(`scale=-2:1920,crop=1080:1920`),视频不补黑边。比例差得多的(3:4、1:2 等)
|
||
先问运营是剔掉还是另行处理。
|
||
|
||
## 每部剧的顺序
|
||
|
||
工具参数在 `references/tool-sequence.md`,这里只说顺序。**每个带账户参数的调用都传 `external_account_id`**:
|
||
不传会被拒:MCP 不借用浏览器里选中的户。传了只对这一次调用生效,不会改动浏览器里选中的账户。
|
||
|
||
1. **上下文** `intake_upload_context(external_account_id, minis_id)`:拿入库印章、`product_app_scope`、
|
||
`identities`。scope 按账户和小程序各不相同,每个文件上传都要带这个户自己的。
|
||
2. **上传** 每个文件:`creative_upload_from_url`(begin)→ `scripts/upload_local_asset.sh` 本地 PUT →
|
||
`creative_upload_from_url`(finish)→ `creative_import_status` 轮询到 `ready` 拿 `asset_id`。
|
||
begin 和 finish 都带 `external_account_id` 与 `product_app_scope`(不带账户会落进未归属池);
|
||
一律 `review_status="approved"`;视频带 `content_sha256`,图文不带。
|
||
3. **策源** `intake_start_run`,brief 用 `references/brief-templates.md`,图文的 `asset_ids` **按套的顺序**排。
|
||
`intake_run_status(external_account_id, wait_seconds=120)` 等结果;`needs_clarification` 按 `recommended_value` 答,最多 3 轮。
|
||
返回的 `content_warnings` 原样记进核对表备注,收尾转告运营,**不要自己去掉素材重新策源**。
|
||
画面里别人的头像/昵称会被自动打码,不用处理。
|
||
`intake_start_run` 超时或断连时草稿可能已经建好:**重发前先 `campaign_list(search=<剧名>)` 找同名、
|
||
还没推送的草稿**,有就接着从第 4 步做,别再发一次(发过两次就会多一条重复草稿,多的用 `campaign_delete_draft` 删)。
|
||
刚上传完的素材偶尔报 `Creative asset authorization failed`,隔一两分钟原样重发一次就好。
|
||
4. **验形状** `campaign_workspace`:广告数和每条广告的 `creative_variants` 数要和清单一致。
|
||
不一致 → `campaign_delete_draft` 删掉重新策源,**最多 5 次,错形状不推**。这条规则只在这里写,别处引用这里。
|
||
5. **补丁** `campaign_workspace_patch`:计划名、CBO(开了就把组的 `daily_budget`/`group_budget` 清零)、
|
||
出价口径、卖点、图文配乐。每次补丁返回新的 `delivery_spec_id`,后面要用最新的。
|
||
6. **推送** `campaign_push_preview` 看 `ready_to_push`,再 `campaign_push`;`campaign_detail(wait_seconds=120)`
|
||
读 `execution_runs[0].status`。素材拉取的 `EOF`、`timeout`、`no longer have access` 是传输错,
|
||
同一版本再推,**最多 4 次**。这条重试规则只在这里写。
|
||
**推送期间不要 `account_sync`**:同步会撞掉还在排队的推送。全部推完再同步。
|
||
推送后广告组的国家、年龄、性别就改不了了(接口会报成功但不生效),搭错只能删了重建,所以推前核准。
|
||
|
||
全部剧推完后:
|
||
|
||
7. **同步** `account_sync` → `account_sync_status(wait_seconds=120)` 到 `completed*`。开投要看平台快照,没同步过会 409。
|
||
8. **开投**(运营说了才做)逐条 `campaign_set_delivery(status="active")`,三层级联 ENABLE。这是唯一开始花钱的一步。
|
||
偶尔会失败或超时,隔 20 秒重试,最多 4 次;还不行就写进核对表。
|
||
9. **核对**:`references/verification.md` 的表,开投的再用 TikTok 读回确认。
|
||
|
||
## 追加广告
|
||
|
||
**默认新建。** 同一个户里同一部剧已经有计划,运营说「搭建」照样新建一条——同剧多条计划各有日预算,
|
||
不算抢量,不用提醒。只有运营明说「追加」「往原计划里加」时,才在原计划的广告组里**新加一条广告**:
|
||
Smart+ 广告建好后不能再往里加素材,新加广告是唯一的路。追加前 `campaign_list(search=<剧名>)` 找到目标,
|
||
确认 `external_campaign_id` 非空;找到不止一条就列给运营选。命令见 `references/tool-sequence.md`「追加模式」,
|
||
追加推送**必须** `scope="additions"`。追加的广告**不过素材检测、图片也不自动补黑边**(截至 2026-09-25):
|
||
追加图片要人看过、尺寸在 1080×1920 以内;追加视频不受影响。
|
||
|
||
## 同组混搭
|
||
|
||
一个广告组里可以同时有纯图文广告和纯视频广告;**一条广告里不能混图片和视频**。一次策源建不出混搭——
|
||
agent 会把素材平均摊到各条广告上,所以分两步:
|
||
|
||
1. 按图文建计划(方案一或方案二),推送、同步。
|
||
2. 按追加模式给每部剧加视频广告:复制最后一条图文广告作模板,`asset_ids` 换成视频;
|
||
**紧接着把新广告的 `music_id` 清空**(`fields={"music_id": ""}`),否则会带着图文的配乐推上去;
|
||
`campaign_push(scope="additions")`,再同步。视频广告名用 `SW-ADS-<产品>-<剧名> Video <N>`。
|
||
|
||
然后再开投。混搭计划名不加 `图文`。
|
||
|
||
## 常见的后续操作
|
||
|
||
- **改日预算**:`campaign_set_budget(campaign_id, daily_budget)`,直接写到 TikTok 并同步回本地,不用再同步账户。
|
||
改的是花钱速度,运营点名了才改。
|
||
- **改 ROAS**:网关没有改出价的工具,这份 skill 也没验证过走补丁加推送的路子——报给运营在控制台改,别自己试。
|
||
- **停或开单条广告**:`campaign_set_ad_delivery(campaign_id, external_ad_id, status)`,同计划其他广告不动,能恢复。
|
||
`external_ad_id` 用 TikTok 的 `ad_id`(指标查询返回的就是它)。
|
||
- **拒审**:TikTok 按国家审。**部分国家被拒的广告在通过的国家照常投**(实测被拒国家零消耗、通过国家正常花钱),
|
||
不用动。全部国家被拒的素材,凌晨同步会自动在 TikTok 上关掉;运营要清理整条广告时,先停(上一条)再说删。
|
||
- **计划自己停了**:开投超过 72 小时、累计零消耗的 SW Ads 计划,凌晨会被自动暂停。运营问起先想到这个。
|
||
- **挑跑量素材复用**:用 `metrics_semantic_query` 按广告取花费、展示、点击、广告变现收入(先 `metrics_catalog`
|
||
看指标名;返回的 `ctr` 是小数不是百分数,用点击÷展示自己算更稳),花费低于门槛(常用 1–3 USD)的不排;CTR 与 ROAS 各排一次名次取平均,名次最好的几条的素材
|
||
拿去新建。门槛、取几条、看哪几天,开工前清单里写明给运营确认。
|
||
- **搬到新户重建**:素材的授权跟着账户走,新户要**下载后按新户重新上传**(`creative_asset_detail` 的 `asset_url`
|
||
就是原图),不能直接拿旧户的 `asset_id`。不要用 `creative_upload_from_url` 的 `remote_url` 直接拉:2026-09-27 实测
|
||
拉进来的素材是待审、没挂小程序授权,策源会拒。原计划被删掉或被拒审的广告不带过去,只搬现存的。
|
||
- **删除计划**:见下面「别做的事」第二条。
|
||
|
||
## 等待的方式
|
||
|
||
策源、推送、同步三个状态工具都带 `wait_seconds=120`:服务端等到有结果或满 120 秒才返回,没结果就再调一次,
|
||
不需要自己 sleep。只有素材入库 `creative_import_status` 不带等待,用前台的 `sleep 15`(单独一条 Bash 命令)
|
||
再问一次,20 分钟没 ready 才算失败。不要 `run_in_background` 的 sleep、不要 Monitor:无人值守的 `claude -p`
|
||
会话收不到后台任务的完成通知,会在「等通知」这一步直接结束。
|
||
|
||
## 别做的事
|
||
|
||
- 不改预算/出价/国家去「优化」;运营没说的都按默认。
|
||
- 已推送的计划不自己删。只有运营明确要删(「重建后把旧计划删掉」「清理这个户」这类原话)才删,走 `campaign_delete`:
|
||
本地和 TikTok 一起删、**不能恢复**,令牌要单独勾「计划·删除」(`campaign:delete`)。删之前先把计划名、账户、
|
||
在投状态列给运营;一次删一条,每条删完 `campaign_detail` 要返回 404 再删下一条;全删完 `account_sync` 一次,
|
||
核对表里写「已删」。`campaign_delete_draft` 只删没推过的草稿,推过的它会拒。细节见 `references/tool-sequence.md` 第 3 节。
|
||
- 澄清问题超过 3 轮、或同一部剧策源 5 次形状都不对,停下来把 run 的 `failure` 原文给运营,不要换 brief 硬试。
|
||
- 素材字节不经过对话:PUT 由脚本做,你只传路径。
|
||
|
||
## 结束时的汇报
|
||
|
||
用 `references/verification.md` 的表;再列出没建成的剧和原因(原文错误信息)、`content_warnings`,
|
||
以及开投后 TikTok 读回的广告状态。
|