zhy-wechat-writing
微信公众号写作系统
Purpose
根据用户提供的主题(可选参考URL),自动完成公众号文章写作全流程:多来源检索与证据池整理、初稿生成、自审润色、参考资料整理,并可选自动配图与保存到公众号草稿箱(不提交发布)。
When to Use
- 用户请求"写一篇关于XXX的公众号文章"
- 用户请求"生成公众号文章,主题是XXX"
- 用户需要完整的公众号文章创作流程
- 用户希望"写完后自动配图"或"写完后发到公众号草稿箱"
Prerequisites
执行前需要确认:
- 用户已提供文章主题(
topic) - 如有参考文章 URL,可一并提供(
urls) - 若
topic为纯中文且未提供slug,建议补充英文/拼音kebab-case目录名;否则会使用 ASCII 降级方案
Workflow
按照以下步骤顺序执行(产物默认落盘到 articles/<slug>/...,便于复跑与追溯):
Phase 0: Preflight
目标:确定可稳定复用的目录与路径规范
操作:
- 计算
slug- 若用户提供
slug:直接使用(推荐:英文/拼音kebab-case) - 若
topic含拉丁字母/数字:对其做kebab-case - 否则降级:
wechat-article-YYYYMMDD
- 若用户提供
- 创建目录:
articles/<slug>/articles/<slug>/sources/
- 规范:Markdown图片引用必须使用相对路径与
/分隔符
Step 1: 素材搜集
目标:搜集与主题相关的素材,并整理为可追溯的证据池
操作:
- 若用户提供
urls:并行使用webfetch获取内容,提取要点,并记录URL与可获得的发布日期 - 若用户未提供
urls:并行使用WebSearch做多来源检索(建议覆盖:官方文档 / X(Twitter) / Reddit / 技术论坛 / 微信公众号 / 工程实践)- official/authority:官方文档、标准/规范、权威媒体解读
- community:X(Twitter)、Reddit、论坛/讨论
- practice:GitHub issues、工程博客、案例复盘
- 推荐并行 query 模板(按需组合,尽量加年份/时间范围以强调近期):
{topic} official documentation/{topic} release notes 2025 2026{topic} site:x.com/{topic} site:twitter.com{topic} site:reddit.com/{topic} site:reddit.com/r/<subreddit>{topic} site:github.com issues/{topic} site:github.com discussions{topic} site:stackoverflow.com/{topic} site:news.ycombinator.com{topic} site:mp.weixin.qq.com(公众号){topic} 实战 复盘 踩坑 2025 2026(中文工程实践)
- 合并去重,按可信度分级(high/medium/low),形成证据池,落盘:
articles/<slug>/sources/evidence.md
工具映射:
- 本流程中的“搜索”使用:
WebSearch - 本流程中的“抓取网页内容”使用:
webfetch
关于 WebSearch(实现说明):
- 优先使用运行环境自带的
WebSearch工具。 - 若当前环境没有可用的
WebSearch:用webfetch抓取公开搜索结果页(SERP),从结果中提取 URL 列表后再并行webfetch正文内容。
证据池条目格式(每条必须包含):
- title
- url
- published_at(可得则写)
- source_type(official/community/practice)
- key_takeaways(3-6条要点,尽量可直接改写成正文素材)
- confidence(high/medium/low)
停止条件(建议):
- 候选来源 8-12 条,其中 medium/high >= 5 条
常见失败处理(新增):
- X/Reddit 登录墙或无法抓取正文:
- 优先选择可公开访问的镜像/引用(二手报道需标注
confidence=low/medium),或改抓同一观点的博客/论坛转载; - 若必须引用原帖:只使用 WebSearch 结果摘要 + 其他独立来源佐证,不编造细节。
- 优先选择可公开访问的镜像/引用(二手报道需标注
- SERP 抓取/解析失败(无 WebSearch 回退路径时):
- 改用“站内检索”策略:直接用
webfetch抓官方站点的搜索/博客索引页或 GitHub 搜索页; - 仍无法覆盖时:向用户要 3-5 个关键 URL 或指定信息源清单。
- 改用“站内检索”策略:直接用
- 去重与可信度:
- 同一事实至少 2 个独立来源佐证;
- 官方/一手文档优先标
high;社区讨论若无落地细节或无交叉验证标low。
输出:sources_path(证据池路径)
Step 2: 初稿生成
目标:基于素材生成公众号文章初稿
写作要求:
-
标题:吸引眼球,可使用以下技巧
- 数字型:
5个方法让你... - 提问型:
为什么...? - 对比型:
A与B的区别... - 悬念型:
你不知道的...
- 数字型:
-
开头(前3-5行):
- 提出痛点或引发共鸣
- 设置悬念或提出问题
- 明确文章价值
-
正文结构:
- 使用小标题分段(## 或 ###)
- 每段200-300字
- 包含案例、数据支撑
- 使用列表增强可读性
-
结尾:
- 总结核心观点
- 引导互动(点赞、在看、评论)
- 可添加金句或行动呼吁
-
字数要求:1500-2500字
-
可追溯性要求(新增硬约束):
- 关键事实/数据/结论必须能在证据池中找到支撑
- 文章末尾必须追加
## 参考资料/来源(5-10条链接,尽量带日期)
输出:Markdown 格式初稿,保存到:articles/<slug>/article.md
Step 3: 智能审稿
目标:从四个维度审稿,发现问题
审稿维度:
| 维度 | 检查要点 | 权重 |
|---|---|---|
| 逻辑 | 论点清晰、论据充分、推理合理 | 30% |
| 表达 | 语言流畅、无AI痕迹、口语化适度 | 25% |
| 数据 | 数据准确、案例恰当、引用规范 | 25% |
| 结构 | 标题吸引、段落分明、首尾呼应 | 20% |
新增硬检查:
- 可追溯性:关键论断是否能在证据池中找到支撑
- 标题一致性:标题承诺是否在正文明确兑现
审稿操作:
- 逐段检查逻辑连贯性
- 标记AI痕迹词汇(如"综上所述"、"不难看出"等)
- 验证数据和案例的准确性
- 检查结构和节奏
评分标准:
- 90-100分:优秀,可直接发布
- 80-89分:良好,小幅优化即可
- 70-79分:合格,需要修改
- 70分以下:需要重写
输出:审稿报告(包含问题和修改建议),建议保存到:articles/<slug>/sources/review.md
Step 4: 润色打磨
目标:修复问题,提升文章质量
润色操作:
-
去除AI痕迹
- 替换词汇:
综上所述→总的来说总而言之→说到底由此可见→所以说不难看出→我们能发现众所周知→大家都知道
- 避免过于书面化的表达
- 替换词汇:
-
增强口语化
- 适当添加:
其实、说实话、不得不说 - 使用短句,避免长难句
- 加入过渡词,增强流畅度
- 适当添加:
-
优化节奏
- 长短句结合
- 适当使用感叹句、反问句
- 控制段落长度(建议不超过5行)
-
修复审稿问题
- 根据审稿报告逐项修复
- 补充缺失的数据或案例
- 调整不合理的结构
输出:最终文章
强制要求(新增):
- 最终文章必须保留或补齐
## 参考资料/来源 - 参考资料建议保留 5-10 条,按
official/community/practice分组更佳
Step 5: 保存与输出
操作:
- 创建输出目录(如果不存在):
articles/<slug>/
- 保存文章:
articles/<slug>/article.md
- 输出执行摘要:
article_pathsources_path- 字数统计
- 审稿评分
Step 6: 自动配图(可选,调用 zhy-article-illustrator)
触发条件:with_illustrations=true
目标:为文章生成统一风格的高完成度配图,并产出插图版文章
默认策略:
article_path:使用articles/<slug>/article.mdslug:复用当前文章 slugdensity:illustration_density(默认 balanced)upload:illustration_upload(默认 false)aspect_ratio:illustration_aspect_ratio(默认 16:9)prompt_profile:illustration_prompt_profile(默认 nano-banana)text_language:illustration_text_language(默认 zh-CN)english_terms_whitelist:illustration_english_terms_whitelist(默认空)image_provider:illustration_image_provider(默认 xiaomi)image_model:illustration_image_model(默认 gemini-3.1-flash-image-preview)image_size:illustration_image_size(默认 1K)image_base_url:illustration_image_base_url(默认 Xiaomi 接口地址,也支持 Gemini 原生代理)
执行方式:
- 优先调用
zhy-article-illustrator的一键流程脚本:node <zhy-article-illustrator>/scripts/illustrate-article.ts \ --article articles/<slug>/article.md \ --slug <slug> \ --density <illustration_density> \ --aspect-ratio <illustration_aspect_ratio> \ --prompt-profile <illustration_prompt_profile> \ --text-language <illustration_text_language> \ --image-provider <illustration_image_provider> \ --image-model <illustration_image_model> \ [--image-size <illustration_image_size>] \ [--image-base-url <illustration_image_base_url>] \ [--upload] - 若
illustration_english_terms_whitelist非空,则为每个术语追加--term <value>,例如:--term Playwright --term Chromium --term Firefox --term WebKit - 默认沿用新版配图策略:
- 先生成文章级
visual-bible.md - 再生成
outline.md与prompts/ - 默认图片内文字为简体中文,仅白名单术语保留英文
- 同一篇文章内所有图片共享统一风格体系
- 先生成文章级
- 写作技能在集成时应遵循以下字段映射:
article_path -> --articleslug -> --slugillustration_density -> --densityillustration_aspect_ratio -> --aspect-ratioillustration_prompt_profile -> --prompt-profileillustration_text_language -> --text-languageillustration_image_provider -> --image-providerillustration_image_model -> --image-modelillustration_image_size -> --image-sizeillustration_image_base_url -> --image-base-urlillustration_upload=true -> --upload
输出:
illustrated_article_path:articles/<slug>/article.illustrated.mdillustrations_dir:articles/<slug>/illustrations/<slug>/articles/<slug>/illustrations/<slug>/visual-bible.mdarticles/<slug>/illustrations/<slug>/outline.mdarticles/<slug>/illustrations/<slug>/prompts/
失败处理:单张失败可重试一次;仍失败则记录并继续,最终输出失败清单。若部分图片失败,也应保留 article.illustrated.md,并插入图片占位注释。
Step 7: HTML 主题样式输出(可选,调用 zhy-markdown2wechat)
触发条件:with_html_theme=true
目标:使用 zhy-markdown2wechat 技能将 Markdown 转换为带微信内联样式的 HTML
操作:
- 选择输入文件:
- 若
with_illustrations=true且articles/<slug>/article.illustrated.md存在,则使用该文件 - 否则使用
articles/<slug>/article.md
- 若
- 将选中的 Markdown 文件记为
<input_markdown> - 调用
zhy-markdown2wechat技能,执行转换脚本:node <zhy-markdown2wechat>/scripts/convert.js \ <input_markdown> \ <zhy-markdown2wechat>/resources/themes/default.css \ articles/<slug>/article.zhy.html- 脚本零依赖(纯 Node.js),无需
npm install,自动在临时目录处理后清理 - 输出包含
<section id="MdWechat">容器与完整内联 CSS 样式 - 如需换肤,可将第二个参数替换为
resources/themes/下的其他主题文件(apple.css/blue.css/dark.css/green.css/notion.css/vibrant.css) <zhy-markdown2wechat>表示当前环境中该技能的安装目录,运行时应以实际路径为准
- 脚本零依赖(纯 Node.js),无需
- 输入文件示例:
- 若存在插图版文章:
<input_markdown>=articles/<slug>/article.illustrated.md - 若不存在插图版文章:
<input_markdown>=articles/<slug>/article.md
- 若存在插图版文章:
输出:html_article_path(articles/<slug>/article.zhy.html)
失败处理:记录错误并在执行摘要中注明原因,跳过该步骤并继续后续流程
Step 8: 保存到公众号草稿箱(可选,调用 zhy-wechat-publish)
触发条件:post_to_wechat=true
默认行为:通过微信官方 API 保存到草稿箱,不做最终发布提交
前置条件:
zhy-wechat-publish技能目录下的.env已配置WECHAT_APP_ID与WECHAT_APP_SECRET- 运行机器的公网 IP 已加入微信公众号后台 IP 白名单
- 若要自动生成封面,发布技能依赖的生图环境也必须可用(由
zhy-article-illustrator提供)
调用方式:
- 正文必须是带内联样式的 HTML 文件
- 优先使用 Step 7 生成的
article.zhy.html;若不存在则跳过本步骤(或先补执行 Step 7) - 默认推荐的稳定入口是直接调用
wechat_draft.js:node <zhy-wechat-publish>/scripts/wechat_draft.js \ --title "文章标题" \ --file "articles/<slug>/article.zhy.html" \ [--author "作者"] \ [--digest "摘要"] \ [--thumb "封面media_id"] \ [--source-url "原文链接"] \ [--need-open-comment "1"] \ [--only-fans-can-comment "1"] - 若希望自动生成封面并发布,也可调用:
node <zhy-wechat-publish>/scripts/publish_with_cover.js \ --article "articles/<slug>/article.md" \ --html "articles/<slug>/article.zhy.html" \ [--title "文章标题"] \ [--author "作者"] \ [--source-url "原文链接"] \ [--need-open-comment "1"] \ [--only-fans-can-comment "1"] <zhy-wechat-publish>表示当前环境中该技能的安装目录,运行时应以实际路径为准wechat_draft.js未提供--thumb时会自动读取.env中的WECHAT_DEFAULT_THUMB_MEDIA_IDpublish_with_cover.js会自动从文章中提取标题/摘要、生成单张 16:9 封面、上传封面,并将返回的media_id作为thumb_media_id- 发布脚本会在上传前自动展开 HTML 中的
var(--xxx)样式变量,避免微信草稿箱丢失颜色与边框样式 - 发布脚本会在上传前自动将正文中的图片上传到微信正文图片接口,并将
<img src>替换为微信返回的图片 URL - 发布脚本会在上传前将原生列表结构降级为“普通段落 + 圆点/编号”,以兼容微信草稿箱再次进入编辑模式时的列表解析问题
注意:
- 脚本零依赖(纯 Node.js >= 16),无需
npm install - 使用
publish_with_cover.js时,需要本机可用bun,因为封面生成会复用现有生图脚本 - 草稿保存后不会自动提交发布,需人工在公众号后台确认
- 标题长度不得超过 64 字符
- 若当前环境没有可用生图配置,优先改用
wechat_draft.js直接上传 HTML,避免自动封面步骤失败
成功标准:输出 上传草稿成功! 草稿 MEDIA_ID: xxx
失败排障清单:
| 错误信息 | 原因与处理 |
|---|---|
[40013] invalid appid |
AppID 错误,检查发布技能目录下的 .env |
[40164] invalid ip |
当前 IP 未加白名单,将报错中的 IP 加入公众号后台 |
[40007] invalid media_id |
封面图 ID 无效,使用 upload_image.js 重新上传获取 |
缺少 Xiaomi/Gemini/OpenAI API Key |
自动封面生成依赖的生图环境未配置,检查 zhy-article-illustrator 相关 .env |
article.zhy.html 不存在 |
Step 7 未执行或失败,检查 with_html_theme=true |
| 标题过长 | 控制标题 <= 64 字符 |
Data Flow
用户输入(topic, urls?, slug?, search_count?, time_range_days?, ...)
↓
Preflight(确定slug与目录)
↓
素材搜集(WebSearch + webfetch → evidence.md)
↓
初稿生成(article.md)
↓
智能审稿(含可追溯性/标题一致性)
↓
润色打磨(强制References)
↓
自动配图(article.illustrated.md + illustrations/)
↓
HTML 主题样式输出(zhy-markdown2wechat → article.zhy.html)
↓
保存到草稿箱(不提交发布)
Error Handling
| 异常情况 | 处理方式 |
|---|---|
| 搜索无结果 | 提示用户提供更多信息或参考URL |
| 参考文章无法访问 | 跳过该URL,继续处理其他素材 |
| 初稿质量过低 | 重新生成或提示用户提供更多素材 |
| 审稿评分<70 | 建议用户检查主题是否合适 |
| 配图失败 | 输出失败清单;可选择补图后再发布 |
| HTML 转换失败 | 记录错误并跳过该步骤(Step 7),继续后续流程 |
| 发布到草稿箱失败 | 输出排障清单(AppID/IP白名单/封面media_id/标题长度) |
Example Usage
输入:
topic: "如何提高工作效率"
urls: ["https://mp.weixin.qq.com/xxx"]
search_count: 5
with_illustrations: true
with_html_theme: true
post_to_wechat: true
执行流程:
- 搜索"如何提高工作效率"相关文章
- 获取用户提供的参考文章内容
- 生成初稿(约1500-2500字)
- 审稿评分:85分
- 润色优化后保存
输出:
article_path: articles/how-to-improve-work-efficiency/article.md
sources_path: articles/how-to-improve-work-efficiency/sources/evidence.md
illustrated_article_path: articles/how-to-improve-work-efficiency/article.illustrated.md
illustrations_dir: articles/how-to-improve-work-efficiency/illustrations/how-to-improve-work-efficiency/
html_article_path: articles/how-to-improve-work-efficiency/article.zhy.html
word_count: 2150
review_score: 92
wechat_draft_status: success
Notes
- 文章风格应符合公众号调性:轻松、有用、有共鸣
- 避免敏感内容和过度营销
- 保持原创性,不要直接复制素材内容