一揪罕、本文的目標
網上有各路大神編寫的大量優(yōu)秀 Surge 腳本梯码,能幫大家解決很多問題。這些腳本很強大也比較復雜好啰,當在特定場景下不能滿足要求時轩娶,自己想改卻很難。我一直覺得“授人以??不如授人以漁”坎怪,熟悉了腳本的編寫方法罢坝,然后不斷熟悉并寫出適合自己需求的腳本才是王道。
網絡上靠譜兒的 Surge 腳本教程比較少搅窿。其實官方文檔寫得非常清晰了嘁酿。只不過作者可能是覺得使用 Surge 的同學都是專業(yè)技術同學,所以沒有做成保姆級教程男应。本文嘗試通過簡單的場景和例子闹司,對應文檔加以說明,爭取使用最簡單務實的場景把腳本大體寫法說清楚沐飘,算是為入門掃清障礙游桩,便于大家閱讀文檔了解細節(jié)的內容。
二耐朴、腳本編寫規(guī)則
Surge 腳本的官方文檔在這里:https://manual.nssurge.com/scripting/common.html
使用 Surge 腳本需要兩部分工作:
- 第一部分是 Surge 配置文件中的
[Script]
區(qū)塊中指定腳本規(guī)則借卧,每行第一個等號前面的部分是腳本名稱
,等號后面是腳本屬性(這里只列出最常用的)-
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 語法镰吵,腳本中可以使用各種環(huán)境變量檩禾,需要注意的是必須使用 $done()
來表示執(zhí)行完成并返回,否則會認為超時疤祭。返回的內容以對象形式寫在括號中盼产。不需要返回值則括號中內容留空。
三勺馆、場景及應用舉例
1戏售、根據當前 Wi-Fi 的 SSID 來判斷如何解析域名
場景:有一臺辦公用的服務器,在公司連接公司 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]
區(qū)塊腳本名稱:
server_dns_script
腳本類型:
dns
腳本文件路徑:
dns.js
-
[Host]
區(qū)塊- 要解析的域名:
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 來根據規(guī)則來選擇策略
場景:有一臺代理服務器,在公司連接公司 Wi-Fi 的時候通過公司內網地址連接代理服務器械荷,不在公司的時候通過外網地址連接代理服務器共耍。
- 公司 Wi-Fi 的 SSID:
Compony-Net
- 公司內網代理:
192.168.1.100:1234
- 公司外網代理:
11.22.33.44:5678
思路:分別配置內網代理策略和外網代理策略,編寫腳本根據 SSID 判斷規(guī)則吨瞎,根據規(guī)則選擇策略痹兜。
(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]
區(qū)塊:代理策略-
[Script]
區(qū)塊腳本名稱:
intranet_ssid_rule_script
腳本類型:
rule
腳本文件路徑:
rule.js
-
[Rule]
區(qū)塊- 符合內網匹配規(guī)則:使用
Company
策略 - 符合外網匹配規(guī)則:使用
Internet
策略 - 每條規(guī)則組成:
-
NOT
:取反規(guī)則,根據情況選用 -
SCRIPT
:表示腳本類型的規(guī)則 -
intranet_ssid_rule_script
:腳本名稱颤诀,在[Script]
中指定 - 最后一段是
策略名
-
- 符合內網匹配規(guī)則:使用
(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://manual.nssurge.com/scripting/common.html
-
一些腳本樣例:
(完)