前言

最近在爬一个国外的网站,网站反爬措施比较全,我需要频繁切换 IP 来访问网站。

方式1: clash for windows 使用脚本检测切换节点

开始我找到了在 clash for windows 里面增加脚本的方式,实现切换 IP ,但是这个方法策略只是保证 IP 是高可用的,并没有一直切换 IP。

参考
https://github.com/Fndroid/clash_for_windows_pkg/issues/1556#issuecomment-1189829336

这个网页是我记录在备忘录的。因为”clash风波”,这个 repo 被删了,我也没有找到别的博客记录的脚本代码。

方式2: 在golang中使用clash作为http客户端的代理

参考

https://p00q.cn/posts/906.html

这个办法是在程序中创建一个 clash 的实例,实例读取 clash 配置文件,因为 clash 库🈚️了,导入代码库不是很方便,我找备份都找了很久。目前找到了一个较新的备份是 https://github.com/Ieooo/clash

但是这样聚合多个机场的节点不是很方便,难道我要创建多个实例么。。。?

方式3: 使用 glider 聚合代理节点为代理池

后来找到了 glider,glider 是一个将机场节点变为爬虫代理池的神器,完美满足我的需求。

但是当前版本 0.16.3 ,还不支持 base64 方式的节点链接。

一开始,我使用这个仓库的脚本对我机场配置文件进行转换。

glider 启动后运行正常,但是这样也不是个长久之计。

机场一般一天会更换节点,频繁去解码拷贝节点到配置文件也不太现实,然后看到了这篇文章,给我了启发,于是我开始魔改代码,

基于目前最新版 0.16.3,首先增加了解码 base64 的功能,后面增加了订阅链接的功能。

本来还想定期检测订阅链接,自动更新节点,但是涉及要替换里面已经存在的节点,我觉得处理起来有点麻烦,暂时先这样了。

所以就是启动的时候会从订阅去获取节点,然后放在代理组内,代理组的代理仍然遵循配置文件的时间,定期检测。

总的来说改动如下:

  1. 增加了支持 base64 的 vmess 连接(base64decode 后是 json 的格式)
  2. 增加了支持 base64 的 ss 连接(这种连接的 method 和 pass 是 base64 格式的)
  3. 修复了 trojan 链接格式,我这边的链接都是用的 sni,而不是 serverName,skipVerify 的值是 true。(glider 0.16.3 的 trojan 还是不支持 alpn 和 udp)
  4. 增加了支持机场订阅链接,可以填写多个机场订阅链接,仅在 【4.multiple_forwarders】 使用场景测试可以用,可能破坏了其他功能。(订阅链接限制:base64 编码,且非 clash 格式,base64 解码后是多条节点链接,不带规则配置。)

配置文件增加了一项

1
forwardprovider=https://www.xxx.com/api/v1/client/subscribe?token=xxxxxx

可以配置多行

1
2
3
forwardprovider=https://www.xxx.com/api/v1/client/subscribe?token=xxxxxx
forwardprovider=https://www.xxx2.com/api/v1/client/subscribe?token=xxxxxx
forwardprovider=https://www.xxx3.com/api/v1/client/subscribe?token=xxxxxx

测试命令,查看是否是轮换代理ip去访问

1
for i in {1..20};do curl -s -k https://api.ip.sb/ip -H 'user-agent: zsh-proxy' -x "http://127.0.0.1:8443" ;done

运行效果

在做 base64 支持的同时,发现 glider 对代理的新特性不支持:

  1. 不支持 trogan 的 alpn 和 udp
  2. 不支持 vmess 的 udp 以及 network: grpc

如果发现有的节点因为找不到 dns 记录连接失败

需要这样配置dns服务器

1
2
3
4
5
# Setup a dns forwarding server
dns=:53
# global remote dns server (you can specify different dns server in rule file)
dnsserver=1.1.1.1
dnsserver=8.8.8.8

启动后会通过可以连接的代理连接 dns 服务器查找域名

如果能支持 doh 就更好了,之前也有人提过 pr (见 https://github.com/nadoo/glider/pull/208),作者觉得会引入 net/http 使得编译后的二进制文件变得很大。后面 pr 因为超时(大于 90天)没有回复被关闭了。

我这边测试,因为要获取订阅内容,所以也引入了 net/http,编译后的二进制文件 12M,相对改动之前的 8M,多了 4M,我认为是可以接受的吧。

彩蛋

开始看了下代码仓库,README.md 全英文,作者的账号信息也没写是不是国内的开发者,但是我直觉感觉是,除了XX,还有哪个国家的人会有这样的需求呢?

在谷歌上搜了下,发现作者开源代码时在 v2ex 上发帖

https://www.v2ex.com/t/375186

所以 glider 一开始只是开发者分享的自用小工具,后面才广为流传,一如曾经 ss。

当作者分享了小工具后,有人甚至帮忙打了一个包放到 Arch 里。

参考

  1. https://github.com/Fndroid/clash_for_windows_pkg/issues/1556#issuecomment-1189829336
  2. https://github.com/Rain-kl/glider_guid41asd4asd
  3. https://zgao.top/glider-%E5%B0%86%E6%9C%BA%E5%9C%BA%E8%8A%82%E7%82%B9%E5%8F%98%E4%B8%BA%E7%88%AC%E8%99%AB%E4%BB%A3%E7%90%86%E6%B1%A0%E7%9A%84%E7%A5%9E%E5%99%A8/
  4. https://mp.weixin.qq.com/s/BKog3ZR1zJdAsqi5OXBsqw
  5. https://www.v2ex.com/t/375186