给大家分享一个 Clash rev 全局拓展脚本
可以完成节点按照地区分区并且 AI 服务分流到 AI 分组,流媒体分流到流媒体分组
// 按地区分组脚本 - 支持负载均衡、自动选择、故障转移、流媒体和AI服务
function main(config) {
// 国内直连规则
const directRules = [
"DOMAIN-SUFFIX,cn,DIRECT",
"DOMAIN-SUFFIX,baidu.com,DIRECT",
"DOMAIN-SUFFIX,bdstatic.com,DIRECT",
"DOMAIN-SUFFIX,qq.com,DIRECT",
"DOMAIN-SUFFIX,weixin.qq.com,DIRECT",
"DOMAIN-SUFFIX,wechat.com,DIRECT",
"DOMAIN-SUFFIX,taobao.com,DIRECT",
"DOMAIN-SUFFIX,tmall.com,DIRECT",
"DOMAIN-SUFFIX,alicdn.com,DIRECT",
"DOMAIN-SUFFIX,alipay.com,DIRECT",
"DOMAIN-SUFFIX,aliyun.com,DIRECT",
"DOMAIN-SUFFIX,jd.com,DIRECT",
"DOMAIN-SUFFIX,163.com,DIRECT",
"DOMAIN-SUFFIX,126.com,DIRECT",
"DOMAIN-SUFFIX,netease.com,DIRECT",
"DOMAIN-SUFFIX,weibo.com,DIRECT",
"DOMAIN-SUFFIX,sina.com.cn,DIRECT",
"DOMAIN-SUFFIX,douyin.com,DIRECT",
"DOMAIN-SUFFIX,tiktokv.com,DIRECT",
"DOMAIN-SUFFIX,bytedance.com,DIRECT",
"DOMAIN-SUFFIX,zhihu.com,DIRECT",
"DOMAIN-SUFFIX,bilibili.com,DIRECT",
"DOMAIN-SUFFIX,bilivideo.com,DIRECT",
"DOMAIN-SUFFIX,hdslb.com,DIRECT",
"DOMAIN-SUFFIX,douban.com,DIRECT",
"DOMAIN-SUFFIX,xiaohongshu.com,DIRECT",
"DOMAIN-SUFFIX,meituan.com,DIRECT",
"DOMAIN-SUFFIX,dianping.com,DIRECT",
"DOMAIN-SUFFIX,ctrip.com,DIRECT",
"DOMAIN-SUFFIX,csdn.net,DIRECT",
"DOMAIN-SUFFIX,jianshu.com,DIRECT",
"DOMAIN-SUFFIX,iqiyi.com,DIRECT",
"DOMAIN-SUFFIX,youku.com,DIRECT",
"DOMAIN-SUFFIX,sohu.com,DIRECT",
"DOMAIN-SUFFIX,sogou.com,DIRECT",
"DOMAIN-SUFFIX,360.cn,DIRECT",
"DOMAIN-SUFFIX,huawei.com,DIRECT",
"DOMAIN-SUFFIX,xiaomi.com,DIRECT",
"DOMAIN-SUFFIX,mi.com,DIRECT",
"DOMAIN-SUFFIX,oppo.com,DIRECT",
"DOMAIN-SUFFIX,vivo.com,DIRECT",
"GEOIP,CN,DIRECT",
];
// 流媒体和AI服务规则
const serviceRules = [
// AI 服务
"DOMAIN-SUFFIX,openai.com,🤖 AI服务",
"DOMAIN-SUFFIX,ai.com,🤖 AI服务",
"DOMAIN-SUFFIX,chatgpt.com,🤖 AI服务",
"DOMAIN-SUFFIX,oaistatic.com,🤖 AI服务",
"DOMAIN-SUFFIX,oaiusercontent.com,🤖 AI服务",
"DOMAIN-SUFFIX,gemini.google.com,🤖 AI服务",
"DOMAIN-SUFFIX,bard.google.com,🤖 AI服务",
"DOMAIN-SUFFIX,generativelanguage.googleapis.com,🤖 AI服务",
"DOMAIN-SUFFIX,anthropic.com,🤖 AI服务",
"DOMAIN-SUFFIX,claude.ai,🤖 AI服务",
"DOMAIN-SUFFIX,x.ai,🤖 AI服务",
"DOMAIN-SUFFIX,grok.x.ai,🤖 AI服务",
"DOMAIN-SUFFIX,perplexity.ai,🤖 AI服务",
"DOMAIN-SUFFIX,poe.com,🤖 AI服务",
"DOMAIN-SUFFIX,cohere.ai,🤖 AI服务",
"DOMAIN-SUFFIX,mistral.ai,🤖 AI服务",
// 流媒体
"DOMAIN-SUFFIX,netflix.com,🎬 流媒体",
"DOMAIN-SUFFIX,netflix.net,🎬 流媒体",
"DOMAIN-SUFFIX,nflxvideo.net,🎬 流媒体",
"DOMAIN-SUFFIX,nflximg.net,🎬 流媒体",
"DOMAIN-SUFFIX,nflxext.com,🎬 流媒体",
"DOMAIN-SUFFIX,disneyplus.com,🎬 流媒体",
"DOMAIN-SUFFIX,disney-plus.net,🎬 流媒体",
"DOMAIN-SUFFIX,hbomax.com,🎬 流媒体",
"DOMAIN-SUFFIX,max.com,🎬 流媒体",
"DOMAIN-SUFFIX,hulu.com,🎬 流媒体",
"DOMAIN-SUFFIX,primevideo.com,🎬 流媒体",
"DOMAIN-SUFFIX,youtube.com,🎬 流媒体",
"DOMAIN-SUFFIX,googlevideo.com,🎬 流媒体",
"DOMAIN-SUFFIX,ytimg.com,🎬 流媒体",
"DOMAIN-SUFFIX,spotify.com,🎬 流媒体",
"DOMAIN-SUFFIX,scdn.co,🎬 流媒体",
"DOMAIN-SUFFIX,tvb.com,🎬 流媒体",
"DOMAIN-SUFFIX,viu.com,🎬 流媒体",
];
// 地区分组正则 - 增强匹配规则
const regionMap = {
"🇭🇰 港澳台": /香港|HK|HongKong|Hong\s*Kong|港|🇭🇰|澳门|澳門|MO|Macao|Macau|🇲🇴|台湾|台灣|TW|Taiwan|臺灣|🇹🇼|高雄|台北/i,
"🌎 美洲": /美国|美國|US|USA|United\s*States|🇺🇸|洛杉矶|洛杉磯|Los\s*Angeles|纽约|紐約|New\s*York|西雅图|Seattle|芝加哥|Chicago|达拉斯|Dallas|凤凰城|Phoenix|加拿大|CA|Canada|🇨🇦|多伦多|Toronto|温哥华|Vancouver|巴西|BR|Brazil|🇧🇷|圣保罗|Sao\s*Paulo|墨西哥|MX|Mexico|🇲🇽|墨西哥城|Mexico\s*City|阿根廷|AR|Argentina|🇦🇷|布宜诺斯艾利斯|Buenos\s*Aires|智利|CL|Chile|🇨🇱|圣地亚哥|Santiago|哥伦比亚|CO|Colombia|🇨🇴|波哥大|Bogota|秘鲁|PE|Peru|🇵🇪|利马|Lima/i,
"🌍 欧洲": /英国|英國|GB|UK|United\s*Kingdom|Britain|🇬🇧|伦敦|倫敦|London|法国|法國|FR|France|🇫🇷|巴黎|Paris|德国|德國|DE|Germany|🇩🇪|法兰克福|Frankfurt|柏林|Berlin|意大利|IT|Italy|🇮🇹|罗马|Roma|米兰|Milan|西班牙|ES|Spain|🇪🇸|马德里|Madrid|巴塞罗那|Barcelona|荷兰|荷蘭|NL|Netherlands|🇳🇱|阿姆斯特丹|Amsterdam|瑞士|CH|Switzerland|🇨🇭|苏黎世|Zurich|瑞典|SE|Sweden|🇸🇪|斯德哥尔摩|Stockholm|波兰|波蘭|PL|Poland|🇵🇱|华沙|Warsaw|乌克兰|烏克蘭|UA|Ukraine|🇺🇦|基辅|Kiev|俄罗斯|俄羅斯|RU|Russia|🇷🇺|莫斯科|Moscow|葡萄牙|PT|Portugal|🇵🇹|里斯本|Lisbon|比利时|比利時|BE|Belgium|🇧🇪|布鲁塞尔|Brussels|奥地利|奧地利|AT|Austria|🇦🇹|维也纳|Vienna|挪威|NO|Norway|🇳🇴|奥斯陆|Oslo|丹麦|丹麥|DK|Denmark|🇩🇰|哥本哈根|Copenhagen|芬兰|芬蘭|FI|Finland|🇫🇮|赫尔辛基|Helsinki|爱尔兰|愛爾蘭|IE|Ireland|🇮🇪|都柏林|Dublin|捷克|CZ|Czech|🇨🇿|布拉格|Prague|罗马尼亚|羅馬尼亞|RO|Romania|🇷🇴|布加勒斯特|Bucharest|保加利亚|保加利亞|BG|Bulgaria|🇧🇬|索非亚|Sofia|希腊|希臘|GR|Greece|🇬🇷|雅典|Athens/i,
"🌏 亚太": /日本|日|JP|Japan|🇯🇵|东京|東京|Tokyo|大阪|Osaka|新加坡|狮城|SG|Singapore|🇸🇬|韩国|韓國|KR|Korea|🇰🇷|首尔|首爾|Seoul|印度|IN|India|🇮🇳|孟买|Mumbai|新德里|New\s*Delhi|班加罗尔|Bangalore|澳大利亚|澳洲|AU|Australia|🇦🇺|悉尼|Sydney|墨尔本|Melbourne|新西兰|新西蘭|NZ|New\s*Zealand|🇳🇿|奥克兰|Auckland|马来西亚|馬來西亞|MY|Malaysia|🇲🇾|吉隆坡|Kuala\s*Lumpur|印度尼西亚|印尼|ID|Indonesia|🇮🇩|雅加达|Jakarta|菲律宾|菲律賓|PH|Philippines|🇵🇭|马尼拉|Manila|泰国|泰國|TH|Thailand|🇹🇭|曼谷|Bangkok|越南|VN|Vietnam|🇻🇳|胡志明|Ho\s*Chi\s*Minh|河内|Hanoi|巴基斯坦|PK|Pakistan|🇵🇰|卡拉奇|Karachi|孟加拉|孟加拉国|BD|Bangladesh|🇧🇩|达卡|Dhaka|斯里兰卡|LK|Sri\s*Lanka|🇱🇰|科伦坡|Colombo|缅甸|緬甸|MM|Myanmar|Burma|🇲🇲|仰光|Yangon|柬埔寨|KH|Cambodia|🇰🇭|金边|Phnom\s*Penh|老挝|老撾|LA|Laos|🇱🇦|万象|Vientiane/i,
"🌍 中东非洲": /阿联酋|阿聯酋|UAE|Dubai|迪拜|🇦🇪|阿布扎比|Abu\s*Dhabi|以色列|IL|Israel|🇮🇱|特拉维夫|Tel\s*Aviv|南非|ZA|South\s*Africa|🇿🇦|开普敦|Cape\s*Town|约翰内斯堡|Johannesburg|尼日利亚|尼日利亞|NG|Nigeria|🇳🇬|拉各斯|Lagos|土耳其|TR|Turkey|Türkiye|🇹🇷|伊斯坦布尔|Istanbul|安卡拉|Ankara|沙特|沙特阿拉伯|SA|Saudi|🇸🇦|利雅得|Riyadh|吉达|Jeddah|卡塔尔|卡塔爾|QA|Qatar|🇶🇦|多哈|Doha|科威特|KW|Kuwait|🇰🇼|巴林|BH|Bahrain|🇧🇭|麦纳麦|Manama|阿曼|OM|Oman|🇴🇲|马斯喀特|Muscat|约旦|JO|Jordan|🇯🇴|安曼|Amman|埃及|EG|Egypt|🇪🇬|开罗|Cairo|肯尼亚|肯尼亞|KE|Kenya|🇰🇪|内罗毕|Nairobi|埃塞俄比亚|埃塞俄比亞|ET|Ethiopia|🇪🇹|亚的斯亚贝巴|Addis\s*Ababa|摩洛哥|MA|Morocco|🇲🇦|卡萨布兰卡|Casablanca|阿尔及利亚|阿爾及利亞|DZ|Algeria|🇩🇿|阿尔及尔|Algiers/i,
};
const excludePattern = /剩余|重置|更新|订阅|失联|超时|卡顿|飞行|续费/;
const proxies = config.proxies || [];
const validProxies = proxies.filter(p => !excludePattern.test(p.name));
const proxyNames = validProxies.map(p => p.name);
const regionGroups = [];
const regionNames = [];
for (const [name, regex] of Object.entries(regionMap)) {
const matched = proxyNames.filter(n => regex.test(n));
if (matched.length > 0) {
const baseName = name.split(" ")[1];
const autoName = `⚡ ${baseName}自动`;
const lbName = `⚖️ ${baseName}均衡`;
const fbName = `🔄 ${baseName}故障转移`;
regionGroups.push(
{ name, type: "select", proxies: [autoName, lbName, fbName, ...matched] },
{ name: autoName, type: "url-test", proxies: matched, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 50 },
{ name: lbName, type: "load-balance", proxies: matched, url: "http://www.gstatic.com/generate_204", interval: 300, strategy: "consistent-hashing" },
{ name: fbName, type: "fallback", proxies: matched, url: "http://www.gstatic.com/generate_204", interval: 180 }
);
regionNames.push(name);
}
}
// AI服务分组 - 美洲+亚太节点
const aiRegex = /美国|US|洛杉矶|纽约|日本|JP|Japan|新加坡|SG/i;
const aiProxies = proxyNames.filter(n => aiRegex.test(n)).slice(0, 30);
// 流媒体分组 - 亚太节点
const streamRegex = /香港|HK|港|台湾|TW|新加坡|SG|日本|JP|Japan/i;
const streamProxies = proxyNames.filter(n => streamRegex.test(n)).slice(0, 30);
// 在节点选择组中添加分组(AI和流媒体在最前面)
const groups = config["proxy-groups"] || [];
const selectGroup = groups.find(g => g.name === "🚀 节点选择");
if (selectGroup) {
const directIdx = selectGroup.proxies.indexOf("DIRECT");
const newGroups = ["🤖 AI服务", "🎬 流媒体", ...regionNames];
if (directIdx > 0) {
selectGroup.proxies.splice(directIdx, 0, ...newGroups);
} else {
selectGroup.proxies.push(...newGroups);
}
}
// 添加所有分组
config["proxy-groups"].push(...regionGroups);
if (aiProxies.length > 0) {
config["proxy-groups"].push(
{ name: "🤖 AI服务", type: "select", proxies: ["⚡ AI自动", "⚖️ AI均衡", "🔄 AI故障转移", ...aiProxies] },
{ name: "⚡ AI自动", type: "url-test", proxies: aiProxies, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 100 },
{ name: "⚖️ AI均衡", type: "load-balance", proxies: aiProxies, url: "http://www.gstatic.com/generate_204", interval: 300, strategy: "consistent-hashing" },
{ name: "🔄 AI故障转移", type: "fallback", proxies: aiProxies, url: "http://www.gstatic.com/generate_204", interval: 180 }
);
}
if (streamProxies.length > 0) {
config["proxy-groups"].push(
{ name: "🎬 流媒体", type: "select", proxies: ["⚡ 流媒体自动", "⚖️ 流媒体均衡", "🔄 流媒体故障转移", ...streamProxies] },
{ name: "⚡ 流媒体自动", type: "url-test", proxies: streamProxies, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 100 },
{ name: "⚖️ 流媒体均衡", type: "load-balance", proxies: streamProxies, url: "http://www.gstatic.com/generate_204", interval: 300, strategy: "consistent-hashing" },
{ name: "🔄 流媒体故障转移", type: "fallback", proxies: streamProxies, url: "http://www.gstatic.com/generate_204", interval: 180 }
);
}
// 插入规则:服务规则在前,直连规则在后
const rules = config.rules || [];
config.rules = [...serviceRules, ...rules, ...directRules];
return config;
}
评论区(暂无评论)