如何为自己建立一个公众号发布工作流
前言
最近把我以前那个写了几篇前端文章的公众号给删了,创建了一个新的公众号,主要是用来介绍旅游相关的。当然仍旧是用AI发力。
开始
有了做lofi音乐的经验,我知道要做这种长期项目,首先就是要做项目管理。所以在开始之前,我让AI帮我做了三件事:
- 创建agents.md,用来约束整个项目的大方向
- 创建公众号文章的管理目录,以后每发一篇文章,都建一个项目的文件夹
- 创建工作流
AGENTS.md
这里我简单列一下当前的AGENTS.md的内容:
# 旅游公众号文章项目规则
## 项目目标
把用户提供的核心观点、工作标题和参考素材,稳定加工为可审阅的 Markdown、视觉预览和可复制到微信公众号编辑器的内联样式 HTML。
## Skill 路由
- 完整生产流程:使用 `$produce-travel-wechat-article`。
- 参考文章、文件和链接的入库、去重、关联与校验:使用 `$manage-travel-reference-library`。
- 选题、标题、大纲、正文、改写和内容审核:使用 `$write-travel-wechat-articles`。
- 初稿去 AI 味与事实、亲历、标记保护:使用 `$humanize-travel-wechat-article`。
- 内容确认后的语义排版和图片占位:使用 `$layout-wechat-article`。
- 主题选择和视觉令牌:使用 `$style-wechat-article`。
- 预览和微信公众号 HTML:使用 `$export-wechat-article`。
- 已导出文章写入微信公众号草稿箱:使用 `$push-wechat-draft`。
## 人群话术适配
文章面向情侣、亲子、银发、带父母、独行、低体力等明确人群时,必须先判断该人群的关系状态、情绪需求、行动限制和决策习惯,并把判断落实到标题、导语、章节标题、场景描述、提醒方式和文末互动中。不得只在标题或小标题贴人群标签,正文仍沿用无差别的普通攻略口吻。`brief.md` 必须记录与目标人群匹配的话术方向,改稿和去 AI 味时不得把这种人群语气重新磨平成通用文案。
- 情侣文章使用自然、轻甜、有相处感的话术。优先写并肩散步、共同看展、互相等待、替对方拍照、分享沉默、商量路线等具体互动,让甜味来自两个人的动作和关系变化;不得堆砌“浪漫、心动、甜蜜”等空泛形容词,不写油腻情话,不替读者断言关系阶段,也不得虚构作者恋爱亲历。开放时间、交通、体力和天气等实用信息仍须完整、准确。
- 亲子文章使用耐心、协作和能降低家长负担的话术,同时回应儿童年龄、兴趣、午休、如厕、安全和情绪退出条件;不得制造育儿焦虑、责备家长或把孩子统一写成低幼口吻。
...
## 城市写作统计
- 城市统计页固定生成到 `docs/china-city-index.html`,数据快照生成到 `docs/china-city-index.json`;二者均由脚本生成,不得手工修改。
- 单一主城市或主地区的中国目的地文章在生成预览前,必须在 `manifest.json` 写入 `city_index`:`{"include": true, "city": "城市或地区名", "province": "省级地区", "region": "华北/东北/华东/华中/华南/西南/西北"}`。同城多篇文章使用完全相同的 `city` 和 `province` 名称。
...
## 文章目录
每篇文章放在 `articles/YYYY-MM-DD-slug/`,使用以下固定文件:
- `brief.md`:写作要求。
- `sources.md`:内部素材记录,不进入发布版本。
- `draft.md`:内容初稿。
- `article.md`:内容确认稿。
...
## 必须遵守的门槛
1. 用户提供的参考素材必须先进入统一素材库并通过来源校验;初稿还必须通过 `$humanize-travel-wechat-article` 的保护校验和文章检查,再暂停等待用户确认内容。
2. 预览完成且图片全部就绪后暂停,等待用户确认视觉。生成 `preview.html` 后只报告文件路径,由用户直接手动打开;除非用户另行明确要求,Agent 不打开或控制浏览器、不启动本地预览服务,也不对预览执行截图检查。
...
## 内容与素材边界
- 不编造亲历、采访、账单、阅读量和现场细节。
- 去 AI 味不得改变数字事实、网址、核验项和图片占位,不得新增“亲测”“我去过”等素材未支持的第一人称经历。
...
## 验证
- 修改 Skill 后运行 `quick_validate.py`。
- 修改流水线或导出器后运行 `npm test`。
- 新增、删除主题或修改主题令牌后运行 `npm run theme:gallery`,更新 `docs/theme-gallery.html` 风格试样册。
- 发布前至少做一次真实微信公众号草稿粘贴检查,但不得执行发布。
文件管理

其实平时有些文件是多余的,我主要关心的是这些文件draft.md、preview.html以及assets目录。
- draft.md:AI生成的公众号初稿,每次生成完后,需要由我人工审核一遍
- assets目录:存放公众号图片的文件夹
- preview.html:在我确定draft.md内容没问题,assets目录下也已经准备好了公众号文章需要的图片后,根据内容和图片生成的可以直接复制到公众号后台的页面。
skills
这是本篇文章的重头戏。为了实现从一句话,直接生成一篇文章,我创立了一个完整的工作流,这个工作流由不同的skills来串联。

目前我建立公众号的流程是这样的:我会先在Codex中选定一个话题,比如最近是暑假,我会让Codex参考agents.md的要求,写一篇北京7、8月份推荐去处的公众号文章,接着它就会开始跑整个工作流。
即在 Codex 中提供核心观点、工作标题和参考素材,并要求使用 $produce-travel-wechat-article。总控会依次调用:
$manage-travel-reference-library:把参考文章、文件和链接统一入库并关联到文章。$write-travel-wechat-articles:生成draft.md。$humanize-travel-wechat-article:在保护事实、核验项、图片标记和亲历边界的前提下自然化draft.md。- 第一次人工确认:确认内容后生成
article.md。 $layout-wechat-article:生成layout.md和图片占位。$style-wechat-article:选择视觉主题。- 城市归档:单一主城市或主地区的文章在
manifest.json中登记city_index;全国性或跨多城文章明确标记为不统计。 $export-wechat-article:生成preview.html,并自动重建中国城市写作统计页。- 第二次人工确认:确认视觉后生成
wechat.html。
预览
目前有三种我需要通过直观的视觉来感受内容的页面:
- 公众号文章预览页
- 主题风格预览
- 城市文章归档
公众号文章预览页
这在上面已经介绍的很多了。在AI帮我生成完一篇draft.md草稿之后,如果我确认没有问题,我会跟AI说确认内容,之后它便帮我生成一个preview.html。随便点击一篇,大概长这样:

我可以直接把公众号文章一键粘贴到公众号的管理后台。因为这些图片已经变成了base64的形式嵌在网页中,所以也少了我在管理后台上传图片再插入图片这些操作。
有人可能会疑惑,为什么还要这么麻烦呢?有些工作流都能一键直接发了。我跟你说,我也实现了,但发现效果并不理想。
我的工作流里同样有一个自动推送公众号文章到后台的skill,这里我可以把SKILL.md的内容贴出来:
---
name: push-wechat-draft
description: 将已经完成内容确认、视觉确认并导出 wechat.html 的微信公众号文章,通过微信官方服务端 API 安全写入公众号草稿箱。用于用户明确要求“推送到公众号草稿箱”“创建公众号草稿”“把 wechat.html 上传到公众号后台”时;负责校验导出状态、压缩正文图片副本、上传正文图片和永久封面、替换图片地址并创建草稿,但绝不发布或群发。
---
# 推送微信公众号草稿
只处理状态为 `exported` 的文章目录。使用官方服务端 API,不操作网页后台,不调用发布或群发接口。
## 安全门槛
- 把创建草稿视为外部写操作。先运行 `--dry-run` 并向用户展示标题、图片数量、封面来源和目标公众号;只有用户在当次操作中明确确认后,才运行真实命令。
- 真实命令必须带 `--confirm-create-draft`。不得把该参数预先写入自动任务或默认命令。
- 从环境变量读取 `WECHAT_APP_ID` 与 `WECHAT_APP_SECRET`;若已有受控 token,可改用 `WECHAT_ACCESS_TOKEN`。不得把凭据写入项目、日志、命令参数或回复。
- 不自动重试 `draft/add`。若请求在提交后发生网络中断,结果可能未知,应先到草稿箱检查,避免重复创建。
- 不调用 `freepublish/*`、群发、删除草稿或删除永久素材接口。
## 操作流程
1. 运行文章流水线状态检查,确认 `stage` 为 `exported` 且 `changes` 为空。
2. 运行本地预演:
...
最关键的是执行一串脚本:
$env:WECHAT_APP_ID="..."
$env:WECHAT_APP_SECRET="..."
python -X utf8 .agents/skills/push-wechat-draft/scripts/wechat_draft.py <文章目录> --confirm-create-draft
可以看到,要推送到管理后台,需要每次输入WECHAT_APP_ID还有WECHAT_APP_SECRET,而且还需要在管理后台配置IP白名单。因为我经常使用代理,导致我推送服务的IP经常变化;而且为了安全,我根本就不考虑在我本地写死WECHAT_APP_ID和WECHAT_APP_SECRET。
所以试验过几篇后,我就放弃这种半自动推送的功能了,还不如直接复制粘贴方便。
主题风格预览

我为不同风格的公众号文章设置了不同的样式模板,所以我在每次写文章前,都会先确定这次要发的是什么风格的文章。比如有推荐去处,有游记风格等。
城市文章归档

主要是记录写过哪些城市,以免后面一个城市写重复了。
结尾
公众号名就不公布了,通过我上面的分享,感兴趣的应该能够搜到,刷到就算有缘。