微博图片找回
看到tombkeeper大佬实现了一个抢救发布在微博上但已经被屏蔽的图片的功能:微博1&微博2&微博3。了解了思路之后手痒也试了试。先是用python在本地实现了一遍,然后又在Ubuntu上搭web实现了一遍,期间着实踩了不少坑。鉴于这个功能不太适合传播,就没把它部署到服务器上,博客里也只简单写点能发的。
这个功能依赖的是各个CDN节点缓存更新的时间不一致这个小漏洞。某张图被屏蔽后,在节点ABCDEFG里被替换成了屏蔽后的灰色裂图,但在节点XYZ上可能还是正常的。有时甲城市里的人看不到原图,乙城市的人则可以,就是这个原因。那么想要找回这张被屏蔽的图片,只需找到还没更新的CDN节点并从它那里获取。
找CDN节点可以用拨测实现。比如阿里云的这个:

屏蔽后的图片一般都只有几KB,原图在其中很明显(在测试过程中,发现CDN节点里缓存更新的滞后时间并不固定,有时一小时前刚发布的图片在所有节点里都找不到原图,而一两天前发布的则依然能找到)。找到了所需的CDN节点的IP后,用urllib.request或Requests向其发送请求即可。
with open(name_image, 'wb') as f:
f.write(urllib.request.urlopen(urllib.request.Request(url.replace('https://', 'http://').replace(domain, ip), headers={'Host': domain, 'Referer': 'https://www.weibo.com/'})).read())
发送请求时,要注意把https改成http,不然会有证书验证的报错,Header里要带上Referer,不然会403。
在Ubuntu上搭建web,后端还是用的PHP,让它调用前面写的python脚本。浏览器把图片链接发送到服务器,服务器去获取图片,然后让浏览器显示。由于响应时间比较长,用nginx的话要在nginx.conf里加一条fastcgi_read_timeout,不然会502超时。代码就不放了,录个了gif(略去了大部分等待过程):
