From b11dd6bf0bc01e450e487f0fcd67e9b82d6ae441 Mon Sep 17 00:00:00 2001 From: Kenny Yang Date: Thu, 3 Apr 2025 23:38:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0DNS=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=92=8C=E4=BB=A3=E7=90=86=E7=BB=84=E8=A7=84=E5=88=99=E5=88=B0?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 引入国内和国外DNS服务器配置,并添加代理组规则以支持节点选择、延迟选优等功能,优化网络请求的代理策略。 --- sample-script.js | 319 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 319 insertions(+) create mode 100644 sample-script.js diff --git a/sample-script.js b/sample-script.js new file mode 100644 index 0000000..9ae03f2 --- /dev/null +++ b/sample-script.js @@ -0,0 +1,319 @@ +// 国内DNS服务器 +const domesticNameservers = [ + "https://dns.alidns.com/dns-query", // 阿里云公共DNS + "https://doh.pub/dns-query", // 腾讯DNSPod + "https://doh.360.cn/dns-query" // 360安全DNS +]; +// 国外DNS服务器 +const foreignNameservers = [ + "https://1.1.1.1/dns-query", // Cloudflare(主) + "https://1.0.0.1/dns-query", // Cloudflare(备) + "https://208.67.222.222/dns-query", // OpenDNS(主) + "https://208.67.220.220/dns-query", // OpenDNS(备) + "https://194.242.2.2/dns-query", // Mullvad(主) + "https://194.242.2.3/dns-query" // Mullvad(备) +]; +// DNS配置 +const dnsConfig = { + "enable": true, + "listen": "0.0.0.0:1053", + "ipv6": true, + "use-system-hosts": false, + "cache-algorithm": "arc", + "enhanced-mode": "fake-ip", + "fake-ip-range": "198.18.0.1/16", + "fake-ip-filter": [ + // 本地主机/设备 + "+.lan", + "+.local", + // Windows网络出现小地球图标 + "+.msftconnecttest.com", + "+.msftncsi.com", + // QQ快速登录检测失败 + "localhost.ptlogin2.qq.com", + "localhost.sec.qq.com", + // 微信快速登录检测失败 + "localhost.work.weixin.qq.com" + ], + "default-nameserver": ["223.5.5.5", "119.29.29.29", "1.1.1.1", "8.8.8.8"], + "nameserver": [...domesticNameservers, ...foreignNameservers], + "proxy-server-nameserver": [...domesticNameservers, ...foreignNameservers], + "nameserver-policy": { + "geosite:private,cn,geolocation-cn": domesticNameservers, + "geosite:google,youtube,telegram,gfw,geolocation-!cn": foreignNameservers + } +}; +// 规则集通用配置 +const ruleProviderCommon = { + "type": "http", + "format": "yaml", + "interval": 86400 +}; +// 规则集配置 +const ruleProviders = { + "reject": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt", + "path": "./ruleset/loyalsoldier/reject.yaml" + }, + "icloud": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt", + "path": "./ruleset/loyalsoldier/icloud.yaml" + }, + "apple": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt", + "path": "./ruleset/loyalsoldier/apple.yaml" + }, + "google": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt", + "path": "./ruleset/loyalsoldier/google.yaml" + }, + "proxy": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt", + "path": "./ruleset/loyalsoldier/proxy.yaml" + }, + "direct": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt", + "path": "./ruleset/loyalsoldier/direct.yaml" + }, + "private": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt", + "path": "./ruleset/loyalsoldier/private.yaml" + }, + "gfw": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt", + "path": "./ruleset/loyalsoldier/gfw.yaml" + }, + "tld-not-cn": { + ...ruleProviderCommon, + "behavior": "domain", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt", + "path": "./ruleset/loyalsoldier/tld-not-cn.yaml" + }, + "telegramcidr": { + ...ruleProviderCommon, + "behavior": "ipcidr", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt", + "path": "./ruleset/loyalsoldier/telegramcidr.yaml" + }, + "cncidr": { + ...ruleProviderCommon, + "behavior": "ipcidr", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt", + "path": "./ruleset/loyalsoldier/cncidr.yaml" + }, + "lancidr": { + ...ruleProviderCommon, + "behavior": "ipcidr", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt", + "path": "./ruleset/loyalsoldier/lancidr.yaml" + }, + "applications": { + ...ruleProviderCommon, + "behavior": "classical", + "url": "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt", + "path": "./ruleset/loyalsoldier/applications.yaml" + }, + "openai": { + ...ruleProviderCommon, + "behavior": "classical", + "url": "https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/OpenAI/OpenAI.yaml", + "path": "./ruleset/blackmatrix7/openai.yaml" + } +}; +// 规则 +const rules = [ + // 自定义规则 + "DOMAIN-SUFFIX,googleapis.cn,节点选择", // Google服务 + "DOMAIN-SUFFIX,gstatic.com,节点选择", // Google静态资源 + "DOMAIN-SUFFIX,xn--ngstr-lra8j.com,节点选择", // Google Play下载服务 + "DOMAIN-SUFFIX,github.io,节点选择", // Github Pages + "DOMAIN,v2rayse.com,节点选择", // V2rayse节点工具 + // blackmatrix7 规则集 + "RULE-SET,openai,ChatGPT", + // Loyalsoldier 规则集 + "RULE-SET,applications,全局直连", + "RULE-SET,private,全局直连", + "RULE-SET,reject,广告过滤", + "RULE-SET,icloud,微软服务", + "RULE-SET,apple,苹果服务", + "RULE-SET,google,谷歌服务", + "RULE-SET,proxy,节点选择", + "RULE-SET,gfw,节点选择", + "RULE-SET,tld-not-cn,节点选择", + "RULE-SET,direct,全局直连", + "RULE-SET,lancidr,全局直连,no-resolve", + "RULE-SET,cncidr,全局直连,no-resolve", + "RULE-SET,telegramcidr,电报消息,no-resolve", + // 其他规则 + "GEOIP,LAN,全局直连,no-resolve", + "GEOIP,CN,全局直连,no-resolve", + "MATCH,漏网之鱼" +]; +// 代理组通用配置 +const groupBaseOption = { + "interval": 300, + "timeout": 3000, + "url": "https://www.google.com/generate_204", + "lazy": true, + "max-failed-times": 3, + "hidden": false +}; + +// 程序入口 +function main(config) { + const proxyCount = config?.proxies?.length ?? 0; + const proxyProviderCount = + typeof config?.["proxy-providers"] === "object" ? Object.keys(config["proxy-providers"]).length : 0; + if (proxyCount === 0 && proxyProviderCount === 0) { + throw new Error("配置文件中未找到任何代理"); + } + + // 覆盖原配置中DNS配置 + config["dns"] = dnsConfig; + + // 覆盖原配置中的代理组 + config["proxy-groups"] = [ + { + ...groupBaseOption, + "name": "节点选择", + "type": "select", + "proxies": ["延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/adjust.svg" + }, + { + ...groupBaseOption, + "name": "延迟选优", + "type": "url-test", + "tolerance": 100, + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/speed.svg" + }, + { + ...groupBaseOption, + "name": "故障转移", + "type": "fallback", + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/ambulance.svg" + }, + { + ...groupBaseOption, + "name": "负载均衡(散列)", + "type": "load-balance", + "strategy": "consistent-hashing", + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/merry_go.svg" + }, + { + ...groupBaseOption, + "name": "负载均衡(轮询)", + "type": "load-balance", + "strategy": "round-robin", + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/balance.svg" + }, + { + ...groupBaseOption, + "name": "谷歌服务", + "type": "select", + "proxies": ["节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)", "全局直连"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/google.svg" + }, + { + ...groupBaseOption, + "name": "国外媒体", + "type": "select", + "proxies": ["节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)", "全局直连"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/youtube.svg" + }, + { + ...groupBaseOption, + "name": "电报消息", + "type": "select", + "proxies": ["节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)", "全局直连"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/telegram.svg" + }, + { + ...groupBaseOption, + "url": "https://chatgpt.com", + "expected-status": "200", + "name": "ChatGPT", + "type": "select", + "include-all": true, + "filter": "AD|🇦🇩|AE|🇦🇪|AF|🇦🇫|AG|🇦🇬|AL|🇦🇱|AM|🇦🇲|AO|🇦🇴|AR|🇦🇷|AT|🇦🇹|AU|🇦🇺|AZ|🇦🇿|BA|🇧🇦|BB|🇧🇧|BD|🇧🇩|BE|🇧🇪|BF|🇧🇫|BG|🇧🇬|BH|🇧🇭|BI|🇧🇮|BJ|🇧🇯|BN|🇧🇳|BO|🇧🇴|BR|🇧🇷|BS|🇧🇸|BT|🇧🇹|BW|🇧🇼|BZ|🇧🇿|CA|🇨🇦|CD|🇨🇩|CF|🇨🇫|CG|🇨🇬|CH|🇨🇭|CI|🇨🇮|CL|🇨🇱|CM|🇨🇲|CO|🇨🇴|CR|🇨🇷|CV|🇨🇻|CY|🇨🇾|CZ|🇨🇿|DE|🇩🇪|DJ|🇩🇯|DK|🇩🇰|DM|🇩🇲|DO|🇩🇴|DZ|🇩🇿|EC|🇪🇨|EE|🇪🇪|EG|🇪🇬|ER|🇪🇷|ES|🇪🇸|ET|🇪🇹|FI|🇫🇮|FJ|🇫🇯|FM|🇫🇲|FR|🇫🇷|GA|🇬🇦|GB|🇬🇧|GD|🇬🇩|GE|🇬🇪|GH|🇬🇭|GM|🇬🇲|GN|🇬🇳|GQ|🇬🇶|GR|🇬🇷|GT|🇬🇹|GW|🇬🇼|GY|🇬🇾|HN|🇭🇳|HR|🇭🇷|HT|🇭🇹|HU|🇭🇺|ID|🇮🇩|IE|🇮🇪|IL|🇮🇱|IN|🇮🇳|IQ|🇮🇶|IS|🇮🇸|IT|🇮🇹|JM|🇯🇲|JO|🇯🇴|JP|🇯🇵|KE|🇰🇪|KG|🇰🇬|KH|🇰🇭|KI|🇰🇮|KM|🇰🇲|KN|🇰🇳|KR|🇰🇷|KW|🇰🇼|KZ|🇰🇿|LA|🇱🇦|LB|🇱🇧|LC|🇱🇨|LI|🇱🇮|LK|🇱🇰|LR|🇱🇷|LS|🇱🇸|LT|🇱🇹|LU|🇱🇺|LV|🇱🇻|LY|🇱🇾|MA|🇲🇦|MC|🇲🇨|MD|🇲🇩|ME|🇲🇪|MG|🇲🇬|MH|🇲🇭|MK|🇲🇰|ML|🇲🇱|MM|🇲🇲|MN|🇲🇳|MR|🇲🇷|MT|🇲🇹|MU|🇲🇺|MV|🇲🇻|MW|🇲🇼|MX|🇲🇽|MY|🇲🇾|MZ|🇲🇿|NA|🇳🇦|NE|🇳🇪|NG|🇳🇬|NI|🇳🇮|NL|🇳🇱|NO|🇳🇴|NP|🇳🇵|NR|🇳🇷|NZ|🇳🇿|OM|🇴🇲|PA|🇵🇦|PE|🇵🇪|PG|🇵🇬|PH|🇵🇭|PK|🇵🇰|PL|🇵🇱|PS|🇵🇸|PT|🇵🇹|PW|🇵🇼|PY|🇵🇾|QA|🇶🇦|RO|🇷🇴|RS|🇷🇸|RW|🇷🇼|SA|🇸🇦|SB|🇸🇧|SC|🇸🇨|SD|🇸🇩|SE|🇸🇪|SG|🇸🇬|SI|🇸🇮|SK|🇸🇰|SL|🇸🇱|SM|🇸🇲|SN|🇸🇳|SO|🇸🇴|SR|🇸🇷|SS|🇸🇸|ST|🇸🇹|SV|🇸🇻|SZ|🇸🇿|TD|🇹🇩|TG|🇹🇬|TH|🇹🇭|TJ|🇹🇯|TL|🇹🇱|TM|🇹🇲|TN|🇹🇳|TO|🇹🇴|TR|🇹🇷|TT|🇹🇹|TV|🇹🇻|TW|🇹🇼|TZ|🇹🇿|UA|🇺🇦|UG|🇺🇬|US|🇺🇸|UY|🇺🇾|UZ|🇺🇿|VA|🇻🇦|VC|🇻🇨|VN|🇻🇳|VU|🇻🇺|WS|🇼🇸|YE|🇾🇪|ZA|🇿🇦|ZM|🇿🇲|ZW|🇿🇼", + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/chatgpt.svg" + }, + { + ...groupBaseOption, + "name": "微软服务", + "type": "select", + "proxies": ["全局直连", "节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/microsoft.svg" + }, + { + ...groupBaseOption, + "name": "苹果服务", + "type": "select", + "proxies": ["节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)", "全局直连"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/apple.svg" + }, + { + ...groupBaseOption, + "name": "广告过滤", + "type": "select", + "proxies": ["REJECT", "DIRECT"], + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/bug.svg" + }, + { + ...groupBaseOption, + "name": "全局直连", + "type": "select", + "proxies": ["DIRECT", "节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/link.svg" + }, + { + ...groupBaseOption, + "name": "全局拦截", + "type": "select", + "proxies": ["REJECT", "DIRECT"], + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/block.svg" + }, + { + ...groupBaseOption, + "name": "漏网之鱼", + "type": "select", + "proxies": ["节点选择", "延迟选优", "故障转移", "负载均衡(散列)", "负载均衡(轮询)", "全局直连"], + "include-all": true, + "icon": "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/fish.svg" + } + ]; + + // 覆盖原配置中的规则 + config["rule-providers"] = ruleProviders; + config["rules"] = rules; + + // 返回修改后的配置 + return config; +} \ No newline at end of file