公众号草稿发布服务

July 8, 2026 · View on GitHub

md-to-wechat.html 加一个「发布到草稿」按钮:本地起一个小服务,点按钮就把排好版的文章推送到公众号草稿箱(不直接群发,安全)。

零依赖,只要 Node ≥ 18

前提条件(重要,先确认)

  1. 普通订阅号即可,个人号、未认证的号也能调 draft/add 草稿接口——在「设置与开发 → 基本配置」拿到 AppID / AppSecret 即可。
  2. IP 白名单(真正必须做的一步):调用微信接口的机器出口 IP 必须加进公众号后台 「设置与开发 → 基本配置 → IP 白名单」。本地运行就填你当前网络的公网出口 IP (搜「我的 IP」即可查到)。没加会报错 40164

使用

cd tools/server
cp .env.example .env      # 然后编辑 .env,填 AppID / AppSecret / 封面
npm start                 # 或:node publish-wechat.mjs

启动后:

  • 服务地址:http://127.0.0.1:3007/
  • 通过本地服务打开工具http://127.0.0.1:3007/md-to-wechat.html (这样点「发布到草稿」是同源请求,不会有跨域 / 混合内容问题。用 file:// 或线上 Pages 打开时按钮会提示你先走本地服务。)

在工具里粘好 Markdown、选好风格 → 点 发布到草稿 → 去公众号后台草稿箱查看。

.env 配置项

变量必填说明
WECHAT_APPID开发者 ID
WECHAT_APPSECRET开发者密码
WECHAT_THUMB_MEDIA_ID二选一已上传的永久素材 media_id,作封面
WECHAT_DEFAULT_COVER二选一本地封面图路径(相对 server/ 或绝对);首次自动上传并缓存 media_id
WECHAT_AUTHOR可选默认作者名(≤8 字)
PORT可选默认 3007

封面是 draft/add 的必填项。两个封面变量都不填时,服务会用正文里的第一张图当封面;正文也没图就报错。

工作流程

  1. 用 AppID/Secret 换 access_token(自动缓存,2 小时内复用)。
  2. 把正文里的 data:/外链图片逐张上传到微信,替换成微信域名 URL(否则微信会丢图)。
  3. 解析封面 thumb_media_id
  4. draft/add 建草稿,返回 media_id

常见报错

errcode含义 / 处理
40164出口 IP 不在白名单 → 去后台加 IP
40001 / 40013AppSecret / AppID 不对
48001接口未授权 → 去后台「接口权限」确认草稿箱/发布接口可用
45009触发频率限制,稍后再试

安全

  • .env.cache.json 已在 .gitignore 中,不会提交。
  • 服务只监听 127.0.0.1(仅本机可访问)。
  • 只建草稿,不群发,误点也不会推送给粉丝。