微信公众号发布

Security

微信公众号文章发布技能。当用户提到发布公众号文章、推送微信公众号、公众号发布、微信公众号发文、将文章发布到公众号、把文章发到公众号、把markdown转成微信公众号格式,或需要将带 YAML frontmatter 的 markdown 文件发布到微信公众号时激活。包含:Markdown → HTML 转换(marked + 内联样式,自动去除 frontmatter)、封面图上传、创建草稿、API 发布或手动发布指引、常见错误处理。

Install

openclaw skills install wx-mp-publish

wx-mp-publish — 微信公众号发布技能

技术方案

Node.js + marked:微信 API 返回的 JSON 含特殊字符,Python json.loads() 解析失败率高(报错 Invalid \uXXXX escape),Node.js V8 原生 JSON 解析稳定可靠。 Python 版本已废弃删除(scripts/wx-mp/ 目录下仅保留 Node.js)。

快速流程

用户提供 Markdown 文章(含 YAML frontmatter)
    ↓
自动去除 frontmatter(re.sub 去掉 --- 之间的内容)
    ↓
marked.parse() → HTML(gfm 模式)
    ↓
applyInlineStyles() → 内联 style
    ↓
上传封面图(≤64KB)
    ↓
创建草稿 → 手动发布(或 API 发布)

发布命令

cd ~/.openclaw/workspace/skills/wx-mp-publish/scripts
node wx-publish.js draft <文章.md> \
  --title "标题(≤64字符)" \
  [--thumb <封面图路径>]

node wx-publish.js publish <文章.md> \
  --title "标题" \
  [--thumb <封面图路径>]

查询与预览

node wx-publish.js drafts       # 列出草稿
node wx-publish.js del <id>    # 删除草稿
node wx-publish.js status       # 查看配额

📝 发布流程(必须按顺序执行)

创建草稿后,还需在公众号后台手动设置以下选项:

设置项位置说明
🤖 AI辅助生成标注文章开头或结尾必须标注「本文包含AI辅助内容」
✅ 声明原创编辑框下方原创标签按钮
💰 打开赞赏文章底部赞赏按钮开关
✍️ 作者文章底部填写"你的名字"
⏰ 定时群发发布设置可选,但订阅号每月只4次,要节省使用

后台路径: 内容与创作 → 草稿箱 → 找到草稿 → 编辑 → 发布

⚠️ API发布限制

  • 订阅号(审核中):只能创建草稿,publish 命令会报 [48001] api unauthorized
    • 发布限制:每天1次
  • 服务号:可直接API发布
    • 发布限制:每月4次
  • 定时群发API需要服务号权限

⚠️ 关键注意事项

1. 不用 Python,用 Node.js

Python json.loads() 对微信 API 返回的某些 JSON 失败(Invalid \uXXXX escape),Node.js 无此问题。

2. YAML frontmatter 必须去除

微信文章不需要 frontmatter,若不去除会显示为正文乱码。 wx-publish.js 内置自动去除:content.replace(/^---\n[\s\S]*?\n---\n/, '')

3. 不要用 nl2br 模式

Python markdown 库的 nl2br 扩展把换行符变成裸 <br>,微信编辑器无法正确渲染。正确做法是 paragraphs 自然闭合。

4. API 发布权限限制

错误[48001] api unauthorized

订阅号(审核中)只能创建草稿,需手动在公众号后台发布。 后台路径:内容与创作 → 草稿箱 → 找到草稿 → 发布

5. 标题/摘要长度限制

  • 标题 ≤64 字符
  • 摘要 ≤120 字符(或留空让微信自动生成)

6. 封面图大小限制

≤64KB。建议尺寸 900×383 像素(2.35:1)。

📝 文章写作格式规范(2026-04-03)

⚠️ 每次写文章前必读

事实核查要求(最高优先级)

写文章涉及外部产品/工具时,必须

  1. 先查 ~/workspace/docs/product-facts.md 确认产品事实
  2. 不确定的概念用 web_search 主动搜索核实
  3. 禁止凭记忆瞎写产品功能

涉及的关键产品:

  • Claude Code = Anthropic商业AI编程CLI
  • OpenCode = opencode.ai开源竞品,provider-agnostic
  • OpenClaw = 个人AI助手平台,不只是编程
  • Google Cloud Code = Kubernetes工具,和AI编程无关

不确定事实的主动核查规则

触发条件: 文章中出现任何不熟悉的概念、产品、技术名词,而 product-facts.md 里没有记载。

执行流程:

  1. 主动搜索 — 用 web_search 搜索该概念,获取权威来源
  2. 核实后记录 — 把确认的事实按分类存入 ~/workspace/docs/product-facts.md
  3. 标注来源 — 记录信息源URL和核实日期

事实分类标准(存入 facts 文档的分类标签):

分类标签包含内容示例
[产品类]产品名称、厂商、定位、界面形态Claude Code是Anthropic的产品
[技术类]技术名词、协议、架构术语MCP、Agent架构、Context管理
[事件类]重大发布、泄露事件、行业动态Claude Code源码泄露事件
[数据类]用户量、stars数、版本号、价格GitHub 68k+ stars
[对比类]多个产品的横向对比结论OpenCode vs Claude Code的差异

记录格式(追加到 product-facts.md 末尾):

## [YYYY-MM-DD] 新增事实

### [产品类] 产品名称
- **事实内容**:...
- **来源**:URL
- **核实日期**:YYYY-MM-DD

自动分类规则:

  • 出现"是什么" → [产品类][技术类]
  • 出现"发布/泄露/更新/收购" → [事件类]
  • 出现"对比/差异/哪个更好" → [对比类]
  • 出现"多少/数量/价格/版本" → [数据类]

示例场景:

文章里要提"Aider",但 facts 文档里没有 → 立刻 web_search → 确认为开源AI编程CLI工具 → 追加到 [工具类] 或新建 [产品类] → 继续写文章

结构要求

禁止在文章正文中出现:

  • ❌ "第一节/第二节/第三段"这类内部策划标记
  • ❌ "上文说过的"、"承接上篇"、"钩子"等内部术语
  • ❌ 阿拉伯数字编号的章节标题(1. 2. 3. / 第一节 第二节)
  • ❌ "这篇来讲讲"、"下面我将从三个方面"等说明性文字
  • ❌ "一句话总结"、"一句话告诉你"、"一句话说明"(浓AI味,直接写内容即可)

应该用:

  • ✅ 自然分段,每段讲一个事情
  • ✅ 关键转折或新话题用 —— 或空行分隔
  • ✅ 小标题可用问句或短句,控制在10字以内,不带"第一章"、"第三节"等前缀
  • ✅ 用语面向普通读者,不是内部备忘录

开头格式(必选)

> 字数:约XXXX字 | 阅读时间:X分钟
> **"金句内容"**

---
正文(自然分段,不要编号)

篇末提示格式

如果需要加"中国平替"等提示,直接在正文末尾加一段话即可,不要标注"篇末提示"。

实战举例要求

提到自己的项目时:

  • ✅ "我做的APP"、"我开发的项目"
  • ❌ 具体APP名称、产品名
  • ❌ 业务类型、用户群体等业务细节
  • ✅ 只讨论技术实现层面(架构、选型、技术栈等)

⚠️ 隐私保护(必须遵守)

1. 项目名称保护

  • 禁止在文章中出现任何具体APP名称
  • 只能说"我开发的项目"或"我做的APP"
  • 只能讨论技术层面,业务细节一律禁止

2. Google Cloud Code ≠ Claude Code

  • Google Cloud Code = Google的Kubernetes开发工具(VS Code/IntelliJ插件),和AI编程无关
  • Claude Code = Anthropic的AI编程CLI工具
  • 两者完全不同,禁止混淆

3. "Cloud Code" vs "Claude Code" 拼写

  • 文章里只有 Claude Code,没有 Cloud Code
  • Cloud Code 是谷歌云工具的名字,文章里不出现
  • 输入时养成习惯,先确认再敲

4. OpenClaw vs OpenCode 对比关系

  • Claude Code ↔ OpenCode = 编程能力直接竞品
  • OpenClaw = 个人AI助手平台,不是编程工具的直接竞品
  • OpenClaw只在篇末平替提示里提一句,不作为主要对比对象
  • 两者名称相近易混,写前必查 product-facts.md

5. 文章编号规则

  • 技术篇:Cloud Code专题(4篇)= 第1-4篇
  • 单篇技术文章从第5篇开始编号
  • 发布前查 series-counter.md 确认编号

6. 封面图规格

  • 尺寸:900×383像素(2.35:1)
  • 大小:≤64KB
  • 生成后用 ImageMagick 压缩: convert 原图.png -resize 900x383! -quality 75 输出.jpg

7. 运营数据追踪

文章运营数据记录在 ~/workspace/memory/articles/article-tracker.json

可获取的数据(每日自动更新):

  • 草稿列表 + 篇序
  • 已发布文章列表 + 发布时间
  • 总用户数

需手动更新的数据(用户从后台查看后告知):

  • 单篇阅读量
  • 单篇在看数/点赞数
  • 留言数

更新流程:

  1. 用户查看公众号后台「数据」→「内容」→「群发数据」
  2. 告诉你的名字:"更新第X篇的阅读量/在看数"
  3. 我会更新 article-tracker.json 中对应文章的数据

查运营数据(不用调用API): 直接查看 memory/articles/article-tracker.json,包含:

  • 最后更新时间(statsUpdated)
  • 所有文章篇序、标题、状态
  • 每篇的阅读量/点赞等(手动更新)

依赖

cd scripts/
npm install marked

目录结构

wx-mp-publish/
├── SKILL.md              # 本文件
├── references/
│   └── best-practices.md # 详细文档
└── scripts/
    ├── wx-publish.js     # Node.js 发布脚本(核心)
    ├── wx-api.js         # 备用 API 工具
    ├── package.json      # npm 依赖
    └── node_modules/     # npm 包