从本地到草稿箱:如何批量发布文章到微信公众号

从本地到草稿箱:如何批量发布文章到微信公众号

“重复性的手动任务是最值得自动化的投资——做一次,收益一辈子。”


读完这篇文章你将理解如何用脚本把本地的markdown文章批量推送到微信公众号草稿箱

你在本地用markdown写了100多篇文章。每篇都经过了质检,有完整的frontmatter(标题、作者、标签、描述),有封面图。但它们都只存在于你的电脑上——微信草稿箱里看不到它们。

手动操作的流程是这样的:打开微信后台,复制粘贴正文,上传封面图,填写标题和摘要,保存草稿,然后重复142次。每篇大约5分钟,142篇就是12小时的纯重复劳动。

这正是自动化应该解决的问题。12小时的手动工作,用一个脚本可以在7分钟内完成——而且这个脚本写一次以后每次新增文章时都可以重复使用。这不是一个”省时间”的问题,而是一个”投资回报”的问题:你花2小时写脚本,第一次使用就省了12小时,此后每次使用都是纯收益。这和复利的逻辑完全一致——前期投入,后期收割。


自动化发布的核心流程

整个流程分为三个步骤:渲染、上传和创建草稿。每一步都通过微信公众号API完成。

第一步是把markdown渲染成微信兼容的HTML。 微信公众号的编辑器不支持标准HTML——所有CSS必须内联到元素的style属性中。这意味着你不能用<link>标签引入样式表,也不能用class选择器。解决方案是在渲染时使用一个CSS内联工具(比如Python的premailer库),把所有样式直接写入每个HTML标签。这一步处理得好不好直接决定了你的文章在手机上看起来是否正常——字体大小、行间距、引用块样式、代码块底色,都需要在这一步内联好。

第二步是上传封面图。 微信API不接受图片URL,它需要你先把图片文件上传到微信服务器,获得一个media_id,然后用这个media_id来关联草稿。上传接口是素材上传接口,返回的media_id在3天内有效。核心逻辑可以写成这样的伪代码,真实脚本里把 token 放在请求参数中,不要把完整接口地址硬编码进正文:

import requests

def upload_cover(credential, cover_path):
    url = WECHAT_MEDIA_UPLOAD_URL
    params = {"credential": credential, "type": "image"}  # 实际脚本按官方参数名传入接口凭证
    with open(cover_path, 'rb') as f:
        resp = requests.post(url, params=params, files={'media': f})
    return resp.json()['media_id']

第三步是调用草稿API创建草稿。 草稿接口接受一个包含标题、作者、摘要、正文HTML和封面media_id的JSON对象。这里也用常量表示接口地址,真实项目中由配置文件统一管理:

def create_draft(credential, title, author, digest, html_content, thumb_media_id):
    url = WECHAT_DRAFT_ADD_URL
    params = {"credential": credential}  # 实际脚本按官方参数名传入接口凭证
    payload = {
        "articles": [{
            "title": title,
            "author": author,
            "digest": digest[:120],
            "content": html_content,
            "thumb_media_id": thumb_media_id,
            "need_open_comment": 1,
        }]
    }
    resp = requests.post(url, params=params, json=payload)
    return resp.json()

三步串联起来,就是完整的从本地markdown到微信草稿箱的自动化管道。

值得强调的是,这个流程的设计遵循了Unix哲学中”做一件事并做好”的原则。每一步都是一个独立的函数,输入明确,输出明确。渲染、上传、创建草稿——三个步骤可以独立测试、独立调试、独立重跑。如果某篇文章的封面图上传失败,你不需要重新渲染HTML;如果某篇的HTML有格式问题,你不需要重新上传封面。这种模块化的设计让错误排查变得极其简单——你只需要找到出问题的那一步,修复它,然后从那一步继续。


批量执行的关键细节

当你从单篇发布扩展到批量发布时,有三个技术细节需要特别注意。

第一是API限流。 微信公众号API有调用频率限制——不同接口的限制不同,但一般来说每次调用之间间隔2到3秒是安全的。如果你发得太快,会收到错误码45009(API调用频率超限)。在脚本中用time.sleep(2)就能解决。142篇文章,每篇3秒(API调用加间隔),总共大约7分钟。

第二是接口凭证的有效期。 微信接口凭证有效期是2小时(7200秒)。如果你的批量发布跨越了这个时间窗口(比如发送500篇),你需要在脚本中加入凭证刷新逻辑。一个简单的方法是在每次调用前检查凭证的获取时间,如果超过110分钟就自动刷新。更健壮的做法是在脚本启动时记录凭证获取的时间戳,然后在每次API调用前计算已过去的时间。如果即将过期就预先刷新,而不是等到API返回40001错误时才被动处理。这是防御性编程的一个经典例子——预防问题永远比修复问题的成本低得多。

第三是错误处理和日志。 批量发布中一定会有个别失败的情况——文件找不到、封面图格式不对、某篇文章的HTML包含微信不支持的标签。你需要一个CSV日志文件来记录每篇文章的发布状态(成功、失败、跳过以及具体的错误信息),这样失败后可以只重新发布失败的那几篇,而不是从头开始。一个好的实践是在脚本结束时输出统计摘要——成功多少篇、失败多少篇、跳过多少篇——让你一眼就能判断这次批量发布的整体质量。如果失败率超过5%,通常意味着存在一个系统性问题(比如token失效或者网络不稳定),而不是个别文章的问题。


常见API错误和解决方法

在实际操作中,以下是最常遇到的5个错误码:

错误码40001(接口凭证无效): 最常见的原因是凭证过期。解决方法是重新调用凭证获取接口。注意每次获取新凭证时,旧凭证会立即失效。

错误码45009(API调用频率超限): 把调用间隔从2秒增加到5秒通常可以解决。如果仍然超限,可能是因为其他服务也在同时使用这个公众号的API配额。

错误码45028(草稿数量超限): 微信公众号的草稿箱最多存放500篇草稿。如果你的草稿箱已经很满,需要先发布或删除一些旧草稿腾出空间。

错误码40004(媒体文件格式不正确): 封面图必须是PNG或JPG格式,大小不超过2MB。如果你的封面图是WebP或其他格式,需要先转换。

错误码48001(API权限不足): 检查你的公众号是否已经通过认证,以及AppID和AppSecret是否正确配置。未认证的个人公众号在API权限上有较多限制。值得注意的是,微信在2023年调整了部分API的权限要求——一些之前可以直接使用的接口现在需要额外的权限申请。如果你的脚本之前能正常运行突然遇到48001,先检查微信公众平台的”开发接口管理”页面,确认对应接口的权限是否仍然有效。


为什么这件事值得自动化

从纯时间的角度,手动发布142篇需要12小时,自动化只需要7分钟——节省了99%的时间。但时间节省只是最表面的收益。

更重要的收益是一致性。手动复制粘贴142次,你几乎一定会出错——漏填摘要、选错封面图、复制时丢失了一段文字。脚本不会犯这些错误。它每次都执行完全相同的操作,按照完全相同的顺序,使用完全相同的参数。这就是为什么制造业从手工作坊转向流水线的原因——不是因为机器更快(虽然确实更快),而是因为机器更一致。

最深层的收益是可复用性。这个脚本写一次,以后每次新增文章时直接再跑一次就行。下个月写了20篇新文章,不需要重新打开微信后台手动操作——运行脚本,2分钟搞定。这和定投的逻辑一样:设置一次系统,然后让系统自动运行。你把注意力释放出来去做更高价值的事情——比如写下一篇文章,而不是手动发布上一篇。

彼得·德鲁克在《卓有成效的管理者》中强调,知识工作者最稀缺的资源不是资金而是时间——而时间管理的核心不是”做得更快”而是”不做不必要的事”。批量发布脚本正是这个原则的具体实践:它把12小时的”不必要的手动工作”变成了一个7分钟的自动过程,释放出来的11小时53分钟可以用来做真正需要人类判断力的事——比如写下一篇文章、研究下一个投资主题。

芒格巴菲特的伯克希尔之所以能用极少的人力管理巨大的资产,核心方法之一就是”只在需要人类判断的环节投入人力”。自动化发布不是技术炫耀——它是对你自己时间价值的准确评估。如果你的时间值100元一小时,那12小时的手动发布就意味着你白白花了1200元去做一件7分钟可以完成的事。


常见问题

个人公众号(未认证)能使用这套自动化流程吗?

未认证的个人公众号在API权限上确实有限制。草稿创建接口需要公众号至少通过了微信认证或者是已注册的订阅号。如果你的公众号还没有API权限,你可以考虑两个替代方案:一是完成认证(个人订阅号无法认证,但企业主体可以),二是使用微信后台的”素材管理”功能配合浏览器自动化工具(比如Playwright或Selenium)来模拟手动操作。后者不依赖API权限,但稳定性较差,因为微信后台的页面结构可能随时变化。如果你选择浏览器自动化路线,建议使用Playwright而不是Selenium——Playwright的API设计更现代,自动等待机制更智能,在处理微信后台这种有大量异步加载的页面时表现更稳定。不管选择哪种方式,核心原则不变:把重复性的操作从你的手上转移到机器上,释放你的时间用于真正需要创造力和判断力的工作。

如何确保批量发布后的文章格式是正确的?

批量发布前,建议先用脚本发布1到2篇测试文章,在手机微信上预览草稿的实际效果。需要重点检查的包括:正文字体和行间距是否舒适、引用块和代码块的样式是否正确、图片是否正常加载、链接是否可以点击。如果样式有问题,调整你的CSS内联模板后再批量发布。另外,微信的预览功能(草稿详情页的”预览”按钮)可以直接推送到你的手机上,是最可靠的格式验证方式。建议建立一个标准的样式检查清单:字体大小(建议正文16px)、行间距(建议1.75倍)、段落间距、引用块左边框颜色、代码块背景色和字体。这些参数一旦在CSS模板中固定下来,所有文章都会保持一致的视觉风格——这也是自动化相对于手动操作的另一个优势:风格的绝对一致性。读者在连续阅读你的多篇文章时,一致的视觉体验会潜移默化地建立品牌信任感。反过来,如果每篇文章的字体大小、颜色和间距都不一样,读者会下意识地觉得”这个公众号不够专业”——即使内容本身是优质的。


本文参考微信公众号开发文档彼得·德鲁克卓有成效的管理者》关于时间管理的论述及实际发布自动化实践整理。如果你也在建设自己的内容发布管道,欢迎关注公众号「柔和谦卑 履责 求知」。

「柔和谦卑 履责 求知」

Leave a Comment