2022/07/04 更新:有更簡單的新版教學了
原本是照 jkgtw 大大這篇的教學做的,但我的需求不太一樣,我沒有用路由器在 WiFi 下直接指定 DNS 使用 AdGuard Home,因為這樣如果誤擋的話很難幫家人或裝置 debug 是不是 DNS 的問題。
因此我的需求變成了:用 Surge 在網路變化時,使用指定的 DNS,而不是單純的「開」或「關」而已。
方法跟 jkgtw 大大的教學差不多,只是模組我們改成需要建立兩個。我的情境是在家的時候直接用 IP 連家裡的 AdGuard Home,出外的時候則改用 DoH 去連回家裡的 AdGuard Home。
模組 1:
1 2 3 4 5 |
#!name=AdGuard Home #!desc=啟用 AdGuard Home 本地 DNS [General] dns-server = 192.168.1.100 |
模組 2(這裡用 FutaDNS 舉例):
1 2 3 4 5 |
#!name=AdGuard Home DoH #!desc=啟用 AdGuard Home DoH [General] doh-server = https://app.futa.gg/dns-query |
然後 script 改成:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
const dns_module_home = 'AdGuard Home'; const dns_module_out = 'AdGuard Home DoH'; const home = $network.wifi.ssid === 'SSID1' || $network.wifi.ssid === 'SSID2'; function getModuleStatus() { return new Promise((resolve) => { $httpAPI('GET', 'v1/modules', null, (data) => { let enabled = data.enabled; resolve([enabled.includes(dns_module_home), enabled.includes(dns_module_out)]); }); }); } const switchModule = (enable_module_name, disable_module_name) => { $httpAPI('POST', 'v1/modules', { [enable_module_name]: true, [disable_module_name]: false, }, () => $done()); } getModuleStatus().then((module_status) => { if (home && (!module_status[0] || module_status[1])) { // 在家,用本地 DNS $notification.post('使用 AdGuard Home 本地 DNS', '', '') switchModule(dns_module_home, dns_module_out); } else if (!home && (module_status[0] || !module_status[1])) { // 不在家,使用 DoH $notification.post('使用 AdGuard Home DoH', '', '') switchModule(dns_module_out, dns_module_home); } else { // 重複觸發 => 結束 // $notification.post('重複觸發','','') $done(); } }) |
以下是舊版 Script,僅做保留參考用,建議用上面的新版 Script。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
const dns_module_home = "AdGuard Home"; const dns_module_out = "AdGuard Home DoH"; const http_api = "localhost:6171"; const http_api_key = "YOUR_API_KEY"; let request = { url: `http://${http_api}/v1/modules`, headers: { "X-Key": http_api_key }, body: {}, } getModuleStatus(dns_module_home, dns_module_out).then(main) function getModuleStatus(dns_module_home, dns_module_out) { return new Promise(resolve => { $httpClient.get(request, (error, response, data) => { let enabled = JSON.parse(data).enabled; resolve([enabled.includes(dns_module_home), enabled.includes(dns_module_out)]); }); }); } function switchModule(enable_module_name, disable_module_name) { request.body[enable_module_name] = true; request.body[disable_module_name] = false; $httpClient.post(request, () => $done()); } function main(module_status) { let home = ($network.wifi.ssid == 'SSID1' || $network.wifi.ssid == 'SSID2'); if (home && (!module_status[0] || module_status[1])) { // 在家,用本地 DNS $notification.post("使用 AdGuard Home 本地 DNS", "", "") switchModule(dns_module_home, dns_module_out); } else if (!home && (module_status[0] || !module_status[1])) { // 不在家,使用 DoH $notification.post("使用 AdGuard Home DoH", "", "") switchModule(dns_module_out, dns_module_home); } else { // 重複觸發 => 結束 // $notification.post("重複觸發","","") $done(); } } |
發佈留言