| name | douyin-upload |
| description | 抖音创作者平台视频上传发布。触发条件:用户要求上传视频到抖音、发布抖音视频、自动上传视频到抖音创作者平台 |
douyin-upload
使用 OpenClaw Browser 工具自动上传视频到抖音创作者平台。
⚠️ 重要声明
本 Skill 的使用条件:
-
主动请求触发:本 Skill 只会在用户主动请求的情况下才会使用,例如:
- 用户直接要求 Agent 使用此 Skill 上传视频
- 用户在预先配置好的 cron job 中执行此 Skill
-
需要用户主动提供信息:使用本 Skill 时,需要用户主动提供以下信息:
- 视频文件路径(如
~/Videos/my_video.mp4)
- 视频标题(如「汽车保养小技巧」)
- 作品可见范围(公开/好友可见/仅自己可见)
- 其他可能需要的信息
-
强制用户确认:每次发布前,必须向用户展示视频信息并获得明确确认后才能发布,不支持跳过确认。
前置要求
- OpenClaw Gateway 已运行
- 电脑已安装 Chrome 浏览器
- 首次使用需要在弹出的浏览器窗口中登录抖音账号(只需一次,之后自动复用登录态)
核心原则
⚠️ 安全说明:
本 skill 使用独立的命名 profile(douyin-profile),与你的真实 Chrome 浏览器完全隔离。只需在首次使用时登录抖音一次,之后登录态自动复用。AI 不会访问你的真实 Chrome 数据。
配置选项:
- ✅
profile="douyin-profile" + target="host" - 使用独立的命名 profile,登录态持久化,与 Chrome 隔离(推荐)
- ✅
target="sandbox" - 独立沙盒环境,每次需要重新登录,最安全但不便捷
- ❌
profile="user" - 直接附加到真实 Chrome,会继承所有 cookies 和登录态,不推荐
- ❌ 不填 profile - 使用默认隔离浏览器,行为可能不稳定
推荐配置:使用 profile="douyin-profile" 配合 target="host"。
工作流程
Step 1: 打开上传页面
browser(action="navigate", target="host", profile="douyin-profile", url="https://creator.douyin.com/creator-micro/content/upload")
Step 2: 关闭弹窗
如果页面出现弹窗,先关闭:
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="act", target="host", profile="douyin-profile", request={"kind": "click", "ref": "<找到的ref>"})
关键:不要硬编码 ref! 先 snapshot,再从结果中根据文字内容找到对应元素的 ref。
Step 4: 准备视频文件
浏览器 tool 只能上传到 /tmp/openclaw/uploads 目录:
mkdir -p /tmp/openclaw/uploads
cp <视频路径> /tmp/openclaw/uploads/
Step 5: 点击上传按钮
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="act", target="host", profile="douyin-profile", request={"kind": "click", "ref": "<找到的ref>"})
Step 6: 上传文件
点击上传按钮后会弹出文件选择框:
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="upload", target="host", profile="douyin-profile", paths=["/tmp/openclaw/uploads/<文件名>"], ref="<找到的ref>")
Step 7: 等待视频解析
页面自动跳转到发布编辑页,显示进度条"0% 文件解析中,请稍等...",等待视频解析完成后继续。
Step 8: 填写标题
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="act", target="host", profile="douyin-profile", request={"kind": "click", "ref": "<找到的ref>"})
browser(action="act", target="host", profile="douyin-profile", request={"kind": "type", "ref": "<找到的ref>", "text": "<用户提供的标题>"})
Step 9: 设置作品权限
cat ~/.openclaw/skills/douyin-auto-publish/config.json
如果 default_visibility 字段已存在,使用保存的值。
如果 default_visibility 字段不存在,向用户询问:
「请选择默认的可见范围:
- 公开:所有用户可见
- 好友可见:仅好友可见
- 仅自己可见:仅自己可见(最安全)
请回复您希望的数字或文字。」
根据用户回复保存偏好:
current=$(cat ~/.openclaw/skills/douyin-auto-publish/config.json)
echo $current | jq -s '.[0] * {"default_visibility":"public"}' > ~/.openclaw/skills/douyin-auto-publish/config.json
echo $current | jq -s '.[0] * {"default_visibility":"friends"}' > ~/.openclaw/skills/douyin-auto-publish/config.json
echo $current | jq -s '.[0] * {"default_visibility":"private"}' > ~/.openclaw/skills/douyin-auto-publish/config.json
如果 jq 不可用,可以使用简单覆盖:
echo '{"default_visibility":"public"}' > ~/.openclaw/skills/douyin-auto-publish/config.json
如果用户明确指定了可见范围,优先使用用户指定的值(而不是默认值),本次不修改保存的偏好。
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="act", target="host", profile="douyin-profile", request={"kind": "click", "ref": "<找到的ref>"})
Step 10: 确认并发布
每次发布前必须向用户展示视频信息并获得明确确认,不支持跳过确认。
在点击发布之前,必须向用户展示以下信息并获得明确确认:
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="act", target="host", profile="douyin-profile", request={"kind": "click", "ref": "<找到的ref>"})
成功标志:页面显示「共 X 个作品」「已发布」状态。
完整流程模板
browser(action="navigate", target="host", profile="douyin-profile", url="https://creator.douyin.com/creator-micro/content/upload")
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="upload", target="host", profile="douyin-profile", paths=["/tmp/openclaw/uploads/<文件名>"], ref="<ref>")
sleep 15
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
browser(action="snapshot", target="host", profile="douyin-profile", compact=true, depth=2)
重要提示
- 每次操作前都要先 snapshot - ref 是动态的,每次快照都不同
- 从 snapshot 结果中根据文字内容查找 ref - 不要硬编码
- 页面跳转后需要重新 snapshot - 元素 ref 会失效
- 视频必须复制到
/tmp/openclaw/uploads/ - 浏览器 tool 的限制
- 当用户还需要未提及的操作时, 也是同样的方法匹配对应的ref, 然后找到匹配的选项
可选:使用沙盒模式(更安全)
如果你希望完全隔离登录状态,可以使用 target="sandbox":
browser(action="navigate", target="sandbox", url="https://creator.douyin.com/creator-micro/content/upload")
沙盒模式的优点:
- 完全隔离的浏览器环境,不会访问任何已有浏览器数据
- 更安全,适合注重隐私的用户
沙盒模式的缺点:
常见问题
Q: 为什么提示需要登录?
A: 首次使用需要在弹出的 douyin-profile 浏览器中登录抖音账号(扫描二维码)。只需登录一次,之后登录态会自动复用。如果想避免登录态持久化,可以使用 target="sandbox" 模式。
Q: douyin-profile 与真实 Chrome 有什么区别?
A: douyin-profile 是一个独立的命名浏览器 profile,与你的真实 Chrome 浏览器完全隔离。AI 使用这个独立的 profile 进行操作,不会访问你的真实 Chrome 数据、cookies 或登录态。
Q: 如何使用更安全的沙盒模式?
A: 使用 target="sandbox" 代替 target="host"。沙盒模式会创建独立的浏览器环境,不会访问你的真实 Chrome 数据,但每次都需要重新登录抖音账号。
Q: Element not found 错误?
A: 页面可能跳转了,需要重新执行 snapshot 获取最新元素。
Q: 为什么 ref 每次都不一样?
A: 抖音页面动态渲染,每次 snapshot 生成的 ref 不同。这是正常现象。