美文网首页Surge
Surge 脚本编写案例

Surge 脚本编写案例

作者: 舌尖上的大胖 | 来源:发表于2022-01-08 01:53 被阅读0次

    一、本文的目标

    网上有各路大神编写的大量优秀 Surge 脚本,能帮大家解决很多问题。这些脚本很强大也比较复杂,当在特定场景下不能满足要求时,自己想改却很难。我一直觉得“授人以🐟不如授人以渔”,熟悉了脚本的编写方法,然后不断熟悉并写出适合自己需求的脚本才是王道。

    网络上靠谱儿的 Surge 脚本教程比较少。其实官方文档写得非常清晰了。只不过作者可能是觉得使用 Surge 的同学都是专业技术同学,所以没有做成保姆级教程。本文尝试通过简单的场景和例子,对应文档加以说明,争取使用最简单务实的场景把脚本大体写法说清楚,算是为入门扫清障碍,便于大家阅读文档了解细节的内容。

    二、脚本编写规则

    Surge 脚本的官方文档在这里:https://manual.nssurge.com/scripting/common.html

    使用 Surge 脚本需要两部分工作:

    • 第一部分是 Surge 配置文件中的 [Script] 区块中指定脚本规则,每行第一个等号前面的部分是脚本名称,等号后面是脚本属性(这里只列出最常用的)
      • type:脚本类型
        • http-request
        • http-response
        • cron
        • event
        • dns
        • rule
      • script-path:脚本的路径,可以是配置文件的相对路径、绝对路径或 URL。

    文档中的举例:

    [Script]
    script1 = type=http-response,pattern=^http://www.example.com/test script-path=test.js,max-size=16384,debug=true
    scropt2 = type=cron,cronexp="* * * * *",script-path=fired.js
    scropt3 = type=http-request,pattern=^http://httpbin.org script-path=http-request.js,max-size=16384,debug=true,requires-body=true
    scropt4 = type=dns,script-path=dns.js,debug=true
    
    • 第二部分就是编写的脚本,脚本为 JavaScript 文件

    就是标准的 JavaScript 语法,脚本中可以使用各种环境变量,需要注意的是必须使用 $done() 来表示执行完成并返回,否则会认为超时。返回的内容以对象形式写在括号中。不需要返回值则括号中内容留空。

    三、场景及应用举例

    1、根据当前 Wi-Fi 的 SSID 来判断如何解析域名

    官方文档:Surge Scripting - DNS

    场景:有一台办公用的服务器,在公司连接公司 Wi-Fi 的时候通过公司内网地址访问,不在公司的时候通过外网地址访问。

    • 公司 Wi-Fi 的 SSID:Compony-Net
    • 在公司使用内网地址:192.168.1.100
    • 公司外使用外网地址:11.22.33.44

    思路:为服务器主机指定一个域名(假设为 server.net),根据当前连接网络的 SSID 来判断是否连接公司 Wi-Fi,再决定如何做域名解析。

    (1)Surge 配置文件中的设置内容

    [Script]
    server_dns_script = type=dns,script-path=dns.js
    
    [Host]
    server.net = script:mocha_tunnel_dns_script
    

    说明:

    • [Script] 区块

      • 脚本名称:server_dns_script

      • 脚本类型:dns

      • 脚本文件路径:dns.js

    • [Host] 区块

      • 要解析的域名:server.net
      • 指定解析方式:script:mocha_tunnel_dns_script 表示以脚本形式解析,使用的脚本为 server_dns_script

    (2)JavaScript 脚本

    // 连接公司 Wi-Fi
    if ($network.wifi.ssid === 'Compony-Net') {
        $done({address: '192.168.1.100'})
    } else {
        $done({address: '11.22.33.44'})
    }
    $done()
    

    说明:

    • 通过 $network.wifi.ssid 判断公司 Wi-Fi
    • 通过 $done({address: 'xx.xx.xx.xx'}) 来返回解析地址

    根据文档,该脚本应返回以下内容之一:

    • address<String>:作为结果使用此 IP 地址。 它必须是字符串中的有效 IPv4/IPv6 地址。
    • address<Array>:结果使用多个 IP 地址。
    • server<String>:要求 Surge 通过指定的上游 DNS 服务器查找域。 它必须是字符串中的有效 IPv4/IPv6 地址。
    • server<Array>:要求 Surge 通过多个指定的上游 DNS 服务器查找域。

    2、根据当前 Wi-Fi 的 SSID 来根据规则来选择策略

    官方文档:Surge Scripting - Rule

    场景:有一台代理服务器,在公司连接公司 Wi-Fi 的时候通过公司内网地址连接代理服务器,不在公司的时候通过外网地址连接代理服务器。

    • 公司 Wi-Fi 的 SSID:Compony-Net
    • 公司内网代理:192.168.1.100:1234
    • 公司外网代理:11.22.33.44:5678

    思路:分别配置内网代理策略和外网代理策略,编写脚本根据 SSID 判断规则,根据规则选择策略。

    (1)Surge 配置文件中的设置内容

    [Proxy]
    Company = ss, 192.168.1.100, 1234, encrypt-method=aes-256-gcm, password=123
    Internet = ss, 11.22.33.44, 5678, encrypt-method=aes-256-gcm, password=456
    
    [Script]
    intranet_ssid_rule_script = type=rule,script-path=rule.js
    
    [Rule]
    SCRIPT,intranet_ssid_rule_script,Company
    NOT,((SCRIPT,intranet_ssid_rule_script)),Internet
    

    说明:

    • [Proxy] 区块:代理策略

    • [Script] 区块

      • 脚本名称:intranet_ssid_rule_script

      • 脚本类型:rule

      • 脚本文件路径:rule.js

    • [Rule] 区块

      • 符合内网匹配规则:使用 Company 策略
      • 符合外网匹配规则:使用 Internet 策略
      • 每条规则组成:
        • NOT:取反规则,根据情况选用
        • SCRIPT:表示脚本类型的规则
        • intranet_ssid_rule_script:脚本名称,在 [Script] 中指定
        • 最后一段是策略名

    (2)JavaScript 脚本

    // 连接公司 Wi-Fi
    let is_intranet = $network.wifi.ssid === 'Compony-Net'
    $done({matched: is_intranet})
    

    说明:

    • 通过 $network.wifi.ssid 判断公司 Wi-Fi
    • 通过 $done({matched: is_intranet}) 来返回解析地址

    根据文档,该脚本应返回如下内容:

    {matched: is_intranet}
    
    • matched<Bool>:返回是否匹配。

    四、参考资料

    (完)

    相关文章

      网友评论

        本文标题:Surge 脚本编写案例

        本文链接:https://www.haomeiwen.com/subject/xitecrtx.html