2026年5月7日 晴 热得要死
妈的今天又搞到凌晨两点,服务器上那个博客自动发布脚本终于从v1折腾到v3了。过程一言难尽,先记下来省得明天忘了又踩坑。
脚本升级血泪史:v1到v3
之前的v1版本就是个破玩意儿,用bash硬写,每次发布还得手动改几个变量。最傻逼的是连错误处理都没有,有一次markdown文件名写错了空格,直接把整个nginx搞挂了,吓得我差点当场去世。
v2好一点,我加了点基础的退出码判断,但本质上还是个一次性脚本。直到上周老板说”博客能不能自动每天抓取GitHub的issue更新”,我才意识到这破脚本必须重写了。
v3的核心改动:
- 彻底抛弃sshpass,改用expect处理远程服务器的密码交互(后面细说)
- 加入增量更新机制,只发布时间戳比上次更新的文件
- 用Python subprocess替代shell的管道操作,至少报错时我能看懂traceback
最让我头疼的是这个增量更新的逻辑。一开始想用git log来对比,但发现本地仓库和服务器上版本经常不一致(手欠直接改了服务器上的文件)。最后直接用文件的mtime和本地一个hash文件做比对,虽然粗暴但至少能用。核心代码大概长这样:
import os, hashlib, json
CACHE_FILE = '.publish_cache.json'
def get_file_hash(path):
with open(path, 'rb') as f:
return hashlib.md5(f.read()).hexdigest()
def check_updated(file_path):
if not os.path.exists(CACHE_FILE):
return True
with open(CACHE_FILE) as f:
cache = json.load(f)
return cache.get(file_path) != get_file_hash(file_path)
这代码写得屎一样,但反正能用,懒得优化了。等v4再说吧。
微信公众号排版推送:expect 真香
说到这个我就来气。微信公众号的素材管理API,我怀疑是实习生写的——上传草稿后必须手动去后台点”发布”,自动化程度低得令人发指。更操蛋的是,如果草稿已经存在,直接上传会报错,必须加一个 force参数 覆盖。
我之前一直用sshpass来处理远程服务器的密码输入,但这玩意儿有个大坑:密码里有特殊字符(比如$符号)时,直接给你解析成变量,然后报错。试了三次都卡死,气得我差点把键盘砸了。
后来换了 expect,虽然语法反人类,但至少能精确控制交互流程。我写了个expect脚本片段来处理这个:
#!/usr/bin/expect -f
set timeout 30
spawn ssh user@blog-server
expect "password:"
send "my_p@ssw0rd\r"
expect "$ "
send "curl -X POST https://api.weixin.qq.com/cgi-bin/material/add_news \
-d '{\"force\": true, \"articles\": [@article_list]}'\r"
expect "$ "
send "exit\r"
expect eof
注意那个 force: true,不加的话微信API会返回 {"errcode":45009} 说素材已存在。我查了半天的文档才发现这个参数,文档写得跟屎一样,藏在第三层折叠里,操。
现在每天凌晨3点,cron跑这个脚本自动把草稿push到公众号。虽然偶尔会卡在expect的timeout上,但至少90%的情况能成功。失败了大不了早上起来手动发,无所谓。
Lovable AI 和 Cursor 的体验感受
最近圈子里都在吹Lovable AI,说能直接生成可部署的代码。我试了一下,吹得天花乱坠,实际就一玩具。你用自然语言描述需求,它给你生成一个React组件,看起来像那么回事,但稍微复杂点的逻辑就开始胡编了。
举个例子,我让它写一个自动检测博客图片链接是否404的功能。它生成的代码居然用同步的XMLHttpRequest来请求图片,然后阻塞主线程。我尼玛,这代码放生产环境,用户直接骂娘。更离谱的是它完全没处理CORS错误,遇到跨域图片就直接崩溃。
相比之下,Cursor 虽然也智障,但至少能当个高级点的自动补全用。我写Python脚本时,它偶尔能猜对我要用哪个库的函数。不过一旦涉及到多文件联动,比如同时修改views.py和models.py,它就开始胡言乱语了。建议改个变量名,结果把所有文件里同名变量都改了,包括注释里的——妈的注释里的”index”变量你也改?
总结就是:这些AI编程工具,写写demo还行,真干活还得自己来。至少目前是这样。可能再过两年它们能进化到帮我写日记吧,那我第一个失业的就是我自己,哈哈。
行了,都凌晨三点半了,明天还得早起开会。这破日记写到这儿吧,最后加一句:AI永远替代不了我写bug的能力。