这两天一直在折腾一件事——把博客自动同步到微信公众号的脚本,从Mac本地挪到云服务器上。
说起来这个事也挺搞笑的。之前微信API要求调用必须从白名单IP发起,我理所当然地把Mac的出口IP加进去了。问题是Mac在家里是DHCP拿的地址,过几天IP就变了。
每次IP一变,同步脚本就跑不通。token拿得到,draft接口直接返回”not in whitelist”。搞了几次之后烦了,想了个办法——在Mac上开SSH隧道连服务器的MySQL,从本地调微信API。相当于拐了个弯,数据从服务器拉到Mac,再从Mac推到微信。能用,但有两个问题:Mac得开着,隧道断了脚本就挂。
前天突然反应过来——我干嘛不直接把服务器IP加到白名单?43.130.242.135,固定IP,永远不会变。
说干就干。登微信公众号后台,在开发→基本配置里换掉了白名单IP。然后用curl从服务器直接调了一把token接口:
curl -s 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=***&secret=***'
返回了access_token。通了。
接下来就是把本地的同步脚本搬到服务器上运行。改动其实不大,关键点就三个:
- 数据库连接从 127.0.0.1:13306(SSH隧道)改成 127.0.0.1:3306(本地直连)
- 图片下载从 sshpass+scp 远程拉取,改成直接读本地 /var/www/html/wordpress/wp-content/uploads/
- token缓存文件路径从 /tmp/wx_access_token.json 改成 /home/ubuntu/wx_token_cache.json,因为 /tmp 目录权限问题
第三个坑花了我十来分钟。脚本第一次运行就报 Permission denied,折腾了半天发现是之前某次 sudo 跑脚本,token缓存文件owner变成了root,ubuntu用户写不进去。换个路径就解决了。
改完部署上去一跑,草稿创建成功,media_id也写回了数据库的 wp_postmeta 表。整个过程从”依赖Mac在线+SSH隧道+本地调API”简化成”服务器一条命令搞定”。
sshpass -p '***' ssh ubuntu@43.130.242.135 "python3 /home/ubuntu/wp_to_wechat_server.py 444"
顺便把定时任务也改了。之前10:00的技术文章和22:00的日记自动发布,同步环节依赖Mac在线。现在改成服务器直连,Mac关了也不影响。自动化里去掉了一大段SSH隧道检查和expect脚本的代码,干净多了。
搞完这件事顺手看了一眼公众号后台的API调用统计。之前因为Mac IP变化导致失败重试的次数还不低,每天总有那么一两次。换到服务器之后应该不会再有这个问题了。
这件事给了我一个教训:别在动态的东西上建依赖。Mac IP会变,就别拿它当白名单基础。能用云服务器固定IP解决的,就别绕弯子。当时绕的那个SSH隧道方案,本质上是在一个不稳的地基上盖房子,早晚要塌。
不过话说回来,隧道方案也不是完全没用。至少那段时间它让自动同步能跑起来,每天三篇博客老老实实地推到了公众号草稿箱。算是临时方案里不坏的那种。
现在整个流程简洁多了:写文章→PHP插库→服务器脚本同步微信。三步搞定,不需要中间人。
今天周日,就干了这一件事。其他时间在补觉和刷手机,没啥可写的。