使用Surge规则脚本、快捷指令自动化生成专属规则集

使用Surge规则脚本、快捷指令自动化生成专属规则集

本文为Surge APP规则系统中的高级使用方法,有一定的理解难度。

不知道大家有没有想过,Github 上大佬们分享的大多都是通用规则集,并不一定适合自己,所以有时候就在想,除了特定应用程序的规则,国内域名国外域名能不能按照自己的网络环境自动生成一份专属规则。


思路

我们可以使用 Surge 的脚本规则实现,由于 Surge 本身无法写入文件到本地,但我们可以借助系统的自带的快捷指令写入,所以我们基本的实现思路大致为:

  • 域名请求命中脚本规则

  • 脚本规则缓存加工后的域名

  • 快捷指令读取脚本规则缓存并写入规则集到本地

脚本实现

该脚本已上传至 Github 仓库,链接:

1
https://github.com/NobyDa/Script/blob/master/Rule-Storage/Rule-Storage.js

工作流

简化后的脚本核心工作流:

为了避免生成太多无用规则,脚本会判断多级域名并有相应的处理。eTLD 即公共后缀列表,指的是Internet域名系统中的一部分域名,这部分域名在 eTLD 列表中定义。例如一个域名 www.abc.com,eTLD 列表内将包含 com 这个顶级域。

脚本规则可以参照该 eTLD 列表缩减多级域名并生成域名后缀规则(DOMAIN-SUFFIX),但二级域名、非 eTLD 域名、完整 eTLD 域名只会生成域名规则(DOMAIN)


配置脚本

配置

我的需求是生成国内域名国外域名的规则集,我们首先配置 Surge 脚本,在 Surge 配置文件中的[Script]段落添加以下脚本,参数可以按照说明按需添加

1
2
3
Save-Final-Rule = type=rule,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Rule-Storage/Rule-Storage.js,argument=region=global

Save-China-Rule = type=rule,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Rule-Storage/Rule-Storage.js,argument=region=china&matched=1

参数

由于脚本设计之初考虑到脚本复用问题,我们需要配置参数才能正确运行

  • 区域参数:region,该参数为必须

  • 匹配参数:matched,即指示脚本规则完成后是否匹配指定的策略,默认不匹配,输入matched=1即表示匹配

  • 键值参数:key,持久化储存所使用的键值,默认为Rule-Storage,一般用户无需理会

  • 白名单参数:whitelist,域名匹配白名单规则时,跳过生成域名后缀规则(DOMAIN-SUFFIX),该参数仅接受数组,例如whitelist=[".mwcname.com",".cdn."],规则有三种写法:

    • 域名:example.com

    • 域名后缀:.example.com

    • 域名关键字:.example.

  • 数量参数:quantity,一个域名运行脚本第x次才生成规则,默认为 10 次

  • 间隔参数:interval,一个域名两次运行脚本的标记间隔,默认为 30 秒

除了区域参数为必要之外,其他参数都有默认值,需要注意的是脚本内已内置了部分跳过生成域名后缀的白名单规则,如果白名单参数存在,将会被参数覆盖。

多参数使用 & 连接,例如:

1
argument=region=global&quantity=5&interval=10

配置规则

配置

要生成国内和国外规则,那么这个脚本规则必须放在FINAL规则前,规则的先后顺序非常重要,由于每个人使用的规则都有细微差别,所以这里我们展开讲讲。

规则示例:

配置示例:

1
2
3
4
5
RULE-SET,Rule/Foregn_Set.txt,🌎 Foregn,no-resolve,extended-matching

RULE-SET,Rule/Domestic_Set.txt,🇨🇳 Domestic,extended-matching

AND,((OR,((GEOIP,CN), (DOMAIN-SUFFIX,cn), (AND,((RULE-SET,https://raw.githubusercontent.com/NobyDa/Script/master/Rule-Storage/Include-Domain.txt), (SCRIPT,Save-Final-Rule))))), (OR,((NOT,((RULE-SET,https://raw.githubusercontent.com/NobyDa/Script/master/Rule-Storage/Include-Domain.txt))), (SCRIPT,Save-China-Rule)))),🇨🇳 Domestic

其中 Foregn_Set.txtDomestic_Set.txt 为快捷指令读取脚本规则缓存生成的本地规则集文件,稍后我们会讲到。规则顺序为

  • 国内规则集(生成)

  • 国外规则集(生成)

  • 逻辑规则,内含脚本规则

Surge 的规则系统在前面的规则匹配后,后面的规则将不会执行,所以我们以这个为基础写一个逻辑规则

工作流

以下为配置示例中的逻辑规则工作流:

为了性能考虑避免IP域名经过脚本,以及实现区域判定,我们需要借助 GeoIP 规则、域名关键字规则、逻辑规则互相配合才能完成。

逻辑规则中的子规则可以按需修改,比如去掉DOMAIN-SUFFIX,cn规则。逻辑规则基本概念可以在 Surge 文档中找到

GEOIP

因为区域判断是基于GEOIP数据库,所以我们需要一份相对准确的数据库,这里推荐使用自己另外一个项目,自用了几年还不错。仓库地址:

1
https://github.com/NobyDa/geoip

配置快捷指令

域名经过逻辑规则和脚本生成缓存规则后,我们可以写一个快捷指令提取 Surge 中的缓存规则并写入文件到本地。

我们需要先配置 Surge 中自带的 HTTP API 功能,可以在Surge -> 更多设置 -> HTTP API中找到,设置端口和密码后,在安装快捷指令时填入即可。

快捷指令安装链接:

1
https://www.icloud.com/shortcuts/39c9a8720c9a49288ac1a2bf433da098

需要注意的是,如果没有开启 Surge iCloud 同步将无法使用(生成的规则集储存在 iCloud 的 Surge 文件夹)

快捷指令默认会把 Foregn_Set.txtDomestic_Set.txt 规则集储存至 Surge 根目录的 Rule 文件夹,可以手动编辑快捷指令修改 China & Global词典。

词典内的Key即为 Surge 持久化规则缓存的读取键值(脚本内会根据脚本参数的键值参数区域参数自动拼接读取键值,自用的是Rule-Storage-chinaRule-Storage-global)一般无需修改。

自动化

生成规则后我们可以使用快捷指令的自动化自动运行快捷指令,例如可以每天特定时间或打开 Surge 时运行快捷指令,这类自动化都可以关闭运行前询问。按自己的需求设置即可。


事项

这个脚本的初衷是为了解决规则系统的 DNS 查询问题,经常访问的国外域名可以在 FINAL 规则之前省去一次 DNS 查询以获得更好的体验,脚本经过多次迭代后基本已经没有太大问题。

如果有小伙伴需要使用文章中的脚本规则,请务必注意调整自己所使用的通用规则,例如配置生成的规则后需要删除之前所使用的通用 China 或 Global 规则集,也需要禁用IP类规则集,最主要的是规则顺序,一些细节问题也要根据实际情况进行调整。所以只建议对 Surge 和规则有一定理解、动手能力强的小伙伴去折腾。

问题

  • 由于是自动生成的规则,有时候需要手动调整生成后的规则,例如删除一些不需要被代理的域名。

  • 由于国外规则集顺序在前,有时候会混进一些国内域名导致分流不符合预期,这里可以使用另外一个快捷指令移除国外规则集里跟国内规则集重复的规则。

    1
    https://www.icloud.com/shortcuts/cf7e329cf84147ad90447cc7135b53e0
  • 由于刚开始需要使用一段后才会生成规则,如果确认要使用,推荐短期内调整一下脚本参数的数量参数间隔参数 以达到快速生成规则的目的。


后记

说起来也好久没有更新博客和脚本了,一方面是因为装源码的硬盘出了点小问题,索性就放抽屉吃灰了,另一方面也可能是自己对这类APP痛失了兴趣,没有足够的动力对开源社区做出贡献。

事情起因可能是因为有一天突然意识到赞许的声音越来越多,以致于自己在网络上花的时间日益增多,进而疏忽了现实生活中的一些人和事。这引起了我对当下生活的一种深度思考。

人嘛,总是会选择一种生活方式来构建自己生活的意义,每个年龄段的意义都会不尽相同。美好生活就是让自己过上喜欢的日子,这是我对美好生活的定义。这鼓励了我,所以我开始减少花在网络上的时间,给生活做减法。

时间果然转瞬即逝,到了2024又是一个新的篇章,也挺久没有折腾 Surge 脚本了,为此分享给大家一个自用脚本。由于是按照自己需求写的所以不一定适合大众,有类似需求的小伙伴可以参考文章的思路的手动配置专属规则。

生命不息,折腾不止。

以上

使用Surge规则脚本、快捷指令自动化生成专属规则集

https://nobyda.github.io/2024/02/24/Surge_Rule_Storage/

作者

NobyDa

发布于

2024-02-24

更新于

2024-02-24

许可协议

评论