Skip to content
懒人吧
Go back

微信公众号 API 发布文章踩坑记:40066、45003 与那些说不清的 BUG

编辑页面

自动化发布微信公众号文章,听起来很简单——调几个 API,传点参数,搞定。

实际上手后发现,微信的开发者文档更新不及时,错误信息暧昧,还有些根本说不清的玄学 BUG。这篇文章记录我在打通公众号发布流程时遇到的三个核心坑。

坑一:add_news 已废弃,draft/create 返回 40066

最早查文档,创建图文素材用的是 cgi-bin/material/add_news

发出去直接返回:

{"errcode":45106, "errmsg": "This API has been unsupported."}

45106:此接口已不再支持,请改用 draft 相关接口。

OK,换 cgi-bin/draft/create。同一个请求体,把 endpoint 换掉再试。

返回:

{"errcode":40066, "errmsg": "invalid url"}

40066 的错误描述是「不合法的 URL」。第一反应是请求体里某个 URL 参数不对。检查了几遍——content_source_url 传的是空字符串,content 里也没有链接。换了纯英文内容、去掉图片、去掉摘录,全部返回同样的错误。

折腾半天,无意中试了个拼写变体:draft/add

{"media_id": "xxx...", "item": []}

成功了。

正确的端点不是 draft/create,而是 draft/add。部分微信公众号的接口文档里写的是 create,但实际有效的是 add。两个端点都能响应、都返回错误信息,但只有一个能真正创建草稿。

坑二:add_material 上传图片返回正确,但素材列表查不到

上传封面图片用的是 cgi-bin/material/add_material,返回了 media_id。紧接着用 batchget_material 查素材列表,确实能查到。

但拿去创建草稿时,一直报 40066。排查到最后发现:问题不在图片,而在于 draft/create 这个接口本身(见坑一)。换了 draft/add 后同样的 media_id 直接通过。

所以如果你确认图片上传成功、media_id 有效,但草稿创建一直失败,先检查 endpoint 对不对。

坑三:45003 title size out of limit——标题字节玄学

这是最让人抓狂的一个。

所有参数都对了,心想写 5 篇文章的草稿应该没问题。结果第一篇就返回:

{"errcode":45003, "errmsg": "title size out of limit"}

我的标题只有 10 个中文字符,怎么超限?

开始逐个排查:

发现规律了:33 字节以上的标题会触发这个错误,但 30 字节就正常。关键是 30-32 字节之间没有明确的分界线,某些 33 字节的组合能过,某些不能。

更诡异的是字符组合依赖。同一个 11 字标题,改一个字就能过:

但 “平台网站托管排查实战” 这个 10 字版本又完全正常。说明微信 API 对标题的校验不是简单的字节数检查,而是基于某种字节模式匹配,特定顺序的 UTF-8 序列会触发 bug。

最终解决方案:标题控制在 30 字节以内(约 10 个中文字符或 30 个 ASCII 字符),避开中文冒号和特定字符组合。如果某个标题报错,删一个字或换顺序再试。

坑四:个人订阅号的 API 权限冰山

过程中还发现,未认证的个人订阅号 API 权限非常有限。尝试获取用户列表、群发消息等接口时,返回:

{"errcode":48001, "errmsg": "api unauthorized"}

这意味着:

所以如果你的是个人订阅号,API 的实际可用范围比文档写的窄很多。草稿管理是能用的最大范围,发布那一步还是得手动到公众号后台点一下。

汇总:正确的微信公众号文章发布流程

把坑都踩一遍后,总结一个能跑通的流程:

步骤API备注
1. 上传封面图片material/add_materialPOST,type=image,用 form-data
2. 创建草稿draft/add ✅(不是 draft/createJSON body,标题 ≤30 字节
3. 查看草稿draft/get / draft/batchget返回 media_id 列表
4. 发布需手动操作个人号:后台「发布」按钮
5. 管理已发布freepublish/batchget查询已发布文章

关键教训

  1. 不要完全信任官方文档draft/create 就是文档里写的,但实际不能用的。试错时多试几个 endpoint 变体。
  2. 错误信息可能完全误导。40066「invalid url」和标题、URL 都没关系,问题在 endpoint 本身。
  3. 标题校验有玄学。如果报 45003,先缩短到 30 字节以内,还不过就换字换顺序。
  4. 个人号的边界要清楚。先确认你的账号类型能调哪些 API,避免花时间在不可用的接口上。
  5. API 探针先行。正式创建内容前,先发一个极简 payload 测试接口是否可用,不要直接上完整文章。

微信的开发者生态一直以「文档滞后、错误信息暧昧」闻名。这次经历算是深度体验了一把。如果你也在接公众号 API,希望这篇能帮你少走弯路。


编辑页面
Share this post on:

Previous Post
Hermes 断流排查实录:从「回复到一半就停」到 vLLM OOM 根因修复
Next Post
Harness Engineering:8B 模型从 53% 到 99%,秘密不在模型本身