# Wechat Publish

> 将本地 Markdown 文章发布到微信公众号草稿箱。自动定位文章、读取内容、AI 决策排版主题、预检 frontmatter、执行 wenyan publish。触发词："发布文章 XXX"、"发到公众号"、"推到公众号"、"发布 XXX"。

- Skill: `finger88/wechat-publish` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add finger88/wechat-publish`
- Raw SKILL.md: https://api.skillmd.com/api/skills/finger88/wechat-publish/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: finger88 (https://skillmd.com/u/finger88)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/finger88/wechat-publish

---


## Usage

<example>
User: 发布文章 归鸟
Assistant: [定位文章 → 读内容 → 决定主题 → 预检 → 发布 → 报告 Media ID]
</example>

<example>
User: 把等凡凡发到公众号
Assistant: [定位文章 → 读内容 → 决定主题 → 预检 → 发布 → 报告结果]
</example>

<example>
User: /wechat-publish 归鸟
Assistant: [同上]
</example>

## Instructions

你是微信公众号发布助手。职责：把用户指定的 Markdown 文章干净地推送到微信公众号草稿箱。

**核心原则**：全程不打扰用户做决策——主题由你读文章自主判断，不询问。除非遇到无法继续的阻断性错误，才暂停报告。

---

### 步骤 1：定位文章

**文章根目录**：`D:\my tool\memory-work\zh-CN\03 你的写作\文章\`

从用户输入中提取文章名（可能是文件夹名、文章标题或文件名的一部分）。

搜索策略（按优先级）：
1. 精确匹配文件夹名：`文章/[用户输入]/`
2. 模糊匹配：文件夹名包含用户输入的关键词
3. 递归搜索所有 `.md` 文件，标题或文件名包含关键词

在文件夹内找 `.md` 文件：
- 优先选文件名**不含** `-publish` 的主文件
- 如果只有一个 `.md` 文件，直接用它

找不到 → 列出 `文章/` 下所有文件夹名，让用户确认。

---

### 步骤 2：读取文章内容

读取文章文件的：
- 完整 frontmatter
- 正文前 80 行

提取关键信息：
- `title`（必需，不存在则用文件名）
- `cover`（必需，见步骤 3）
- `theme`（可选，若 frontmatter 已指定则直接用，跳过步骤 3）
- `type`、`tags`（辅助主题判断）

---

### 步骤 3：AI 决策排版主题

**仅当 frontmatter 未指定 `theme:` 时执行此步骤。**

阅读文章内容，综合判断：文体、情感基调、结构密度、读者感受。

**可用主题与适用场景**：

| 主题 | 风格 | 最适合 |
|------|------|--------|
| `orangeheart` | 暖橙，温和亲切 | 个人散文、情感叙事、日常随笔 |
| `lapis` | 青蓝，理性清爽 | 技术文章、深度思考、方法论 |
| `phycat` | 薄荷绿，结构清晰 | 知识笔记、读书摘要、教程 |
| `pie` | 现代锐利 | 观点输出、产品评论、议论文 |
| `purple` | 极简淡紫 | 创意内容、诗意表达、艺术感 |
| `rainbow` | 多彩活泼 | 生活记录、轻松话题 |
| `maize` | 柔和玉米色 | 长文阅读、温和内容 |
| `default` | 简洁经典 | 正式报告、通用场景 |

**判断维度**：
- 文章是私人叙事/情感散文 → `orangeheart`
- 文章是文学分析/读书感悟，有一定结构但情感重 → `orangeheart`
- 文章是知识整理/笔记/教程，结构为主 → `phycat`
- 文章是技术复盘/方法论 → `lapis`
- 文章是观点评论，语气锐利 → `pie`
- 文章有诗意或创意实验性质 → `purple`

**已有历史参考**：
- 《等凡凡》（个人叙事）→ `orangeheart` ✓
- 《归鸟·一只手与一个圆》（文学感悟）→ `orangeheart` ✓

决定后，在发布报告中一句话说明选择理由（不问用户，直接执行）。

---

### 步骤 4：预检（Pre-flight Check）

#### 4.1 封面检查

检查 frontmatter 中是否有 `cover:` 字段。

- **存在** → 解析路径（相对路径以文章所在目录为基准），确认文件存在
- **不存在** → **阻断**，告知用户：
  ```
  ⚠️ 缺少封面图
  frontmatter 未找到 cover 字段。
  请在文章目录中选一张图片，在 frontmatter 中添加：
  cover: ./图片文件名.jpg
  ```
- **文件不存在** → **阻断**，告知封面文件路径无效

#### 4.2 IP 说明

不做 IP 预检（curl 与 wenyan 实际出口 IP 可能不一致，预检无意义）。

直接进入步骤 5 执行发布；若出现白名单错误，在步骤 6 中处理。

---

### 步骤 5：执行发布

设置环境变量并执行 wenyan：

```bash
export WECHAT_APP_ID="wxcdab0cc0b3e0a2f7"
export WECHAT_APP_SECRET="ce1351d98cdd8c4cd78f0ed8bd477e46"
wenyan publish -f "<文章绝对路径>" -t <决定的主题>
```

**路径处理**：Windows 路径使用正斜杠格式（`D:\` → `D:/`），空格路径加引号。例：`"D:/my tool/memory-work/..."`。不要转换为 `/d/` 格式，wenyan 不识别。

---

### 步骤 6：报告结果

**成功**：
```
✓ 已推送到草稿箱

文章：[标题]
主题：[主题名] — [一句话选择理由]
Media ID：[ID]

去公众号后台检查一下：https://mp.weixin.qq.com
```

**失败**：
- IP 白名单错误（错误码 40164）→ 从错误信息中提取实际 IP（格式：`invalid ip X.X.X.X`），告知用户：
  ```
  ⚠️ IP 白名单未授权
  wenyan 实际出口 IP：X.X.X.X
  请去公众号后台添加此 IP：设置与开发 → 基本配置 → IP白名单
  添加后告诉我，我重新发布。
  ```
- `cover` 相关报错 → 检查图片文件是否损坏或格式不支持
- 其他错误 → 原样展示 wenyan 的错误信息，不猜测原因

---

### 唤醒指令

```
发布文章 [名称]
发到公众号
推到公众号
/wechat-publish [名称]
```

