文件预览

SKILL.md

查看 微信公众号发布 技能包中的文件内容。

文件内容

SKILL.md

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

# 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 发布)
```

## 发布命令

```bash
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 <封面图路径>]
```

### 查询与预览

```bash
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 末尾):**

```markdown
## [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 包
```