wechat-mp-publish
微信公众号草稿推送
5 次下载热度 13更新 2026-09-08 3 个文件
7.8 KB
MIT 许可
描述
通过公众号官方开放 API,把 Markdown 文章(含本地图片)一键推送到微信公众号草稿箱。纯 Python 标准库实现、零第三方依赖,自动完成 access_token 获取、正文配图上传、封面永久素材上传与 draft/add;正式发布动作保留人工在后台确认。
SKILL.md 正文
wechat-mp-publish · 微信公众号草稿推送 Skill
通过公众号官方开放 API,把 Markdown 文章(含本地图片)一键推送到公众号草稿箱。纯 Python 标准库实现,零第三方依赖。
触发词
- 推送/发布文章到公众号、公众号草稿箱、公众号 API 发布
- wechat mp publish、公众号 draft
前置条件
- 公众号 APPID / APPSECRET(存放在调用方指定的 env 文件里,如项目根目录
0-config.env,格式:APPID = "wx..."/APPSECRET = "..."); - IP 白名单:公众号后台 → 设置与开发 → 基本配置 → IP白名单,必须加入执行机公网 IP,否则获取 access_token 报
40164(脚本会自动提示该 IP); - 网络可访问
api.weixin.qq.com; - 封面图建议 900×383、<2MB;正文配图 <1MB(jpg/png);
- 图片必须是真 jpg/png:扩展名为 .png 但实际是 WebP 等格式会被 40137 拒收,上传前用
file命令抽查,必要时用 macOS 自带sips -s format png转换。
使用流程(标准四步,对应 scripts/)
SKILL=~/.qoder/skills/wechat-mp-publish/scripts
# 0) 可选:dry-run 预览 HTML,不消耗任何 API 调用
python3 $SKILL/push_draft.py --config <env文件> --md <文章.md> --dry-run
# 1) 推送草稿(内部自动完成:token → 正文配图上传 → 封面永久素材上传 → draft/add)
python3 $SKILL/push_draft.py --config <env文件> --md <文章.md>
--cover <封面图> [--title 标题] [--digest 摘要] [--author 署名]
# 2) 验证:查询草稿箱列表
python3 $SKILL/check_drafts.py --config <env文件>
成功标志:push_draft.py 输出 [SUCCESS] 草稿已推送,并返回草稿 media_id;随后可在公众号后台草稿箱看到文章并直接发布。
参数说明
| 参数 | 必填 | 说明 |
|---|---|---|
--config | 是 | 含 APPID/APPSECRET 的 env 文件路径 |
--md | 是 | Markdown 文章路径;文中  图片自动上传并替换为图床 URL |
--cover | 二选一 | 封面图,自动上传为永久素材作 thumb |
--thumb-media-id | 二选一 | 已有永久素材 media_id 时跳过封面上传 |
--title/--digest/--author | 否 | 缺省时标题取首个标题行、摘要取首段(≤100字) |
--dry-run / --out | 否 | 仅转换 HTML 预览,不调 API |
API 对照(内部实现)
| 步骤 | 接口 |
|---|---|
| 获取凭证 | GET /cgi-bin/token?grant_type=client_credential |
| 正文配图 | POST /cgi-bin/media/uploadimg |
| 封面素材 | POST /cgi-bin/material/add_material?type=image |
| 推送草稿 | POST /cgi-bin/draft/add |
| 草稿查询 | POST /cgi-bin/draft/count / draft/batchget |
严格禁止 (NEVER DO)
- 不得把 APPSECRET / access_token 打印、写入讲义、文档、PPT 或任何对外材料;
- 不得执行正式发布(
freepublish/submit)——发布动作始终保留人工在后台确认; - 不得连续重试失败命令超过 3 次;遇到 40164/40001/48001 按脚本提示处理后停止并报告。
常见错误速查
| errcode | 含义 | 处理 |
|---|---|---|
| 40164 | IP 不在白名单 | 后台加入脚本提示的公网 IP |
| 40001/42001 | token 无效/过期 | 核对 APPID/APPSECRET |
| 48001 | 接口未授权 | 确认公众号类型与认证状态 |
| 40007 | 无效 media 类型 | 封面必须是 jpg/png |
| 40137 | 图片格式非法 | 用 file 确认真实格式(WebP 会被拒),转成真 PNG 后重试 |
| 45110 | 作者字段超长 | author 上限 8 个字,缩短署名 |