# Wechat Mp Publish

通过微信公众号官方 API 把公众号文章生产单元渲染为微信排版 HTML、生成阅读页预览、上传封面与正文图片并创建草稿；在三重确认下提交发布并查询状态。支持本机直连与固定...

- Repository: https://github.com/tsingyuai/growth-lab (1975 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-09-28
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add tsingyuai/growth-lab --skill wechat-mp-publish -g -a claude-code -y`
Codex: `npx skills add tsingyuai/growth-lab --skill wechat-mp-publish -g -a codex -y`
Cursor: `npx skills add tsingyuai/growth-lab --skill wechat-mp-publish -g -a cursor -y`
Gemini CLI: `npx skills add tsingyuai/growth-lab --skill wechat-mp-publish -g -a gemini-cli -y`

## Description

通过微信公众号官方 API 把公众号文章生产单元渲染为微信排版 HTML、生成阅读页预览、上传封面与正文图片并创建草稿；在三重确认下提交发布并查询状态。支持本机直连与固定 IP 远程发布服务两种模式。用户要求预览公众号、同步微信草稿、发布公众号或查询发布状态时使用。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# 微信公众号草稿与受控发布

`scripts/` 是仓库自带的零依赖 Python Client（仅用标准库），只调用微信官方接口，见 [api.md](references/api.md)。输入是 [wechat-article-compose](../wechat-article-compose/SKILL.md) 产出的生产单元：

```text
<post-dir>/
├── article.md        # 必需
├── wechat.yml        # 必需
├── cover.png         # 创建草稿时必需（cover 字段可改名）
└── assets/           # 正文图片，可选
```

渲染器支持 `wechat.yml` 的 `theme`（主题名，或 `base` 加 `accent` / `text` / `background` / `link` / `ink` / `tint` / `muted` / `line` / `generic` 颜色覆盖，值可写 `#RRGGBB`）以及正文排版块 `::: card / steps / stats / bars / figure`，语法见 [wechat-article-compose](../wechat-article-compose/SKILL.md)。内置主题：`default`、`white-accent`（白底、中性灰，只用强调色点缀）。品牌色写成覆盖项：

```yaml
theme:
  base: white-accent
  accent: "#2C3E8C"
  link: "#2C3E8C"
```

运行后在同一目录写入 `preview.html`、`article.html`、`payload.json`、`publish-state.json`。

## 前置

依赖缺失时触发统一的 [onboard-growth-lab](../../models/onboard-growth-lab/SKILL.md)，本 Skill 不自行维护配置流程。

- 本机直连：`WECHAT_MP_APP_ID` / `WECHAT_MP_APP_SECRET`，且本机公网出口 IP 已加入公众号后台 API IP 白名单。
- 远程服务（推荐团队使用）：本机只配 `WECHAT_PUBLISH_SERVICE_URL` / `WECHAT_PUBLISH_SERVICE_TOKEN`；AppSecret 只放在固定 IP 服务器上，部署见 [remote-service.md](references/remote-service.md)。
- 账号主体必须具备草稿与发布接口权限：个人主体、未认证企业主体等账号的发布接口可能已被回收，报 `api unauthorized` 时说明无法自动化，改为人类协作发布。

凭据只从进程环境或根目录 `.env.local` / `.env` 读取；不得回显、写入产物或 Memory。

## 1. 预览（每次都做）

```bash
make wechat-preview POST=<post-dir>     # 生成并打开 preview.html
make wechat-render POST=<post-dir>      # article.html + dry-run payload.json
```

用真实浏览器检查 `preview.html`：标题、作者、摘要、首屏卡片、小标题节奏、图片居中与清晰度、CTA 链接。发现问题回到 `article.md` 修改后重新渲染。`article.html` 是草稿与预览共用的唯一正文，修改 `article.md` 后必须重新 render。

## 2. 创建草稿（默认终点）

```bash
make wechat-draft POST=<post-dir>          # 本机直连
make wechat-remote-draft POST=<post-dir>   # 远程服务
```

两者都先跑 `check-wechat-compliance.py`，未通过即阻断。流程：上传封面为永久素材 → 上传正文本地图片并替换为微信图片 URL → 新建草稿 → 写 `publish-state.json` 的 `draft_media_id`。正文外链图片会被拒绝，改用 `assets/` 本地图片；正文仍含 `::: figure` 配图位时同样拒绝，先换成真实图片再 render。

创建成功后请用户在公众号后台预览草稿；这是人工把关点，不跳过。

The rest: https://github.com/tsingyuai/growth-lab/blob/HEAD/executors/wechat-mp-publish/SKILL.md
