文章正文能发出去、图却挂掉,这两件事在代码里离得挺远。
我最早那套脚本只管文字。标题、正文、栏目、发布时间拼成表单 POST 过去,返回 200 我就当成了。图片是后加的,加进去才发现前面所有的"稳定"都是假的。
图从哪来,这件事卡了我快两周。
一开始我图省事,直接从目标站已有的文章里挑图,或者把别的站的文章连图带地址一起复制过来。前台看是好的,因为浏览器访问时带着 referer,对方服务器认了。换成脚本去下载,请求头里干干净净,对面直接回 403,有时候连 403 都不给,直接断连。
那段时间日志里一片红,全是下载失败。可我打开浏览器手动点同一个地址,图好好地显示在那儿。这个现象很容易把人带偏,以为是自己的代码写错了,其实对面在按 referer 挑人。
后来我在下载请求里补了一个 referer,跟目标站自己的域名对齐,成功率一下子上去了。这事说起来简单,当时我在网上翻了两天,看到的答案基本都在讲 UA 和 cookie,没人提 referer。
补上之后还有新的。有些站把图放在 CDN 上,CDN 那层又按防盗链再判一次,referer 补了也没用。这种图我现在直接放弃,换一张。为了一张图去绕别人的鉴权,不值得,也不干净。
图片格式是另一处,这个更闷。
我一开始统一转成 webp,省带宽,看着也现代。传上去返回 200,接口一句话没说。结果前台打不开,图裂了。原因是那套 CMS 的上传接口只认 jpg 和 png,webp 进去了但不生成缩略图,前台拿不到。
更要命的是它不报错。接口返回成功,因为文件确实存进去了,只是后面这一串处理全断了。我是隔了一天去看前台才发现,那批文章全是裂图。
从那以后上传前先做一次格式判定,统一转成 jpg,png 只在需要透明的时候留。webp 一律不碰。
尺寸也能咬人。有的站上传接口默认限制 2MB,图压得不够就传不进去,接口先收下再转异步处理,脚本这边看到 200 就往下走了。等核验的时候,那张图还在处理中,或者干脆被丢了。现在传之前先看体积,超过的直接本地压一遍,质量降到 80,基本都在 300K 以内。
最阴的一处是路径。
图片传成功了,接口也返回了地址,我把这个地址写进正文。然后前台 404。地址看着是对的,文件也在,问题是接口返回的是相对路径,少一个域名前缀,或者多了一层按日期分的目录。这种错误不会在接口那里报出来,只能自己到前台点开看。
我现在的做法是传完当场回读。把返回的地址拼成完整 URL,发一个 HEAD 请求,看状态码。200 才算过,404 或者 302 都不算。这一步加进去之后,裂图基本没再出现过。

说回最开始那个判断。发布成不成功,我一直按"接口返回 200"算。这个标准错了很久。200 只代表我这一端的请求被收下了,不代表对面真的存了、真的能打开。
现在整个流程劈成三段。发之前检查内容和图,发之后拉一次列表核对条数,再随机点开一篇,看图和正文是不是都在。前两段自动跑,第三段抽查,一天抽两三篇,不固定。
这套东西没什么技术含量,写出来也就几百行。值钱的地方不在代码,在我第二天早上打开对账表,扫一眼就知道昨晚发生了什么,不用再一篇一篇点进去。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。