抖音搜索
这是工作流里的抖音搜索编排接口。只使用宿主已安装且已登录的 OpenCLI,不自带爬虫、浏览器、cookie 复制、独立 profile 或 Python runtime。
输入
query:必填,搜索关键词。limit:可选,1—30,默认 10。episode:可选,本期episodes/<slug>路径;只允许写00-抖音搜索证据.json与.md,不得写 candidates、source-health 或00-选题.*。
执行
1. 预检
opencli doctor
opencli douyin whoami -f json
Browser Bridge 可连接且 logged_in=true 时执行搜索。任一预检失败时,episode 模式仍写出 UNAVAILABLE 证据与原始错误供①继续判断;独立搜索请求则如实报告当前不可用。不要抽取或复制 Chrome cookie,也不要安装新工具。
2. 搜索
Episode 模式用确定性包装器一次执行 1—3 个短名单查询并原子写 JSON/Markdown:
node ~/Documents/laohan-skills/laohan-douyinsousuo/scripts/search-evidence.mjs \
--episode episodes/<slug> \
--query "关键词一" \
--query "关键词二" \
--limit 10
独立单查询可直接执行:
opencli douyin search "$QUERY" --limit "$LIMIT" -f json
结果必须是 JSON 数组,并逐条保留 OpenCLI 返回的 rank、desc、author、url、aweme_id、发布时间及可用互动字段。稳定 id 优先使用 aweme_id 或 URL 中的 /video/<id>;两者都没有时才用 sha256(url + desc)[:12]。排名不得参与稳定 id;不要按缺失字段重排,也不要把 OpenCLI 的结果顺序描述成“按点赞排行”。
3. 失败降级
按顺序执行,成功即停:
- 同一命令加
--trace retain-on-failure,使用 OpenCLI autofix 修复现有 adapter;总尝试最多 3 次。 - 若
opencli doctor仍正常但 adapter 持续失败,使用opencli browser douyin-search bind绑定用户当前已登录的抖音标签页,仅做读取和取证。执行浏览器降级前说明会操作当前标签页。 - 仍失败则记录失败层级和原始错误。episode 模式标记平台数据
UNAVAILABLE并返回证据文件,不把它升级为①的卡点;独立搜索请求报告本次未取得结果。不得临时安装 DrissionPage、Playwright、浏览器或自制爬虫。
输出与判断
先展示搜索健康状态和实际返回条数,再展示结果表:
| # | 作者 | 点赞 | 标题 | 链接 |
|---|---|---|---|---|
| 1 | author | likes/不可用 | desc | url |
- 互动字段缺失写
null并在field_availability标记false;实际返回数字0则保留 0 并标记true,不得混为一谈。 - 返回空数组时写
EMPTY_OR_FIELD_UNAVAILABLE;不能据此断言抖音上没有相关内容。 - 当前已安装 OpenCLI 1.8.6 的
douyin search只提供搜索结果样本,卡片通常只有点赞字段;douyin hashtag hot可提供全站热点,已由 laohan-redian 的 discovery route 使用。douyin hashtag search当前接口实测失败,hashtag hot --keyword也不能可靠按关键词过滤。因此搜索量、供给总量、增长速度和官方内容缺口默认均为UNAVAILABLE;以后只有 OpenCLI 实际返回这些字段时才使用,不从结果条数或点赞反推。 - 事实性结论必须回到原视频或权威来源核验;搜索结果只能作为发现证据。
- 用户单独要求搜索分析时,可总结结果中可见的内容类型和重复角度;不得决定工作流最终选题,不得补造搜索结果未提供的事实。
- 指定
episode时必须使用 runtime-locked 包装器,先写机器真源00-抖音搜索证据.json,再从它生成.md;Markdown 不得新增 JSON 没有的结论。
Episode JSON 最小合同:
{
"schema_version": 1,
"collected_at": "ISO-8601",
"executor": {
"name": "opencli",
"version": "实际版本",
"doctor_status": "PASS|FAILED",
"logged_in": true,
"availability_status": "AVAILABLE|UNAVAILABLE"
},
"queries": [{
"query": "关键词",
"command": "opencli douyin search ... -f json",
"attempted_at": "ISO-8601",
"status": "OK|EMPTY_OR_FIELD_UNAVAILABLE|FAILED",
"result_count": 1,
"results": [{"id":"稳定id","rank":1,"desc":"原字段","author":"原字段","url":"https://..."}]
}]
}
OK 必须 result_count > 0 且等于 results 长度;EMPTY_OR_FIELD_UNAVAILABLE 必须为 0 和空数组;FAILED 必须为 0、空数组并有 error。全部查询 FAILED 或预检失败时写 availability_status: UNAVAILABLE,仍完成 episode 证据落盘;①不得据此推断平台没有需求。
边界
- 下载视频、博主作品列表:用
/laohan-xiazai。 - 评论、发布、账号运营:用
/laohan-yunying或对应 OpenCLI adapter。 - 禁止 DrissionPage、
browser_cookie3cookie 注入、独立 user-data-dir、额外 Chrome/Chromium、后台自动发布或回复。