/*** * Clash Verge Rev 全局扩展脚本(懒人配置)/ Mihomo Party 覆写脚本 * URL: https://gist.github.com/dahaha-365/0b8beb613f8d1ee656fe1f21e1a07959 */ /** * 整个脚本的总开关,在Mihomo Party使用的话,请保持为true * true = 启用 * false = 禁用 */ const enable = true; /** * 分流规则配置,会自动生成对应的策略组 * 设置的时候可遵循“最小,可用”原则,把自己不需要的规则全禁用掉,提高效率 * true = 启用 * false = 禁用 */ const ruleOptions = { apple: true, // 苹果服务 microsoft: true, // 微软服务 google: true, // Google服务 openai: true, // 国外AI和GPT spotify: true, // Spotify youtube: true, // YouTube bahamut: true, // 巴哈姆特/动画疯 netflix: true, // Netflix网飞 tiktok: true, // 国际版抖音 disney: true, // 迪士尼 pixiv: true, // Pixiv hbo: true, // HBO biliintl: true, // 哔哩哔哩东南亚 tvb: true, // TVB hulu: true, // Hulu primevideo: true, // 亚马逊prime video telegram: true, // Telegram通讯软件 line: true, // Line通讯软件 whatsapp: true, // Whatsapp games: true, // 游戏策略组 japan: true, // 日本网站策略组 tracker: true, // 网络分析和跟踪服务 ads: true, // 常见的网络广告 }; /** * 地区配置,通过regex匹配代理节点名称 * regex会有一定概率误判,自己调整一下吧 * excludeHighPercentage是排除高倍率节点的开关,只对地区分组有效 * 倍率大于regions里的ratioLimit值的代理节点会被排除 */ const regionOptions = { excludeHighPercentage: true, regions: [ { name: "HK香港", regex: /港|🇭🇰|hk|hongkong|hong kong/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Hong_Kong.png", }, { name: "US美国", regex: /美|🇺🇸|us|united state|america/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/United_States.png", }, { name: "JP日本", regex: /日本|🇯🇵|jp|japan/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Japan.png", }, { name: "KR韩国", regex: /韩|🇰🇷|kr|korea/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Korea.png", }, { name: "SG新加坡", regex: /新加坡|🇸🇬|sg|singapore/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Singapore.png", }, { name: "CN中国大陆", regex: /中国|🇨🇳|cn|china/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/China_Map.png", }, { name: "TW台湾省", regex: /台湾|🇹🇼|tw|taiwan|tai wan/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/China.png", }, { name: "GB英国", regex: /英|🇬🇧|uk|united kingdom|great britain/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/United_Kingdom.png", }, { name: "DE德国", regex: /德国|🇩🇪|de|germany/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Germany.png", }, { name: "MY马来西亚", regex: /马来|🇩🇪|my|malaysia/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Malaysia.png", }, { name: "TK土耳其", regex: /土耳其|🇹🇷|tk|turkey/i, ratioLimit: 2, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Turkey.png", }, ], }; /** * 其实两组DNS就够了,一组国内,一组国外 * defaultDNS是用来解析DNS的,必须为IP * DNS最好不要超过两个,从业界某知名APP的文档里学的 */ const defaultDNS = ["tls://1.12.12.12", "tls://223.5.5.5"]; const chinaDNS = ["119.29.29.29", "180.184.1.1"]; const foreignDNS = ["tls://8.8.8.8", "tls://1.1.1.1", "tls://9.9.9.9"]; /** * DNS相关配置 */ const dnsConfig = { enable: true, listen: ":53", ipv6: true, "prefer-h3": true, "use-hosts": true, "use-system-hosts": true, "respect-rules": true, "enhanced-mode": "fake-ip", "fake-ip-range": "198.18.0.1/16", "fake-ip-filter": ["*", "+.lan", "+.local", "+.market.xiaomi.com"], "default-nameserver": [...defaultDNS], nameserver: [...foreignDNS], "proxy-server-nameserver": [...foreignDNS], /** * 这里对域名解析进行分流 * 由于默认dns是国外的了,只需要把国内ip和域名分流到国内dns */ "nameserver-policy": { "geosite:private": "system", "geosite:cn,steam@cn,category-games@cn,microsoft@cn,apple@cn": chinaDNS, }, }; // 规则集通用配置 const ruleProviderCommon = { type: "http", format: "yaml", interval: 86400, }; // 代理组通用配置 const groupBaseOption = { interval: 300, timeout: 3000, url: "http://cp.cloudflare.com/generate_204", lazy: true, "max-failed-times": 3, hidden: false, }; const ruleProviders = new Map(); ruleProviders.set("applications", { ...ruleProviderCommon, behavior: "classical", format: "text", url: "https://fastly.jsdelivr.net/gh/DustinWin/ruleset_geodata@clash-ruleset/applications.list", path: "./ruleset/DustinWin/applications.list", }); const rules = ["RULE-SET,applications,下载软件"]; // 程序入口 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("配置文件中未找到任何代理"); } let regionProxyGroups = []; let otherProxyGroups = config.proxies.map((b) => { return b.name; }); config["allow-lan"] = true; config["bind-address"] = "*"; config["mode"] = "rule"; // 覆盖原配置中DNS配置 config["dns"] = dnsConfig; config["profile"] = { "store-selected": true, "store-fake-ip": true, }; config["unified-delay"] = true; config["tcp-concurrent"] = true; /** * 这个值设置大点能省电,笔记本和手机需要关注一下 */ config["keep-alive-interval"] = 1800; config["find-process-mode"] = "strict"; config["geodata-mode"] = true; /** * 适合小内存环境,如果在旁路由里运行可以改成standard */ config["geodata-loader"] = "memconservative"; config["geo-auto-update"] = true; config["geo-update-interval"] = 24; /** * 不开域名嗅探的话,日志里只会记录请求的ip,对查找问题不方便 * override-destination默认值是true,但是个人建议全局设为false,否则某些应用会出现莫名其妙的问题 * Mijia Cloud跳过是网上抄的 */ config["sniffer"] = { enable: true, "force-dns-mapping": true, "parse-pure-ip": true, "override-destination": false, sniff: { TLS: { ports: [443, 8443], }, HTTP: { ports: [80, "8080-8880"], }, QUIC: { ports: [443, 8443], }, }, "force-domain": [], "skip-domain": ["Mijia Cloud", "+.oray.com"], }; /** * write-to-system如果设为true的话,有可能出现电脑时间不对的问题 */ config["ntp"] = { enable: true, "write-to-system": false, server: "cn.ntp.org.cn", }; /** * 总开关关闭时不处理策略组 */ if (!enable) { return config; } regionOptions.regions.forEach((region) => { /** * 提取倍率符合要求的代理节点 * 判断倍率有问题的话,大概率是这个正则的问题,可以自行修改 * 自己改正则的话记得必须把倍率的number值提取出来 */ let proxies = config.proxies .filter((a) => { const multiplier = /(?<=[xX✕✖⨉倍率])([1-9]+(\.\d+)*|0{1}\.\d+)(?=[xX✕✖⨉倍率])*/i.exec( a.name )?.[1]; return ( a.name.match(region.regex) && parseFloat(multiplier || "0") <= region.ratioLimit ); }) .map((b) => { return b.name; }); /** * 必须再判断一下有没有符合要求的代理节点 * 没有的话,这个策略组就不应该存在 * 我喜欢自动选择延迟最低的节点,喜欢轮询的可以自己修改 */ if (proxies.length > 0) { regionProxyGroups.push({ ...groupBaseOption, name: region.name, type: "url-test", tolerance: 50, icon: region.icon, proxies: proxies, }); } otherProxyGroups = otherProxyGroups.filter((x) => !proxies.includes(x)); }); const proxyGroupsRegionNames = regionProxyGroups.map((value) => { return value.name; }); if (otherProxyGroups.length > 0) { proxyGroupsRegionNames.push("其他节点"); } config["proxy-groups"] = [ { ...groupBaseOption, name: "默认节点", type: "select", proxies: [...proxyGroupsRegionNames, "直连"], icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Proxy.png", }, ]; config.proxies = config?.proxies || []; config.proxies.push({ name: "直连", type: "direct", udp: true, }); if (ruleOptions.openai) { rules.push( "DOMAIN-SUFFIX,grazie.ai,国外AI", "DOMAIN-SUFFIX,grazie.aws.intellij.net,国外AI", "RULE-SET,ai,国外AI" ); ruleProviders.set("ai", { ...ruleProviderCommon, behavior: "domain", format: "mrs", url: "https://fastly.jsdelivr.net/gh/DustinWin/ruleset_geodata@clash-ruleset/ai.mrs", path: "./ruleset/DustinWin/ai.mrs", }); config["proxy-groups"].push({ ...groupBaseOption, name: "国外AI", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://chat.openai.com/cdn-cgi/trace", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/ChatGPT.png", }); } if (ruleOptions.youtube) { rules.push("GEOSITE,youtube,YouTube"); config["proxy-groups"].push({ ...groupBaseOption, name: "YouTube", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://www.youtube.com/s/desktop/494dd881/img/favicon.ico", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/YouTube.png", }); } if (ruleOptions.biliintl) { rules.push("GEOSITE,biliintl,哔哩哔哩东南亚"); config["proxy-groups"].push({ ...groupBaseOption, name: "哔哩哔哩东南亚", type: "select", proxies: ["默认节点", "直连", ...proxyGroupsRegionNames], url: "https://www.bilibili.tv/", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/bilibili_3.png", }); } if (ruleOptions.bahamut) { rules.push("GEOSITE,bahamut,巴哈姆特"); config["proxy-groups"].push({ ...groupBaseOption, name: "巴哈姆特", type: "select", proxies: ["默认节点", "直连", ...proxyGroupsRegionNames], url: "https://ani.gamer.com.tw/ajax/getdeviceid.php", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Bahamut.png", }); } if (ruleOptions.disney) { rules.push("GEOSITE,disney,Disney+"); config["proxy-groups"].push({ ...groupBaseOption, name: "Disney+", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://disney.api.edge.bamgrid.com/devices", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Disney+.png", }); } if (ruleOptions.netflix) { rules.push("GEOSITE,netflix,NETFLIX"); config["proxy-groups"].push({ ...groupBaseOption, name: "NETFLIX", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://api.fast.com/netflix/speedtest/v2?https=true", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Netflix.png", }); } if (ruleOptions.tiktok) { rules.push("GEOSITE,tiktok,Tiktok"); config["proxy-groups"].push({ ...groupBaseOption, name: "Tiktok", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://www.tiktok.com/", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/TikTok.png", }); } if (ruleOptions.spotify) { rules.push("GEOSITE,spotify,Spotify"); config["proxy-groups"].push({ ...groupBaseOption, name: "Spotify", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "http://spclient.wg.spotify.com/signup/public/v1/account", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Spotify.png", }); } if (ruleOptions.pixiv) { rules.push("GEOSITE,pixiv,Pixiv"); config["proxy-groups"].push({ ...groupBaseOption, name: "Pixiv", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "http://spclient.wg.spotify.com/signup/public/v1/account", icon: "https://play-lh.googleusercontent.com/8pFuLOHF62ADcN0ISUAyEueA5G8IF49mX_6Az6pQNtokNVHxIVbS1L2NM62H-k02rLM=w240-h480-rw", }); } if (ruleOptions.hbo) { rules.push("GEOSITE,hbo,HBO"); config["proxy-groups"].push({ ...groupBaseOption, name: "HBO", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://www.hbo.com/favicon.ico", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/HBO.png", }); } if (ruleOptions.tvb) { rules.push("GEOSITE,tvb,TVB"); config["proxy-groups"].push({ ...groupBaseOption, name: "TVB", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://www.tvb.com/logo_b.svg", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/TVB.png", }); } if (ruleOptions.primevideo) { rules.push("GEOSITE,primevideo,Prime Video"); config["proxy-groups"].push({ ...groupBaseOption, name: "Prime Video", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://m.media-amazon.com/images/G/01/digital/video/web/logo-min-remaster.png", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Prime_Video.png", }); } if (ruleOptions.hulu) { rules.push("GEOSITE,hulu,Hulu"); config["proxy-groups"].push({ ...groupBaseOption, name: "Hulu", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://auth.hulu.com/v4/web/password/authenticate", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Hulu.png", }); } if (ruleOptions.telegram) { rules.push("GEOIP,telegram,Telegram"); config["proxy-groups"].push({ ...groupBaseOption, name: "Telegram", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "http://www.telegram.org/img/website_icon.svg", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Telegram.png", }); } if (ruleOptions.whatsapp) { rules.push("GEOSITE,whatsapp,WhatsApp"); config["proxy-groups"].push({ ...groupBaseOption, name: "WhatsApp", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://web.whatsapp.com/data/manifest.json", icon: "https://static.whatsapp.net/rsrc.php/v3/yP/r/rYZqPCBaG70.png", }); } if (ruleOptions.line) { rules.push("GEOSITE,line,Line"); config["proxy-groups"].push({ ...groupBaseOption, name: "Line", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://line.me/page-data/app-data.json", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Line.png", }); } if (ruleOptions.games) { rules.push( "GEOSITE,category-games@cn,国内网站", "GEOSITE,category-games,游戏专用" ); config["proxy-groups"].push({ ...groupBaseOption, name: "游戏专用", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Game.png", }); } if (ruleOptions.tracker) { rules.push("GEOSITE,tracker,跟踪分析"); config["proxy-groups"].push({ ...groupBaseOption, name: "跟踪分析", type: "select", proxies: ["REJECT", "直连", "默认节点"], icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Reject.png", }); } if (ruleOptions.ads) { rules.push("GEOSITE,category-ads-all,广告过滤"); config["proxy-groups"].push({ ...groupBaseOption, name: "广告过滤", type: "select", proxies: ["REJECT", "直连", "默认节点"], icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Advertising.png", }); } if (ruleOptions.apple) { rules.push("GEOSITE,apple-cn,苹果服务"); config["proxy-groups"].push({ ...groupBaseOption, name: "苹果服务", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "http://www.apple.com/library/test/success.html", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Apple_2.png", }); } if (ruleOptions.google) { rules.push("GEOSITE,google,谷歌服务"); config["proxy-groups"].push({ ...groupBaseOption, name: "谷歌服务", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "http://www.google.com/generate_204", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Google_Search.png", }); } if (ruleOptions.microsoft) { rules.push("GEOSITE,microsoft@cn,国内网站", "GEOSITE,microsoft,微软服务"); config["proxy-groups"].push({ ...groupBaseOption, name: "微软服务", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "http://www.msftconnecttest.com/connecttest.txt", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Microsoft.png", }); } if (ruleOptions.japan) { rules.push( "RULE-SET,category-bank-jp,日本网站", "GEOIP,JP,日本网站,no-resolve" ); ruleProviders.set("category-bank-jp", { ...ruleProviderCommon, behavior: "domain", format: "mrs", url: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@meta/geo/geosite/category-bank-jp.mrs", path: "./ruleset/MetaCubeX/category-bank-jp.mrs", }); config["proxy-groups"].push({ ...groupBaseOption, name: "日本网站", type: "select", proxies: ["默认节点", ...proxyGroupsRegionNames, "直连"], url: "https://r.r10s.jp/com/img/home/logo/touch.png", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/JP.png", }); } rules.push( "GEOSITE,private,DIRECT", "GEOIP,private,DIRECT,no-resolve", "GEOIP,CN,国内网站,no-resolve", "MATCH,其他外网" ); config["proxy-groups"].push( { ...groupBaseOption, name: "下载软件", type: "select", proxies: [ "直连", "REJECT", "默认节点", "国内网站", ...proxyGroupsRegionNames, ], icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Download.png", }, { ...groupBaseOption, name: "其他外网", type: "select", proxies: ["默认节点", "国内网站", ...proxyGroupsRegionNames], icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/Streaming!CN.png", }, { ...groupBaseOption, name: "国内网站", type: "select", proxies: ["直连", "默认节点", ...proxyGroupsRegionNames], url: "http://wifi.vivo.com.cn/generate_204", icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/StreamingCN.png", } ); config["proxy-groups"] = config["proxy-groups"].concat(regionProxyGroups); // 覆盖原配置中的规则 config["rules"] = rules; config["rule-providers"] = Object.fromEntries(ruleProviders); if (otherProxyGroups.length > 0) { config["proxy-groups"].push({ ...groupBaseOption, name: "其他节点", type: "select", proxies: otherProxyGroups, icon: "https://fastly.jsdelivr.net/gh/Koolson/Qure/IconSet/Color/World_Map.png", }); } // 返回修改后的配置 return config; }