ai-image-gen
通用 AI 生图:文生图 / 图生图 / 图像变体。当用户说 AI 生图、AI 画图、文生图、图生图、生成图片、生成配图、图像生成、AI 出图、AI…
将视频/图文内容发布到抖音(creator.douyin.com)。基于 Playwright + 持久化登录态,headless 即可运行, 流程与选择器移植自开源实现 douyin-upload-mcp-skill(含高清发布入口、切 tab、上传等转码、AI 封面、 发布成功 toast 校验、二维码登录)。适用场景:发布抖音视频、发布图文、扫码登录、发布前预检。
$ npx -y skills add zju-real/easel --skill skill-douyin-upload --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/skill-douyin-uploadContext preview
The summary Claude sees to decide when to auto-load this skill.
将视频/图文内容发布到抖音(creator.douyin.com)。基于 Playwright + 持久化登录态,headless 即可运行, 流程与选择器移植自开源实现 douyin-upload-mcp-skill(含高清发布入口、切 tab、上传等转码、AI 封面、 发布成功 toast 校验、二维码登录)。适用场景:发布抖音视频、发布图文、扫码登录、发布前预检。
name: skill-douyin-upload description: | 将视频/图文内容发布到抖音(creator.douyin.com)。基于 Playwright + 持久化登录态,headless 即可运行, 流程与选择器移植自开源实现 douyin-upload-mcp-skill(含高清发布入口、切 tab、上传等转码、AI 封面、 发布成功 toast 校验、二维码登录)。适用场景:发布抖音视频、发布图文、扫码登录、发布前预检。 layer: publish
在用户确认后,调用 `douyin_publish.py` 完成**视频/图文发布**。
统一走 **`../../shared/scripts/douyin_publish.py`**(CWD=项目根)。Playwright + 持久化登录态驱动 抖音创作者后台,headless 即可发布——**替代了旧的 CDP/puppeteer/MCP Node 死栈**(需真实 Chrome, 本环境跑不了,已删除)。
| 依赖 | 说明 | |------|------| | playwright + chromium | 本环境已装(`douyin_publish.py check` 验证) | | 已扫码登录 | `login` 抠二维码成 PNG(默认 `outputs/_login/douyin.png`,Web「账号」页可扫)→ cookie 持久化到 `~/.easel-browser-profiles/DouyinProfile` | | 干净网络 IP | 抖音对机房/代理 IP 更易触发风控短信墙(登录与**发布**都可能弹)。短信墙**可过**——脚本支持验证码回填(见「短信验证码处理」),无需家宽 IP;仍建议尽量用干净 IP 降低触发频率 |
抖音自动化发布存在被平台风控/限流风险。默认提醒用测试号、小流量、人工复核。脚本已内置反检测 (`--disable-blink-features=AutomationControlled` + 逐字符输入 + zh-CN);风险不可完全消除。
check(环境就绪?) → 未登录 → login(抠二维码,Web 账号页扫 或 CLI 扫) → plan(dry-run 预检:标题长度/媒体路径/步骤)— 给用户确认最终标题、简介、媒体 → 发布前人设检查(见下) → publish / publish-video --exec(首次建议 --headed 校验选择器,OK 后 headless 复跑) → 【若弹短信墙】问用户验证码 → 回填 → 脚本自动过墙(见「短信验证码处理」) → 成功校验(脚本内置:发布后**读回创作者中心作品列表对账**——标题+时间窗对上该作品才算 success) → 发布后留痕(见下)
抖音发布点「发布」后可能弹**风控短信墙**(提示『接收短信验证码』)。脚本已内置完整过墙能力(`_handle_publish_sms`:下发验证码 → 轮询码文件 → 填码提交,最多等 300s,可多次重输),**但对话页里 agent 必须主动把验证码递进去**——否则脚本会空等 300s 超时失败。
要码有两种姿势,**先探测本部署支持哪种**:
printenv EASEL_ASKUSER_CARDS # "1"=支持选项卡片(OpenClaw 2026.9.x);"0"/空=不支持(如 2026.6.11)
无论哪种,前两步(后台启动 + 轮询)完全一样。
务必带 `--status-file` 和 `--sms-code-file`(路径放 `outputs/_login/` 下),并用 `setsid`+`&`+日志重定向**把进程脱离当前 shell**——否则本轮结束、openclaw 进程退出时会把它一起杀掉,文字等待模式就跨不了轮:
mkdir -p outputs/_login setsid python skills/shared/scripts/douyin_publish.py publish-video --exec --no-proxy \ --title "标题" --content "简介" --video /abs/v.mp4 --tags "旅行,攻略" \ --status-file outputs/_login/douyin.publish.json \ --sms-code-file outputs/_login/douyin.code \ > outputs/_login/douyin.publish.log 2>&1 &
**每 2–3 秒查一次,用短命令**——别一次性长睡眠干等,墙一出现你才能立刻反应:
sleep 3; cat outputs/_login/douyin.publish.json
状态机(JSON 字段 `state`):`starting`→可能 `sms_required`→`verifying`→`success`/`error`。**`success` 只在发布后读回创作者中心作品列表、对账通过才写入**,message 里带核验到的作品 id 与状态;读回没对上落 `error`,message 区分三种:登录态失效(需重新登录)/ 列表暂未见本次内容(需到内容管理页人工核对)/ 读回通道异常。
读到 `state=="sms_required"`(含『正在发送验证码』阶段——**看到就立即要码,不必等短信到**)后,按探测结果分流:
**马上调用 `ask_user` 工具弹【验证码卡片】要码——不要用普通文字消息**(卡片自带「自行输入…」填空,用户填完提交你直接拿到数字)。参数模板(`options` 必需 2–4 个;验证码本身走卡片自带的自由输入):
{"questions":[{"id":"sms_code","header":"发布验证","question":"抖音发布触发短信验证:请把手机收到的 6 位验证码填进来(点「自行输入…」后输入数字)。","options":[{"label":"重新发送验证码"},{"label":"取消本次发布"}]}],"timeoutSeconds":300}用户提交后按答案分流:**纯数字(4–8 位)** → 写码文件(见下);**「重新发送验证码」** → 建重发信号文件后**立刻再弹一张卡**(问题改为「已重发——把新收到的验证码填进来」);**「取消本次发布」** → 告知脚本会自行超时退出。整轮不结束,卡片答完接着轮询到 `success`/`error`。
后台进程已用 `setsid` 脱离、会一直等码(≤300s),所以你可以放心**结束本轮**、把要码交给下一轮:
1. 发一条**普通文字消息**告诉用户:抖音发布触发短信验证,请把手机收到的 6 位验证码直接发给你;若没收到可回「重发」。**然后结束本轮**(不要在本轮里 `sleep` 干等,用户此刻还没输码,Bash 白卡)。 2. **用户下一条消息**就是验证码(同一会话,你能看到发布上下文)。按内容分流:
3. 恢复轮询后若又回到 `sms_required`(码错/重发),重复本流程:再发文字要码 → 结束本轮 → 下轮收码。
> 跨轮要点:**别每轮都重新起发布进程**——第 1 步只在最开始跑一次。后续轮里先 `cat outputs/_login/douyin.publish.json` 看它是否还在 `sms_required`/`verifying`,在就只写码/轮询,不要重复 publish。
把**纯数字**写进码文件(一次性消费,脚本读走即删):
printf '%s' "123456" > outputs/_login/douyin.code
请求重发(脚本收到信号会在墙上点「重新发送」再下发验证码,一次性):
touch outputs/_login/douyin.code.resend
继续轮询直到 `success`/`error`。码错会退回 `sms_required`,可再要一次重写。
要点:验证码文件内容是纯数字(4–8 位);**全程保持"后台脚本 + 短轮询"模式**——绝不要同步前台阻塞跑发布(不带 `&`)再想中途问用户(Bash 会一直卡住直到脚本退出)。发布页(Web「发布中心」)已用同一套文件协议自动弹原生输入框,与对话页无关、无需 agent 介入,任何版本都能用。
**速度要点(决定成败)**:墙出现 → 脚本识别(≤15s)→ 你读到 `sms_required` → **数秒内**要码(卡片模式弹卡 / 文字模式发消息,别先长篇解释)→ 拿到码 → **立即**写码文件(一条 `printf` 的事,不拖)。任何环节拖 30 秒以上,用户手机上的验证码就可能过期要重发。文字模式跨轮无妨(后台等 300s),但你自己收到码后别拖着不写。
按 AGENTS.md「发布前人设一致性检查」:先 **skill-persona-check** 比对内容×画像,评分喂 `python skills/shared/scripts/persona_gate.py check --score 85`——低于 80 分时警告并给修改建议, 但不阻断发布;用户已明确要发布就继续执行。
python skills/shared/scripts/persona_gate.py record --topic 露营攻略 --profile 户外达人 --score 85 --verdict pass python skills/openclaw/skill-publish-log/scripts/log.py record --platform 抖音 --title "周末露营攻略" --profile 户外达人 --persona-score 85 --persona-verdict pass --skill-source skill-douyin-upload
python skills/shared/scripts/douyin_publish.py check python skills/shared/scripts/douyin_publish.py login # 抠二维码扫码 python skills/shared/scripts/douyin_publish.py plan --title T --video /abs/v.mp4 --tags "旅行,攻略" python skills/shared/scripts/douyin_publish.py publish-video --exec --headed \ --title "标题" --content "简介" --video /abs/v.mp4 --tags "旅行,攻略" python skills/shared/scripts/douyin_publish.py publish --exec --headed \ --title "标题" --content "简介" --images /abs/a.jpg,/abs/b.jpg
An open-source AI agent for social media — discover trends, create content, publish everywhere, and learn what works across Xiaohongshu, Douyin, Zhihu, Bilibili, and more.🎨一个开源的 AI 社交媒体智能体——发现热点趋势、创作内容、一键发布至各大平台,并学习分析哪些内容真正有效,覆盖小红书、抖音、知乎、哔哩哔哩等平台。
Repo: zju-real/easel
通用 AI 生图:文生图 / 图生图 / 图像变体。当用户说 AI 生图、AI 画图、文生图、图生图、生成图片、生成配图、图像生成、AI 出图、AI…
AI 音乐 / BGM 生成:给短视频、社媒内容生成原创背景音乐 / 配乐 / 纯音乐。通过可插拔 provider(阿里 DashScope / Suno 类第三方…
AI 视频生成:文生视频 / 图生视频 / 数字人首帧驱动。通过可插拔 provider(通义万相 Wan / 火山 Seedance / 快手可灵 / OpenAI…
outputs/ 目录下的产物管理:按日期/平台/类型归档、打标签、搜索历史内容、生成素材清单。 当用户说"整理素材"、"归档"、"找之前的内容"、"搜索历史"、"素材管理"、…
音频降噪:去除录音中的背景噪声、电流声、风噪、嗡嗡声,基于 ffmpeg 滤镜链(afftdn/highpass/lowpass)。…
通用音频处理:音频剪辑/裁剪、格式转码(mp3/wav/m4a/aac)、音量归一化、从视频提取音轨、多段拼接、淡入淡出、变速(保音高)。当用户说“剪音频”“裁一段”“转成…