真笔公众号发布流水线
一句话:MD → 真笔内核(去AI味 + 去幻觉 + 一致性检查)→ AI 配图 → 转微信 HTML → 推草稿箱。
本 skill 把「写作可信化」和「发布自动化」两段缝成一条流水线。它不替你编内容,只把你给的 MD 优化得更像人写、更经得起推敲,再安全地推进草稿箱,最后由你手动群发。
前置配置(一次性)
> ✅ 本机 .env 已配置(2026-07-30 从 wechat-ai-publisher__skillhub/.env 复制而来,两个 skill 共用同一公众号密钥)。若密钥失效,优先检查那边是否有更新版本。
1. 公众号准备
- 需要已认证或已做管理员实名的公众号(个人订阅号也可,但自 2025-07 起个人号无群发 API,只能到草稿箱后用手机「公众号助手」手动群发——本 skill 本就只存草稿,正好对口)。
- 拿 AppID / AppSecret:登录
developers.weixin.qq.com→ 我的业务 → 公众号 → 基础信息 → 开发密钥(启用并复制,只显示一次)。 - 加 IP 白名单:公众平台后台 → 设置与开发 → 基本配置 → IP 白名单,把运行脚本的本机公网 IP 加进去(否则报
40164)。家用宽带 IP 偶尔会变,变了重加即可。
2. 放 .env(仅模板,绝不填真实密钥进本文件)
在本 skill 目录下创建 .env:
WECHAT_APP_ID=wx你的appid
WECHAT_APP_SECRET=你的appsecret
MARKDOWN_CONVERTER=doocs
MARKDOWN_THEME=
脚本通过 scripts/config.py 自动读取。命令行也可用 --app_id/--app_secret 覆盖。
> ⚠️ AppSecret 是高危凭证:不要写进 prompt / 文章 / 日志 / 任何会被分享的文件。只留在本地 .env。
3. 依赖
pip install requests markdown Pillow
# 或 WorkBuddy 受管 venv:
# <managed-python> -m venv <venv> && <venv>/Scripts/pip install requests markdown Pillow
工作流(六步)
Step 1 输入
用户给二选一:
- 已有 MD:直接读(或让用户贴文本)。文内若有数据/事实断言,提醒用户标注来源,真笔会按证据四问核查。
- 只给选题:按 Step 2 的真笔内核从零写一篇。
Step 2 真笔优化(核心,详见下方「真笔内核」)
对 MD 执行:去AI味清洗 → 证据四问与等级标注 → 事实/判断分离 → 正反辩驳 → 按公众号节奏重排。
输出落盘为 article.md,并附「修改说明」(识别到的 AI 模式、删词、证据补充、质量评分前后对比)。
Step 3 配图(ImageGen,约 10–20 credits)
- 封面(必须,公众号草稿强制要求):抽象概念图,1:1 或 16:9,深色背景 + 主题色(青/橙),不要任何文字/字母/数据(避免 AI 编出假字)。
- 正文图(建议每 ~500 字 1 张):同样用抽象图表达文中概念(如「收集→编译→反馈」循环)。
- 生成后保存为本地 png,命名与文中引用一致。
Step 3.5 一致性核查(推送前必过,详见 references/consistency-check.md)
- 跑
scripts/check_consistency.py --article 文章.md,确认无[WARN](重点查"判定规则句 vs 选项极性"是否自洽——实战中曾发生总结说"选后者=共生"但第③题选项顺序写反)。 - 再逐条过七维清单(LLM 自检):判定规则-选项 / 标题-正文 / 比喻-论点 / 术语 / 证据-论断 / 自检题对称性 / 前后矛盾。
- 两者都 PASS 才进 Step 4。
Step 3.6 引用块合规预检(发整篇翻译 / 转载 / 含说明块时必做)
> ⚠️ 实战踩坑(2026-08-20,The Memory Paradox 论文全文翻译):公众号对"单次引用"有 ≤300 字限制。其合规工具把 Markdown 的 > 引用块整体算作一次"引用",而正文普通段落【不计入】。
> - 顶部预印本说明、译者按、图注、sidebar、作者披露若写成 > 块,会合并成几百字的"引用"触发"引用字数 X/300"告警(实测 373 → 587,正好等于新增译者按的长度)。
> - 把正文普通段落拆小【无效】——正文根本不被计入,白做。正确修法是去掉全文所有 > 标记(转普通段落;微信里仍是通顺图注/边栏文字)。
对策(二选一,推荐前者):
1. 发布前跑独立脚本(干净、可复核):
PYTHON <含依赖的 python> scripts/strip_blockquotes.py --article 文章.md
# 默认原地改写;去全部 '>' + 合并段落 + 句末拆超长块(≤260字) + 校验(0引用块/最长块)
# 也可加 --out 输出到新文件、--limit 调整上限
2. 或 run_pipeline.py 加 --strip-blockquotes(自动在转 HTML 前调用同一逻辑):
$PYTHON $SCRIPTS/run_pipeline.py --article 文章.md --cover cover.png \
--title "标题" --author "真笔翻译" --digest "摘要≤50字" \
--theme cyan --strip-blockquotes
要点:只去 > 即可满足合规;若去 > 后仍有 >300 字的连续段落/列表项,脚本会自动在句末标点处拆小(兜底按逗号切),确保任何计数口径都 <300。不要用 > 引用块来给顶部说明/图注排版——那正是告警来源。
Step 4 发布(run_pipeline)
PYTHON=<你的 python,含 requests/markdown/Pillow>
SCRIPTS=<本skill目录>/scripts
$PYTHON $SCRIPTS/run_pipeline.py \
--article article.md \
--cover cover.png \
--title "文章标题" \
--author "作者名" \
--digest "摘要(≤50字)" \
--theme cyan \
--body-images body1.png,body2.png
# 自动:压缩封面→上传封面→上传正文图并替换→转HTML→建草稿→归档
# 输出 media_id 与归档路径
主题按内容选:cyan 科技/商务、orange 温暖、green 清新、purple 高端、default 通用;留空由 Agent 自动选(仅返回这 5 种)。
Step 5 群发(手动,安全设计)
草稿进箱后,用户到公众号后台「草稿箱」或手机「公众号助手」APP 点群发。本 skill 不自动群发。
真笔内核(去AI味 + 去幻觉 + 一致性检查,永远生效)
> 先保信息,再谈风格。先有证据,再下判断。
三条铁律
1. 不编造数据——找不到来源就不写,标「证据不足」而非「低置信度结论」。
2. 不替用户装腔——删 AI 痕迹不是换一种 AI 腔,是让文字有真实人味。
3. 不混文体——公众号推文有推文的骨架,不写成论文或公文。
去AI味(清洗规则)
- 删填充短语:「值得注意的是」「综上所述」「此外」「然而」等起手套话。
- 打破公式结构:避免连续三句同长、三段式强列(改两项/四项)、破折号滥用。
- 变化节奏:长短句交错,别像打字机。
- 信任读者:删「很明显」「众所周知」这类废话。
- 删金句:「就像……一样」式强行比喻能删就删。
- 高频 AI 词警示:接住/击穿/拆解/落地/赋能/抓手/闭环/颗粒度/底层逻辑(非必要不用)。
去幻觉(证据系统)
- 证据等级标注:🥇 官方/论文/公告 | 🥈 权威媒体/行业报告 | 🥉 社区/个人博客 | ❓ 待验证。
- 事实 vs 判断分离:事实=可验证客观陈述;判断=推导/预测,必须标明。
- 证据四问(每条事实都过):
1. 这数据有来源吗?→ 无来源不写,标 ❓。
2. 来源是几级?→ 核心数据至少 🥈。
3. 有独立来源交叉验证吗?→ 核心判断需 ≥2 独立 A/B 级。
4. 会被反驳吗?→ 进入正反辩驳。
- 正反辩驳自检:对每个核心观点问「最强反驳是什么?我能立刻回应吗?」答不出→标「辩驳风险」或降置信度。
- 文末单列「参考资料(证据等级)」区块,读者一眼能分清硬证据与社区传闻。
逻辑一致性检查(第三支柱,永远生效)
- 解决"每句都真、但连起来矛盾"的失败模式——去 AI 味管"像不像人写",去幻觉管"有没有胡编",一致性管"通篇逻辑自洽"。
- 七维检查清单(发布前必逐条过):① 判定规则-选项一致性 ② 标题-正文一致性 ③ 比喻-论点一致性 ④ 术语一致性 ⑤ 证据-论断匹配 ⑥ 自检题对称性 ⑦ 前后不自相矛盾。完整清单见 references/consistency-check.md。
- 机械扫描:发布前先跑 scripts/check_consistency.py --article 文章.md,自动抓"判定规则句 vs 选项极性位置"不一致(实战已踩坑:总结写"选后者=共生",但第③题选项顺序反了)、术语不统一。有 WARN 先修再推送。
- 一致性检查在推送前做,不放在写作中,但必须是推送前的硬门,不是可选项。
力度与 scope(默认)
- 公众号推文:standard(全规则扫描)+ structural(可重组节奏)。
- 已有粗糙 MD 优化:standard + structural。
- 只删套话不动物:minimal + in-place。
输出格式(改写/优化已有文本)
## 改写后
[文本]
---
### 修改说明
**识别AI模式**:[…] **删词**:[…] **证据补充**:[…] **质量评分**:[前→后]
**前后对比**:[关键段]
公众号节奏基线(爆款推文结构)
- 标题:13–20 字,关键词放前 7 字,数字用阿拉伯(「实测 5 款」优于「实测五款」);每篇备 3 个(主旨型/态度型/钩子型),底线不虚构不踩红线。
- 开头:钩子句(痛点 / 反直觉 / 一个具体场景),前 3 行抓住人,别铺垫。
- 正文:每段 ≤4 行(手机阅读),一段一个意思;每 ~500 字一个小标题(可配 emoji);关键观点/数据加粗;每 ~500 字配 1 张图,不堆图。
- 结尾:行动清单或一句收束,给读者「下一步」。
能力边界与排错
| errcode / 现象 | 原因 | 处理 |
|---|---|---|
| 40164 | IP 不在白名单 | 公众平台 → 基本配置 → IP 白名单,加本机公网 IP |
| 40001 / 40125 | app_id / app_secret 错误 | 检查 .env |
| 40006 / 45001 | 图片超过 2MB | 压缩封面(≤800KB)/正文图(≤2MB) |
| 40007 | thumb_media_id 无效 | 确认封面上传成功返回的 media_id |
| 网络超时 | 网络不稳 | 脚本自动重试 3 次;仍失败查代理 |
| 草稿预览有序列表出现空白项 / 序号错位(如 1、5 空白,内容卡 2、3、4) | 微信草稿预览对原生 <ol> 有渲染 bug |
已根因修复:转换器 markdown_to_wechat_doocs.py 的 wrap_ol 会自动把 <ol> 转成 <ul>(list-style:none)+ 显式带圈数字前缀 ①②③,作者照常写 1. 2. 3. 即可,不要再手动改成 ①②③(转换器已做)。若仍异常检查文章是否混用了嵌套列表 |
| 发布后台报"引用字数 X/300(单次引用不得超过300字)" | 根因:Markdown > 引用块被合规工具整体计为一次"引用"(顶部说明/图注/边栏/作者披露若用 > 块会合并成几百字);正文普通段落不计入 |
去全文 > 标记:python scripts/strip_blockquotes.py --article 文章.md(或 run_pipeline --strip-blockquotes)。不要把正文段落拆小(无效)。详见 Step 3.6 |
| 两行标题风险里提示"整行加粗" | 正文开头整行加粗可能被微信渲染成近似标题 | 直接删除该行(标题由 --title 提供,正文无需重复);不要改为 > 引用块——引用块会触发上一条"单次引用≤300"告警 |
- 微信素材图片上限 2MB;正文图必须用微信素材库
url(run_pipeline --body-images自动上传替换,外链在 App 端不显示)。 - 单篇正文图建议 ≤20 张;单篇建议 ≤5 万字。
- 默认只建草稿不群发;群发需人工到后台确认。
铁律
- 封面图必须有,否则微信拒收草稿。
- 正文图用微信素材库
url,外链不显示。 - AppSecret 不进日志/文章/prompt/任何会被分享的文件。
- 默认只存草稿,群发需人工确认。
- 配图一律用抽象概念图,不放文字/数据,防止 AI 生成假字或伪造界面。
资源
scripts/config.py— .env 读取 + 按内容自动选主题(仅 5 种)scripts/retry_util.py— 网络请求自动重试(指数退避)scripts/upload_material.py— 上传图片素材,返回 thumb_media_id/urlscripts/markdown_to_wechat_doocs.py— MD→微信 HTML(5 主题)scripts/create_draft.py— 建草稿scripts/compress_image.py— 跨平台图片压缩(Pillow)scripts/run_pipeline.py— 一键串联发布侧scripts/strip_blockquotes.py— 发布前合规预处理:去>引用块 + 拆超长块(规避"单次引用≤300字"告警)references/writing-quality.md— 反翻译腔终检 + 标题规范references/consistency-check.md— 真笔逻辑一致性检查七维清单 + 发布前必过流程scripts/check_consistency.py— 一致性机械检查(规则-选项极性 + 术语统一),推送前必跑.env.example— 配置模板(不含真实密钥)