公众号图文流水线(都爆鸭)
把一篇已经写好的图文走一串确定性步骤,存进用户自己公众号的草稿箱,返回 mediaId。
正文归 dby-write(或用户自带);取数、爆款样本、封面套路归 dby-api;合规检测归 dby-banned-words。
🔴 终态纪律:用户只要成稿就不跑本包——本包会写进他自己的公众号后台,是真实副作用。
终态未明先问一句,别默认往下推。
只想存草稿、不要排版
→ 正文已是公众号风格 HTML、无本地图也无本地封面时读 references/draft-only.md
(零依赖 Python 入口 scripts/publish_draft.py),不需要就别读。
流程声明:pipeline.json
10 步 SOP 与全部硬规则声明在 pipeline.json(steps[] + hardRules[])——它是人读的约定文档,
pipeline.mjs 不读取它,改流程要两边手工同步。「封面 / 配图」这一步由 agent 执行(图归 dby-image),其余步骤 pipeline.mjs 机械跑完。
本文只用步骤名不用序号;pipeline.mjs 日志里的「步骤 N」是脚本自己的机械步序,与 SOP 编号不对应。
→ 想逐步核对这 10 步分别做什么时读 references/sop.md,不需要就别读。
调用都爆鸭:本 Skill 用到的两条能力
只点名能力与详情端点;入参每次调用前现拉。
| operationKey | 详情端点 | 用在第几步 |
|---|---|---|
skill.wechat.render ⚠️专用 | GET /api/skills/wechat-render | 「md→HTML」(服务端排版那条路) |
skill.wechat.draftPublish ⚠️专用 | GET /api/skills/wechat-draft-publish | 「保存草稿」 |
生封面 / 生配图不在本包:出图归 dby-image,本包只消费它落盘的本地文件。
请求由 scripts/pipeline.mjs(及它调用的 preprocess-and-publish.mjs)代发;
绕开脚本自己拼请求时才读 dby-gateway/references/protocol.md(鉴权、密钥怎么拿、
先拉规格再拼参数、execution.target、信封格式)。
🔴 报错码是例外,走脚本一样要读:脚本原样抛错零解读,撞上就读该文件第 6 条
(429 按 IP 分桶,换 key、开新会话都没用,退避≤3 次且别加并发)。
🔴 两条专用路由的调用地址只在 target 里,从详情端点推不出来。
存草稿花钱、服务端排版渲染不花钱;现价从详情响应现拉现说,花钱的那步动手前先问用户。
→ 用户要的东西超出上面这两条时,读 dby-gateway/references/capability-index.md 选路、
读 routing-pitfalls.md 看已知的坑;正常流程里这两份都不必读。
写正文之前
- 🔴 正文不写标题,标题只走
--title——公众号总是拿草稿title渲大标题,正文里再写就显示两次;--html直发路径原样发出、没有去重,开头别放<h1>。--md路径兜了什么底见references/rendering.md。 - 正文不是走
dby-write写的 → 先拉写作规范,读references/writing-spec.md(dby-write第 1 步已经拉过这一份,别再拉一次)。 - 计费只在存草稿成功时发生,失败自动退回;具体扣多少以详情端点的实时点数字段为准,
别照文档里的数字替用户算钱。
402 INSUFFICIENT_CREDITS时提示用户到账户页查看余额与获取方式(点数只赠不卖),不要重试。 - 不写
--theme就是用你在排版工作室保存的默认排版;md→HTML 只走平台POST /api/wechat/render(免费),失败一律中止、绝不回退本机渲染器。 套哪套排版 / 老稿子重跑为什么长得不一样 /> [!NOTE]提示块 → 读references/rendering.md。
封面与配图(可选,图归 dby-image)
本包不出图。需要封面 / 配图时先走 dby-image 出图,拿到本地文件路径再接回流水线:
封面走 --cover <路径>;配图以 <img src=本地路径> 落进 Markdown 源对应 h2 小节末尾
(位置可先用 dby-image 的 plan-figures.mjs 按确定性规则规划),入源后重跑渲染,
配图才会获得主题图样式。上传与排布仍归本包(流水线原样保留每个 <img src> 并预上传本地图)。
用户已说「推」且没提封面 / 配图时不出图:只提示一次「不传封面就走兜底封面」,然后直接跑。
CLI 用法
🔴 防误发红线(无论走哪个入口都成立):只存草稿、绝不群发——没有任何群发路径,流水线拒绝任何
--mass-send/--broadcast/群发 参数;需先绑号(先在 doubaoya.com 把公众号授权绑定,本技能替不了你绑);
用户只要成稿时别自作主张跑它。存完请用户去后台亲眼确认,群发的手永远在用户自己。
export DOUBAOYA_API_KEY="dyh_…" # 或放 ~/.doubaoya/key、Keychain(account-verify 会找)
node scripts/pipeline.mjs --md article.md --title "标题" # 渲染 → 传图 → 存草稿
node scripts/pipeline.mjs --md a.md --title "标题" --render-only # 只渲染,拿在线预览链接
node scripts/pipeline.mjs --md a.md --title "标题" --dry-run # 发布前彩排,什么都不发
本机有多条 key 对应不同账号时,账号校验会停下要 --account <账号>,按报错列出的账号补上重跑。
🔴 跑完只认最终回报里的 mediaId——它是「已存入草稿箱」的唯一凭据,没有它就不当已存入。
存草稿失败 / 中途 Ctrl-C / 不确定草稿箱里有没有 → 读 references/recovery.md(重跑不幂等,会多存一份)。
→ 要指定账号 / 公众号 / 本地封面 / 摘要,或用 --html、--theme 的完整写法时读
references/cli.md,不需要就别读。
冷门分支:需要时才读,不需要就别读
| 用户在说 / 你要干的事 | 读哪份 |
|---|---|
| 只看排版(本机出稿看效果,不发) | 只读 references/rendering.md,其余都不读 |
哪个脚本干哪件事、想不走 pipeline.mjs 自己组合 | references/modules.md |
第一次用本包(还没有 config.json / 身份卡) | references/setup.md(config.json 属于你个人、别提交) |
把某个公众号的排版复刻成 theme.json | references/clone-theme.md(契约、校验器、现成主题怎么挑都在里面) |
前置条件
统一前置 Node ≥ 18,零外部依赖。本机渲染免密、无在线链接;平台渲染(--render-only)要密钥、有在线链接、不要绑号;
--dry-run 与存草稿要密钥且要绑号。
→ 逐层明细读 references/prerequisites.md,不需要就别读。
下一步(草稿存好之后)
草稿进箱即终点。还想往下走时:
| 用户接着想要什么 | 下一步 |
|---|---|
| 攒几天数据后看这个号的发文表现 / 做体检 | dby-api(打账号诊断能力 skill.wechat.accountAnalyzer) |
| 盯自己或竞品的发文节奏 | dby-api(打公众号发文列表端点) |
| 把已发布的文章拉正文归档 | dby-api |
| 用复盘信号挖下一轮选题 | dby-api(挖选题 / 追热点,也从这儿拉样本开写) |
| 说不清要到哪一步 | dby(公众号飞轮的逐跳导航) |
更新本技能
npx skills update dby-publish(全局安装的加 -g)。变更历史见 README.md。
- v4.0.22026-08-27内部维护更新(本条无面向用户的变化说明)
- v4.0.02026-08-26feat(dby-publish)!: 出图与设计工作台整套下线 —— 与 dby-image 是同一条上游能力的两套实现
- v4.0.12026-08-26chore(license): MIT 换成 PolyForm Noncommercial 1.0.0,附 doubaoya 终端用户额外许可
- v2.5.12026-08-26fix(dby-publish): 终态纪律改成本地一句话,不再引用他包的路由判据文件
- v3.0.02026-08-26feat(dby-publish)!: 瘦身 69 → 51 个文件 —— 包内 14 个主题是服务端旧副本,留着只会让排版对不上
- v2.5.02026-08-25fix(dby-publish): 发布失败不再谎报「已存入草稿箱」,并补上失败后怎么办 —— 抓不到 mediaId 就报「结果待确认」+ 非零退出
- v2.4.22026-08-25chore(skills): 11 个 SKILL.md 加 changelog 字段,patch 递增;盖戳生成 index.json 与四份兼容视图
- v2.4.02026-08-24refactor(dby): 逐包领域调研后的规则更正与触发词补齐
- v2.4.12026-08-24fix(dby-publish): --theme 裸 id 交服务端解析——显式路径那半的主题双源没被消掉
- v2.2.12026-08-24fix(dby-scripts): 外部 agent 模拟测试暴露的四处脚本缺口
- v2.4.12026-08-24fix(dby-publish): 六张风格样图重出——旧的在教用户做英文封面,还带着乱码和商标
- v2.1.02026-08-24feat(dby-publish,dby-write): 加 --render-only —— 只想看排版效果不必先绑公众号
- v2.4.12026-08-24fix(dby-publish): 报错码被划进「绕开脚本才读」——走脚本的 agent 撞上 429 只会重试
- v2.2.12026-08-24refactor(dby): 11 个 SKILL.md 按写作手艺去废话——删解释/元叙述/历史叙事/跨包重复红线,两处 description 去流程复述
- v2.2.02026-08-24refactor(dby): 11 个 SKILL.md 主体压到 ≤6000 字符——冷门分支下沉 references/,协议改引用不再内联;违禁词入口统一指 dby-banned-words
- v2.3.02026-08-24feat(dby-publish,dby-theme): 微信 draft/add 字段上限前置校验;主题校验器按官方编辑器规范加四条 warning
- v2.3.02026-08-24fix(dby): 20 场景模拟测试后的路由与文档修正
- v2.0.12026-08-22fix(dby-publish,dby-gateway): 撤回我上一轮的违规改动,并给能力索引加可执行的过期自查
- v2.0.02026-08-22feat(skills): 11 个包补齐语义版本,并用哈希逼它说实话
- v2.0.32026-08-22fix(dby-publish): 清掉两处真过期——README 的步数、三个没人读的配置项
- v2.0.22026-08-22fix(dby-publish): 主题清单写死成 4 个,而包里实际有 15 个
- v1.4.02026-08-21feat(dby-write): 写作规范接进写作流程,不再靠人转达
- v1.4.02026-08-21feat(dby-image): 补提示词工程与场景图库,并实测出 size 不是契约
- v1.4.02026-08-21fix(dby-publish,dby-theme): engine-2 报错不再教用户做一件不会发生的事
- v1.4.02026-08-21refactor(dby-publish): 正文 595→543 行,协议降级进 references,changelog 移出指令文件
- v1.4.02026-08-21fix(skills): 四个脚本补上 notice 转达,并加闸钉死这一类
- v1.4.02026-08-21fix(dby-image,dby-publish): size 参数完全无效——比例改由提示词控制(受控实测)
- v1.4.02026-08-21fix(dby-publish): 接住服务端的 notice —— 这条链断在流水线这一半
- v1.4.02026-08-21feat(dby-publish)!: 流水线 md→HTML 改走平台渲染,:: 组件语法退场
- v1.4.02026-08-21feat(skills): 新增 dby-image —— 生图独立成包,并修掉一处靠运气活着的隐式超时
更早 3 个版本见 GitHub
文件内容在 GitHub 查看。
- LICENSE1.1 KB
- README.md8.7 KB
- SKILL.md9.4 KB
- config.example.README.md3.8 KB
- config.example.json0.2 KB
- evals/triggers.jsonl1.0 KB
- pipeline.json5.0 KB
- profiles/README.md2.1 KB
- profiles/example-ip.json0.7 KB
- references/cli.md3.1 KB
- references/clone-theme.md6.9 KB
- references/draft-only.md1.7 KB
- references/modules.md1.8 KB
- references/prerequisites.md3.1 KB
- references/recovery.md2.8 KB
- references/rendering.md4.0 KB
- references/setup.md1.8 KB
- references/sop.md1.6 KB
- references/writing-spec.md2.7 KB
- scripts/account-verify.mjs15.5 KB
- scripts/archived-config-hint.selfcheck.mjs7.9 KB
- scripts/draft-limits.selfcheck.mjs1.5 KB
- scripts/extract-theme.mjs27.8 KB
- scripts/fetch-article.mjs13.7 KB
- scripts/import-theme.mjs30.0 KB
- scripts/lib/archived-config-hint.mjs8.4 KB
- scripts/lib/draft-limits.mjs1.9 KB
- scripts/pipeline.mjs42.9 KB
- scripts/preprocess-and-publish.mjs18.7 KB
- scripts/publish_draft.py9.5 KB
- scripts/render-wechat-html.mjs49.5 KB
- scripts/selfcheck-remote-theme.mjs21.2 KB
- scripts/validate-theme.mjs20.2 KB
- themes/benya-clean.json4.2 KB