douyin-smart-publish

v2026.09.24

抖音创作者平台智能发布(视频/图文):内容适配→上传→填描述/#话题→封面→存草稿→截图回传确认。默认只存草稿;只有在 Daniel 明确确认后才允许点击发布。覆盖标题(≤55字)、描述(建议≤200字)、#话题标签(3-5个)、封面设置、定时发布、可见性、合拍/下载开关。Playwright 自动化。触发:'发抖音'、'抖音发布'、'douyin publish'、'抖音图文'、'抖音视频'、'发布短视频'。

GitHub
Install command
npx skhub add aaaaqwq/douyin-smart-publish
Markdown
SKILL.md

抖音智能发布 v1.1

📋 发布前请确认内容合规:~/clawd/projects/MediaClaw/references/platforms/douyin.md(社区公约11大类违规、AIGC标识、账号健康分)

⚠️ 默认发布策略

  • 默认目标是存草稿,不是直接发布。
  • 只有 Daniel 明确确认后,才允许点“发布”。
  • 在自动化填完内容后,优先截图回传当前页面,确认标题/描述/封面/话题都正确。
  • 如果遇到登录验证、滑块、频率限制、上传卡住,不要死磕;保留截图和当前状态,转为“待 Daniel 接管”。

⚡ v1.1 安全增强

Pre-flight Checklist(飞行前检查)

每次发布前必须验证以下所有项目,缺一不可:

# 1. 浏览器连接测试
curl -s http://127.0.0.1:18800/json/version | grep -q webkit && echo "✅ Browser OK" || echo "❌ Browser Down"

# 2. 登录态验证
python3 scripts/publish.py doctor --no-headless \
  --url "https://creator.douyin.com/creator-micro/content/upload?default-tab=3" \
  --screenshot /tmp/douyin_preflight.png

# 3. 文件验证
ls -lh "$VIDEO_OR_IMAGE_FILE"

检查清单:

  • 浏览器运行中
  • 登录态有效(未过期)
  • 文件存在且格式正确
  • doctor 冒烟测试通过(selector 都能找到)

Safety Screenshots(安全截图)

在每个按钮点击前必须截图当前状态:

打开上传页 → [截图#1: 页面加载] → 上传文件 → [截图#2: 文件上传完成]
→ 填描述 → [截图#3: 描述已填] → 设置封面 → [截图#4: 封面已选]
→ 填话题 → [截图#5: 话题已填] → 点击存草稿 → [截图#6: 草稿确认]

截图命名:/tmp/douyin_safety_{N}_{step_name}_{timestamp}.png

Error Escalation(错误升级规则)

3次失败即停止:

失败点失败次数行为
文件上传≥3次失败停止,截图,报告
描述填充≥3次失败停止,截图,报告
按钮点击≥2次失败停止,截图,报告
登录验证失败停止,提示重新登录

停止后操作:

  1. 截图当前页面
  2. 保存所有安全截图到 /tmp/douyin_safety/
  3. 报告具体失败步骤和错误信息
  4. 转为"待 Daniel 接管"

恢复模式(Recovery)

如果发布流程中断:

  1. 检查草稿箱:https://creator.douyin.com/creator-micro/content/manage
  2. 查看安全截图:ls /tmp/douyin_safety/*.png
  3. 判断是否需要重跑:
    • 截图#5已存在 → 草稿按钮前失败了,需要重跑
    • 截图#4已存在 → 话题填写后失败了,需要重跑
    • 截图#2已存在 → 文件已上传,可跳过上传步骤
  4. 重新运行时使用 --mode draft,绝不自动切换到 --mode publish

草稿按钮文案变体

已知变体(抖音 UI 经常变化):

文案出现场景对应 selector
存草稿视频上传页button:has-text('存草稿')
暂存离开图文上传页button:has-text('暂存离开')
草稿部分版本button:has-text('草稿')

脚本已覆盖所有变体:button:has-text('存草稿'), button:has-text('草稿'), button:has-text('暂存离开')


平台入口

发布类型

类型URL参数说明
视频default-tab=1(默认)短视频/长视频
图文default-tab=3图片轮播+描述
全景视频default-tab=3(全景)VR视频
文章default-tab=4长文(≤8000字+30图)

排版规则

视频规范

项规则
时长15秒-60分钟(≥15分钟需粉丝≥1000)
格式MP4, WebM(推荐MP4 H.264)
分辨率≥720×1280,推荐1080×1920,最高4K
帧率≤60fps,推荐30fps
大小≤16GB
画幅9:16竖屏(最优) / 16:9横屏 / 3:4 / 4:3

图文规范

项规则
图片数量2-35张
格式JPG, JPEG, PNG, WebP(不支持GIF)
大小单张≤50MB
比例推荐3:4或4:3,不建议超过1:2

描述/标题规范

项规则
标题≤55字(实测,超出截断显示)
描述建议≤200字(含话题标签)
话题#话题名 格式,3-5个,精准在前泛在后
@提及@用户名 增加互动
POI定位可添加位置(本地推荐加权)
emoji适度使用,每2-3句1个

封面规范

项规则
视频封面从视频帧选取 或 自定义上传(1080×1920)
图文封面从已上传图片中选择
推荐竖版9:16,清晰大字,对比色

AIGC标注要求(2023.9起)

  • AI生成内容必须标注 "内容由AI生成"
  • 虚构情节标注 "情景演绎,仅供娱乐"

内容适配模板

将内容转化为抖音格式时:

  1. 标题/描述:开头放核心信息(前3秒法则),加emoji和话题标签
    核心卖点/痛点句 emoji
    
    补充说明(1-2句)
    
    #精准话题1 #精准话题2 #泛话题3
    
  2. 话题策略:1-2个精准话题 + 2-3个泛话题,避免无关话题(判标题党)
  3. 描述字数:控制在100-200字,简洁有力
  4. 互动引导:结尾加提问或CTA

发布流程

关键安全门:截图确认 → 再发布

  • 自动化填完以后,先截图(作为确认凭证)。
  • 默认只执行 存草稿。
  • 只有收到 Daniel 明确确认,才允许切换到 --mode publish。

需要接管/风控/停手规则:见 references/handoff-and-human-trace.md

2026-03-27 实战验证结论(已跑通)

这份 skill 已经在真实抖音创作者后台完成过一次完整图文草稿测试,链路如下:

  1. 复用 storage_state 登录态进入创作者后台
  2. 成功上传 3 张图片
  3. 成功填写标题
  4. 成功填写描述
  5. 成功点击草稿按钮并存入草稿箱

这次实战得到的关键经验:

  • 先授权,再发布:未登录时页面里可能根本没有上传控件,不能把“上传失败”误判成 selector 问题。
  • 登录判断不能只看 URL:即使 URL 已在 creator-micro/* 下,页面仍可能是扫码登录态;要同时检查页面文案/二维码区。
  • 当前抖音图文页的草稿按钮文案可能不是 存草稿,而是 暂存离开。
  • 图文页存在真实 inp 6ut[type=file],在授权成功后可直接上传;之前 count=0 的根因是登录页,不是上传能力缺失。

推荐排查顺序:

  1. 先确认是否真的登录成功
  2. 再确认 input[type=file] 是否存在
  3. 再确认底部按钮文案是 发布 / 暂存离开 还是其他变体
  4. 最后才改 selector

视频发布

1. 打开 creator.douyin.com/creator-micro/content/upload
2. 上传视频文件 (拖拽或点击)
3. 等待上传+转码完成
4. 选择/上传封面
5. 填写描述 + #话题 + @提及
6. 🎵 选择BGM(从推荐/热门中选取适合作品氛围的音乐)
7. 设置:可见性(公开/好友/私密)、合拍、下载
8. 可选:定时发布(最远10天)、POI定位
9. 点击 [发布] 或 [存草稿]

图文发布

1. 打开 creator.douyin.com/creator-micro/content/upload?default-tab=3
2. 上传图片 (2-35张,拖拽排序)
3. 选择封面图
4. 填写描述 + #话题
5. 设置发布选项
6. [发布] 或 [存草稿]

脚本用法

# 0) 冒烟检查(不上传,只打开页面+截图+输出关键信号)
python scripts/publish.py doctor --no-headless \
  --screenshot /tmp/douyin_doctor.png

# 1) 从 daily-content 产物直接发布到草稿箱(推荐,SOP直连)
#   - 支持 md/txt 两种格式:
#     /home/aa/clawd/docs/daily-content/YYYY-MM-DD/douyin/douyin-content-YYYY-MM-DD.md
#     /home/aa/clawd/docs/daily-content/YYYY-MM-DD/douyin/douyin-3posts-YYYY-MM-DD.txt
#   - pick=1/2/3 选择第几条
#   - 默认 mode=draft(只存草稿)
python scripts/publish.py daily \
  --source "/home/aa/clawd/docs/daily-content/2026-03-24/douyin/douyin-content-2026-03-24.md" \
  --pick 1 \
  --type image \
  --files "/path/to/img1.jpg,/path/to/img2.jpg" \
  --mode draft

# 2) 视频发布(草稿模式)
python scripts/publish.py video \
  --file "/path/to/video.mp4" \
  --title "可选标题(≤55字)" \
  --desc "描述文字 #话题1 #话题2" \
  --cover "/path/to/cover.jpg" \
  --mode draft

# 3) 图文发布
python scripts/publish.py image \
  --files "/path/to/img1.jpg,/path/to/img2.jpg" \
  --title "可选标题(≤55字)" \
  --desc "图文描述 #话题1" \
  --mode draft

# 4) 定时发布(⚠️仅在 Daniel 明确确认后使用 publish)
python scripts/publish.py daily \
  --source "/home/aa/clawd/docs/daily-content/2026-03-25/douyin/douyin-3posts-2026-03-25.txt" \
  --pick 2 \
  --type video \
  --file "/path/to/video.mp4" \
  --schedule "2026-03-27 21:30" \
  --mode publish

UI 选择器参考(React SPA,类名含hash)

元素定位策略说明
上传区域input[type="file"] / button:has-text("上传视频")文件上传;先确认已登录,未登录时可能为 0
描述输入[class*="desc"] [contenteditable] / textarea / [placeholder*="添加作品描述"]描述编辑区
话题输入描述区中输入 # 触发话题搜索话题弹窗选择
封面选择[class*="cover"] / 封面编辑弹窗视频帧或自定义
音乐选择添加音乐 按钮 / 音乐搜索面板从推荐/热门中选择BGM
发布按钮button:has-text("发布")发布确认
草稿按钮button:has-text("存草稿") / button:has-text("暂存离开")当前实测图文页常见为 暂存离开
定时开关[class*="schedule"] / 时间选择器定时发布
可见性[class*="permission"] / radio按钮公开/好友/私密
图片排序拖拽操作调整图片顺序

注意:抖音使用React + CSS Modules,class名含hash前缀,优先用文本匹配(has-text)或placeholder定位。

发布时间建议

时段推荐度说明
7:00-9:00⭐⭐⭐早通勤
11:30-13:00⭐⭐⭐午休
17:30-19:00⭐⭐⭐下班通勤
20:00-22:00⭐⭐⭐⭐⭐晚间黄金档
22:00-00:00⭐⭐⭐⭐睡前

错误处理

错误处理
登录过期提示扫码,--headless false
滑块验证暂停等待手动完成
上传超时重试3次,指数退避(10s/30s/90s)
转码失败检查格式/分辨率,降级重传
描述过长截断到200字并警告
频率限制建议每天≤3条,间隔≥30分钟

算法要点

  • 发布后2小时内"赛马机制"决定推荐量
  • 完播率 > 点赞率 > 评论率 > 转发率
  • 前3秒决定用户是否继续观看
  • 话题标签影响推荐池分配
  • 竖屏内容推荐权重更高

发布前检查清单

  • 描述 ≤200字,含3-5个话题标签
  • 视频:MP4/WebM格式,≤16GB,≤60分钟
  • 图文:2-35张,JPG/PNG/WebP,每张≤50MB
  • 封面清晰,竖版9:16最优
  • 无其他平台水印
  • AI内容已标注(如适用)
  • 非搬运内容
  • 已截图回传确认
  • 若使用 daily 模式:已核对 pick 对应的是正确那条内容

文件结构

douyin-smart-publish/
├── SKILL.md
├── scripts/
│   └── publish.py          # Playwright 自动发布脚本
├── references/
│   └── platform-rules.md   # 完整平台规则
└── templates/
    └── desc-template.md    # 描述/话题排版模板

🎵 选择BGM(音乐选择步骤)

在填写完描述后、存草稿前执行。

操作流程

1. 在发布页面找到"添加音乐"按钮(通常在描述区下方)
2. 点击打开音乐选择面板
3. 切换到"推荐"或"热门"标签页
4. 搜索与作品内容匹配的音乐(搜索关键词参考下方匹配表)
5. 试听前10秒,判断节奏和氛围是否贴合
6. 选择合适音乐 → 点击"使用"

浏览器操作(OpenClaw Browser)

# 找到并点击"添加音乐"按钮
browser(action="act", kind="evaluate", targetId=编辑页targetId, fn="""
  () => {
    const btns = document.querySelectorAll('button, div, span');
    for (const btn of btns) {
      const text = btn.textContent.trim();
      if (text === '添加音乐' || text === '选择音乐' || text.includes('音乐')) {
        if (btn.offsetParent !== null) {
          btn.click();
          return 'clicked: ' + text;
        }
      }
    }
    return 'not found';
  }
""")

# 等待音乐面板加载
browser(action="act", kind="wait", timeMs=2000)

# 切换到"推荐"或"热门"标签
browser(action="act", kind="evaluate", targetId=编辑页targetId, fn="""
  () => {
    const tabs = document.querySelectorAll('div, span, button');
    for (const tab of tabs) {
      const text = tab.textContent.trim();
      if ((text === '推荐' || text === '热门') && tab.offsetParent !== null) {
        tab.click();
        return 'switched to: ' + text;
      }
    }
    return 'not found';
  }
""")

# 搜索匹配音乐(根据内容主题)
browser(action="act", kind="evaluate", targetId=编辑页targetId, fn="""
  () => {
    const input = document.querySelector('input[placeholder*="搜索音乐"]');
    if (input) {
      input.value = '{搜索关键词}';
      input.dispatchEvent(new Event('input', { bubbles: true }));
      return 'searched';
    }
    return 'search input not found';
  }
""")

内容×BGM 搜索关键词匹配

内容类型推荐搜索关键词风格方向
AI/科技"科技感" "电子" "赛博朋克"节奏感强、未来感
编程/技术"轻音乐" "lofi" "学习"舒适、不干扰
行业分析"商务" "沉稳" "大气"专业、可信
对比评测"节奏" "悬念" "动感"起伏感、吸引注意力
工具推荐"轻快" "活力" "阳光"积极、轻快
深度解读"史诗" "电影感" "沉浸"大气、有层次

选择策略

优先级:
1. 推荐列表前5首中找风格匹配的 → 直接使用
2. 热门榜前10首中找风格匹配的 → 直接使用
3. 搜索关键词后选播放量最高的 → 使用
4. 都不合适 → 跳过音乐选择(不强制)

注意事项

  • 只从抖音音乐库选择(自动获授权,无版权风险)
  • 不要上传本地音频(可能侵权)
  • 优先选推荐的(算法推荐 = 当前热门 = 更高曝光)
  • 试听前10秒(判断节奏是否贴合内容节奏)
  • 不合适就跳过(宁可没有BGM也不用不搭的音乐)

更新日志

  • v1.2.0 (2026-04-16): 新增BGM选择步骤
    • 发布流程Step 6: 选择BGM(从推荐/热门中选取)
  • 6种内容类型×BGM搜索关键词匹配
  • OpenClaw Browser音乐面板操作代码
  • UI选择器新增"音乐选择"条目
  • v1.1.0 (2026-04-16): 安全增强
    • Pre-flight checklist(浏览器、登录态、文件、doctor 冒烟测试)
    • Safety screenshots(6个关键节点截图)
    • Error escalation(3次失败即停止)
    • Recovery mode 文档
    • 草稿按钮文案变体文档(存草稿/暂存离开/草稿)
  • v1.0.0 (2026-03-27): 初始版本,实战验证通过
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

MIT

Source path

skills/douyin-smart-publish

Default branch

main

Latest commit

b996aac

Tree SHA

07e787b