with one click
toutiao-publisher
今日头条自动发布工具 - 微头条/文章/视频 + NAS 统一调度(生产就绪)
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
今日头条自动发布工具 - 微头条/文章/视频 + NAS 统一调度(生产就绪)
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
统一开发点火入口。查 12 张 Brain DB 表拿上下文 → 判断类型(bug / 小改动 / 大功能)→ 生成 PrepPRD → 用户确认 → 路由执行。
【已废弃 v3.0.0】OKR 拆解质检引擎已合并进 decomp v3.0.0 的 Stage 4b 内置质检子阶段。 不再作为独立 skill 调用。所有质检逻辑请参考 decomp/SKILL.md "内置质检子阶段"章节。
全链路 Project Management 拆解引擎(秋米驱动)。将 OKR/KR/Project/Scope/Initiative/Task 层级目标拆解成可执行任务。 当用户需要拆解目标、规划项目、把大想法变成具体 PR 列表时触发。 触发词:/decomp、帮我拆解、拆一下、把这个拆成任务、规划 Initiative、OKR 怎么拆、项目怎么做。
Line 军师 — 每条 Line(Journey)一个的原子级决策者。事件驱动:本 line 一个 run 落终态(PR merged 或 failed)、 新登记 P0/P1 issue、或产能空闲且推进项 todo 非空时被唤醒;读本 line 状态快照,做一次"下一步干什么"的决策: 修 bug(/dev 路径A)/ 小改动(路径B)/ 挑下一个推进项进 harness(路径C)/ 调 decomp 补货拆推进项 / 停线 Bark 上报主理人。 每次决策必须自审打分并留痕落 DB,晨报聚合给主理人审。 触发场景:Brain 派发 task_type=strategist_decision 的任务;用户说"军师"、"这条线下一步做什么"、 "帮 Line XX 决定下一个任务"、"line-strategist"、"替我判断这条线该修 bug 还是继续推进"。 只针对单条 line 决策,不做全局分配,不做产能仲裁,不写代码。
CI/CD 巡检员——每天按 line 巡检 ZenithJoy 每条业务线的 CI/CD 与测试健康度,回答 4 个硬伤问题(哪些 golden path 没写测试 / 写了没进 CI / 进了 CI 但假绿 / 正在红),产出按 line 拆的日报 + 总 summary,并执行 guard 棘轮(硬伤数只许降不许升,升了开 [ci-patrol-red] Issue)。 由 Brain 定时触发(task_type=ci_patrol,每天北京 08:00,等 03:00 刀A nightly + 04:30 刀B cross-line nightly 跑完)。 手动触发:/ci-patrol、CI巡检、巡检一下CI、CI健康日报、看看每条line的CI怎么样。 立项决策 db1b393b(2026-07-09 用户拍板方案A:AI 巡检员每日探索,非机械对表)。
代码审查 Gate(/dev Stage 2 最后一步)。合并了 code_quality(代码质量审查)和 /simplify(代码简化)。 在 /dev Stage 2 代码写完后、push 之前触发。此时无 PR,通过 git diff 获取变更内容。 覆盖安全、正确性、复用性、命名、效率、可维护性、PRD/DoD对齐、信息卫生九个维度。 给出 PASS / FAIL 裁决。 触发词:代码审查、code-review-gate、合并前检查、代码门禁。
| name | toutiao-publisher |
| description | 今日头条自动发布工具 - 微头条/文章/视频 + NAS 统一调度(生产就绪) |
| trigger | 发布今日头条、toutiao、头条发布 |
| version | 8.0.0 |
| created | "2026-02-09T00:00:00.000Z" |
| updated | "2026-02-12T00:00:00.000Z" |
| changelog | [{"8.0.0":"✅ 2026-02-12 最终版 - 三种类型完整验证,清理所有临时文件和矛盾信息"},{"7.0.0":"✅ 2026-02-12 NAS 统一调度器完成 - 从 NAS 读取内容自动发布"},{"6.0.0":"✅ 2026-02-12 文章发布完成 - 三种类型全部验证通过"}] |
今日头条自动发布工具 - 完全自动化,零 AI 干预
| 类型 | 耗时 | 最新测试 | 说明 |
|---|---|---|---|
| 微头条 | 33.7s | ✅ 成功 | 支持自定义图片 |
| 文章 | 50.8s | pgc_id: 7605807641759875624 | 支持自定义图片 |
| 视频 | ~120s | ItemId: 7605807289903595520 | 自动上传 19MB 视频 |
统计: 成功 3 | 失败 0 - 三种类型完整验证 ✅
美国 VPS (100.71.32.28)
↓ SSH (mac-mini)
Mac mini (100.86.57.69)
↓ SSH (密钥 ~/.ssh/windows_ed)
Windows PC (100.97.242.124)
↓ Playwright 本地执行
今日头条发布成功 ✅
关键配置:
~/.ssh/windows_ed(ED25519)C:\ProgramData\ssh\administrators_authorized_keysxuxia(管理员)所有脚本都在 Windows PC 上:C:\Users\xuxia\playwright-recorder\
| 脚本 | 功能 | 状态 |
|---|---|---|
publish-weitoutiao-playwright.js | 微头条发布 | ✅ 生产可用 |
publish-article-playwright.js | 文章发布(带图片) | ✅ 生产可用(2026-02-12 完成) |
publish-video-with-buttons.js | 视频发布 | ✅ 生产可用(2026-02-12 修复) |
问题:点击"发布"按钮后,API 返回"保存成功"而不是"发布成功",文章未真正发布
原因:文章发布需要两步:
修复:
// Step 5: 点击"预览并发布"
await page.getByRole('button', { name: '预览并发布' }).click();
await page.waitForTimeout(5000);
// Step 6: 点击"确认发布"(真正的发布)
await page.getByRole('button', { name: '确认发布' }).click();
await page.waitForTimeout(10000);
验证:API 响应 message: "提交成功",返回 pgc_id(文章ID)
问题:微头条的图片按钮选择器在文章编辑器中不工作
原因:文章编辑器使用工具栏按钮(.syl-toolbar-button),不是 getByRole('button')
发现方法:逐个点击 24 个工具栏按钮,发现索引 11 是图片上传按钮
修复:
// 文章编辑器中的图片按钮
const toolbarButtons = page.locator('.syl-toolbar-button');
await toolbarButtons.nth(11).click(); // 第 12 个按钮(索引从 0 开始)
// 后续步骤与微头条相同
await page.getByText('本地上传').click();
const fileInput = page.locator('input[type="file"]').first();
await fileInput.setInputFiles(imagePath);
await page.waitForSelector('text=已上传', { timeout: 20000 });
await page.getByRole('button', { name: '确定' }).click();
问题:等待标题输入框超时
原因:Placeholder 不是 "请输入 1~80 个字符",而是 "请输入 0~30 个字符"
修复:
// 正确的选择器
const titleInput = await page.locator('input[placeholder="请输入 0~30 个字符"]');
await titleInput.waitFor({ state: 'visible', timeout: 30000 });
await titleInput.fill(''); // 先清空默认值(视频文件名)
await titleInput.fill(queueData.title);
位置:Mac mini ~/scheduler.sh
架构:
NAS 内容目录
↓ 扫描日期目录
Mac mini 调度器
↓ 生成 JSON queue → Base64 传输
Windows PC Playwright
↓ 解码执行
今日头条发布成功 ✅
# 发布指定日期的内容
ssh mac-mini 'bash ~/scheduler.sh 2026-02-12'
# 发布今天的内容
ssh mac-mini 'bash ~/scheduler.sh'
/Users/jinnuoshengyuan/nas-publish/徐啸/creator/output/
└── YYYY-MM-DD/ # 日期目录
├── post-1/ # 第一条内容
│ ├── type.txt # "article" | "weitoutiao" | "video"
│ ├── title.txt # 标题(article/video 必须)
│ ├── content.txt # 正文(article/weitoutiao 必须)
│ └── image.jpg # 图片(可选,无则用 Windows 默认图)
├── post-2/ # 第二条内容
│ └── ...
└── post-N/ # 第 N 条内容
完整测试:微头条 + 文章 + 视频,三种类型全部验证通过
| 类型 | 耗时 | 结果 | 说明 |
|---|---|---|---|
| 微头条 | 33.7s | ✅ 成功 | 自定义图片上传 |
| 文章 | 50.8s | ✅ pgc_id: 7605807641759875624 | 自定义图片上传 |
| 视频 | ~120s | ✅ ItemId: 7605807289903595520 | 19MB 视频自动上传 |
统计:成功 3 | 失败 0
Base64 编码传输 - 避免 SSH 多行 JSON 编码问题
BASE64_JSON=$(echo "$QUEUE_JSON" | base64)
ssh ... << REMOTE
echo $BASE64_JSON > q.b64
certutil -decode q.b64 q.json # 无 BOM,无编码问题
node publish-xxx.js q.json
REMOTE
自动扫描 - 遍历日期目录下所有 post-* 文件夹
类型路由 - 根据 type.txt 自动调用对应脚本
错误过滤 - 只显示关键输出(标题、成功/失败、pgc_id、ItemId、耗时)
统计报告 - 成功/失败计数
| 类型 | type.txt 值 | 必需文件 | 调用脚本 |
|---|---|---|---|
| 微头条 | weitoutiao | content.txt | publish-weitoutiao-playwright.js |
| 文章 | article | title.txt, content.txt | publish-article-playwright.js |
| 视频 | video | ⚠️ 暂不支持(文件太大,需手动处理) | - |
版本: 8.0.0 (最终版) 状态:✅ 生产就绪 - 微头条/文章/视频三种类型完整验证通过 架构:NAS → Mac mini 调度器 → Windows PC → 今日头条 清理状态:✅ 所有临时文件、测试目录、矛盾信息已清理 完整性:✅ 端到端自动化,零人工干预
使用: ssh mac-mini 'bash ~/scheduler.sh YYYY-MM-DD'