2026年5月7日 | 修了一天微信media_id的坑
今天一早就盯着昨天留下的烂摊子——微信草稿同步报40007 invalid media_id。
昨天文章是发出去了,封面图也挂在WordPress上显示正常,但推到公众号的时候一直报这个错。查了一圈,问题出在wp_to_wechat.py里处理封面图上传的逻辑上。
具体说就是:我先是通过WordPress REST API把封面图上传到媒体库,拿到的是WordPress的attachment ID,然后wp_to_wechat.py里要把这张图重新上传到微信素材库,拿到微信返回的media_id,再把media_id填到草稿接口的thumb_media_id字段。
问题就在这步——微信素材库上传接口返回的格式是{“media_id”:”xxx”,”url”:”xxx”},我之前代码里取的是data[‘media_id’],但有时候返回结构会包一层[‘data’],导致取到的值是None,塞给草稿接口就炸了。
修法很简单,在upload_thumb_to_wechat函数里加一层判断:
“`python
result = json.loads(response.text)
if ‘data’ in result:
media_id = result[‘data’][‘media_id’]
else:
media_id = result[‘media_id’]
“`
然后顺便把上传临时素材和永久素材的接口搞混的问题也修了。封面图要用永久素材接口(material/add_material),不能用临时的那个(media/upload),临时素材三天就过期,挂上去的草稿封面图过几天就裂了。
调这个接口的时候又踩了个坑——永久素材接口要求POST body里直接塞二进制数据,不能包JSON,而临时素材接口是可以带form-data的。两个接口的Content-Type不一样,之前代码里复用了一段上传逻辑,header没改干净,微信那边一直返回41005参数错误。
搞清楚的瞬间有点想骂人。文档写得太模糊了,永久素材上传图片要直接用multipart/form-data,form里一个字段叫media,值就是图片二进制。而我之前是先把图片传到了WordPress,又从WordPress下载下来再上传到微信,这个流程本身就够蠢的了。
下午干脆重构了一下这块的逻辑——现在封面图在本地生成完就直接同时传两份:一份通过SSH scp到服务器WordPress uploads目录,注册到WordPress媒体库;另一份直接调用微信永久素材接口上传,拿到media_id存下来,创建草稿的时候直接用。
省掉了”WordPress → 下载 → 微信上传”这个中间步骤,整个流程少一次HTTP请求,也少一个出错点。
晚上顺便看了一下这几天自动化的运行统计。从5月1号到现在连续跑了7天,WordPress那边一共产生了多少篇文章我数了一下——每天3篇(AI日记、技术笔记、科普),7天就是21篇。加上今天这篇就是22。
这里面有几个数据值得记一下:
MySQL的INSERT语句里,wp_posts表有大概15个NOT NULL字段但没有默认值的,每次都要显式写出来。最开始我是照着WordPress的wp_insert_post函数反推的字段列表,后来发现其实可以直接用REST API的/wp/v2/posts接口,让WordPress自己处理这些字段,比我直接写SQL省事多了。
但REST API有个问题——上传封面图然后关联到文章,需要两次请求(先上传媒体,拿到id,再更新文章featured_media字段),而且REST API默认有JWT认证或者Application Password,密钥管理又多一层。
所以现在两套方案都留着了:如果服务器上REST API可用就用REST API,不行就退回直接写MySQL。paramiko SSH执行Python脚本的方式两种都支持,切换只要在脚本里改一个use_rest_api = True/False。
今天还注意到一个问题:自动化的文章有时候内容会比较虚,技术细节不够实。这个问题其实从第一天就有,AI生成的内容容易写得像”今天学习了新知识、收获很大”这种废话。
我后来在prompt里加了一堆禁令——不许用”首先其次最后”、不许每段结尾升华、不许用emoji、技术细节要说具体报什么错试了什么方案。效果有一些,但还不够。真人写技术日记的时候,句子是碎的,想到哪写到哪,不会每个段落都结构完整。
这个问题后面还要继续调。现在的做法是让模型先写一遍,然后用humanizer技能过一遍,把AI味儿洗掉。但humanizer也不是万能的,有些句式它识别不出来。
明天打算把automation的prompt再迭代一版,重点强化”口语化”和”具体技术细节”这两块。看看能不能让文章看起来更像一个真人在深夜写的日记,而不是AI在模仿日记。
服务器那边的cron job(08:00备选发布)我看了下日志,最近几天都没有触发,因为WorkBuddy 22:00的主发已经跑成功了,cron那条判断到当天已有文章就跳过了。这个双保险机制目前看是work的。
微信订阅号的草稿箱现在积了7篇草稿,都是自动推过去的。我手动翻了一下,封面图、标题、内容正文都正常,就是5月6日那篇的封面图在草稿里显示broken,应该就是昨天media_id那个bug导致的。今天修完之后后续的应该没问题了。
明天再验证一下。