一个专注于两件事的小工具:将 Markdown 排版为适合微信公众号的 HTML,并将文章发布到微信公众号草稿箱。
- Python 3.11 或更高版本
- 已启用开发者接口的微信公众号
- 运行机器的公网 IP 已加入公众号后台的 IP 白名单
首次使用时,在项目根目录执行:
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -e .
copy .env.example .env如果使用 PowerShell,复制配置文件的命令为:
Copy-Item .env.example .env无需激活虚拟环境,也无需修改系统 PATH。项目根目录中的 wechat-publish.cmd 会自动调用 .venv\Scripts\python.exe。安装或依赖发生变化后,重新执行一次安装命令即可。
编辑项目根目录的 .env:
WECHAT_APPID=公众号AppID
WECHAT_APPSECRET=公众号AppSecret
WECHAT_AUTHOR=默认作者名
WECHAT_THUMB_MEDIA_ID=
WECHAT_FOOTER_ENABLED=true
WECHAT_FOOTER_TEXT=感谢你读到这里,如果觉得不错,随手点个赞吧,如果想第一时间收到推送,点个星标⭐~,我们,下次再见。WECHAT_THUMB_MEDIA_ID 是可选的已有永久图片素材 ID,仅在没有显式封面且正文没有图片时使用。.env 已被 Git 忽略,不应提交真实凭据。
WECHAT_FOOTER_ENABLED 控制是否在正文末尾添加加粗结尾文案,支持 true/false、yes/no、on/off 或 1/0。WECHAT_FOOTER_TEXT 可修改文案内容。
安装完成后,在项目根目录直接运行:
wechat-publish "D:\articles\example.md"脚本会把全部参数原样传给程序。在 CMD 中,完整发布示例如下:
wechat-publish "D:\articles\example.md" --digest "自定义摘要" --cover "D:\articles\cover.jpg"工具默认在 Markdown 同目录生成同名 HTML,例如 example.md 会生成 example.html。HTML 成功生成后才会继续调用微信接口。
只生成 HTML,不发布:
wechat-publish "D:\articles\example.md" --render-only覆盖自动识别的文章信息。CMD 使用一行命令,或者用 ^ 换行:
wechat-publish "D:\articles\example.md" ^
--title "自定义标题" ^
--author "作者名" ^
--digest "自定义摘要" ^
--cover "D:\articles\cover.jpg" ^
--output "D:\preview\example.html"PowerShell 可以使用反引号换行:
.\wechat-publish.cmd "D:\articles\example.md" `
--digest "自定义摘要" `
--cover "D:\articles\cover.jpg"如果不使用快捷脚本,也可以直接调用模块:
.\.venv\Scripts\python.exe -m wechat_publisher "D:\articles\example.md"路径或参数中包含空格、中文弯引号 “” 时,请使用英文半角双引号包住整个参数。Windows 文件名不能包含英文半角双引号 "。
- 标题取第一个一级标题
# 标题,没有一级标题时使用文件名。 - 正文中的第一个一级标题会从微信正文中移除,避免与草稿标题重复。
- 未指定摘要时,从排版后的正文纯文本截取前 100 个字符。
- 默认在正文末尾添加
.env中配置的加粗结尾文案;该文案不计入自动摘要。 - 相对图片路径以 Markdown 文件所在目录为基准。
- 本地图片和 HTTP/HTTPS 图片都会上传到微信,再替换正文中的地址。
- 封面依次选择
--cover、正文第一张图片、WECHAT_THUMB_MEDIA_ID。 - 正文长度不在本地拦截,由微信公众号接口执行最终校验。
- 没有可用封面、图片缺失或图片上传失败时,中止发布并返回退出码。
工具不会修改原始图片或 Markdown。引用 WebP 图片时,会在内存中自动转换和压缩:不透明图片使用 JPEG,带透明通道的图片使用 PNG;如果仍超过限制,则逐步缩小尺寸。整个过程不会生成临时图片文件。
- 正文图片:JPG 或 PNG,不超过 1 MB。
- 封面图片:JPG、PNG、GIF 或 BMP,不超过 2 MB。
离线测试使用模拟响应,不会访问微信公众号:
.\.venv\Scripts\python.exe -m unittest discover -s tests -v真实发布测试会在公众号草稿箱中创建草稿,应单独、显式执行。