之前写过一篇《还是关于爬爬爬...爬虫,送你很多个公网ip怎么样》,介绍怎么复用 Cloudflare Worker 作为爬虫代理。实验中的 worker 域名为:ip.ym.workers.dev,访问这个网站,每次返回的 IP 都可能不同,这个 IP 实际是运行该 Worker 的网络环境的IP,比如:
curl https://ip.ym.workers.dev
{
"origin": "162.158.165.175"
}
由于负债重,为了节约成本
,之前买的几台服务器我都退了。但作为开发,有时还是会有用到服务器的需求,幸好 CF Worker 是个不错的选项,尤其是最近 kv 存储也有免费配额了,我自然要拿来试试手。
第一个尝试,是把微信公众号的文章同步到 Worker 上,这样即使文章被屏蔽,在 Worker 上仍然能看到。
我的实现步骤是:
使用 wrangler 初始化一个新的 Worker 项目; 编写代码,调用 微信公众号API 拉取公众号文章并保存到 Cloudflare kv 中; 将个人域名绑定到这个新的 Worker 项目,域名暂定为 blog.beloved.family; 当用户访问 blog.beloved.family/:文章名 时,从 kv 中读取文章渲染为 HTML 给到浏览器; 因为不定期会写新的公众号文章,还要用 Worker 的定时任务来定期同步。
成果呢?访问这篇文章试试:https://blog.beloved.family/:一周推文收藏第7期[1]。
在运行项目的时候遇到一个问题:在用 公众号 API获取 Token 时,微信要求只能在白名单中的IP 才能发起请求。
因为 Worker 运行在 Cloudflare 全球节点上,其 IP 既非单个,也非固定。我首先想到的是,在公众号里配置常用的全匹配IP:0.0.0.0。可以保存成功,但并不生效,很明显微信不支持这个,只能指定具体的IP。
那么,怎么得到 Worker 的全部 IP 呢?
回头想想,文章最开头的 ip.ym.workers.dev 刚好可以用来获取 Worker 的IP。要收集尽可能多的IP,我写了如下脚本来提取:
while true ; do
curl -s https://ip.ym.workers.dev \
| jq .origin -r >> ip.txt
done
这段脚本通过 curl 不断访问上述网站,并将返回结果中的 IP 写入 ip.txt 文件中。
将上述命令运行半小时后,再对 ip.txt 文件中的IP进行去重:
cat ip.txt | sort | uniq
162.158.165.140
162.158.165.141
162.158.165.152
162.158.165.153
162.158.165.168
162.158.165.169
...
我们得到了很多 IP (目前是121个,不固定,后期很可能会变)。
把这些 IP 复制出来,配置到微信公众号后台IP白名单中。一个完整的公众号备份网站就此搞定。
参考资料
一周推文收藏第7期: https://blog.beloved.family/:一周推文收藏第7期




