Clash Verge 脚本实现
创建于:2025年2月6日
创建于:2025年2月6日
为我的clash verge写一个全局扩展脚本,实现以下功能:
1.过滤掉高倍率节点,正则:/(?:4-9?x)/i
2.默认使用clash verge自带的GEO DATA数据库
-2.1.对明确被墙的域名和IP直接走代理
-2.2.对明确国内的域名和IP直接走直连
3.可以使用外部的规则集进行自定义的 直连/代理/拦截
-3.1.如"https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/AdvertisingLite/AdvertisingLite.yaml"是广告规则,则拦截
-3.2.如"https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Google/Google.yaml"是谷歌规则,则代理
-3.3.如"https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Direct/Direct.yaml"是直连规则,则直连
4.针对ip138.com和linux.do域名强制走代理(后续可能还会增加,注意扩展)
5.在GEO DATA和自定义规则集都没有命中的情况下,走代理进行兜底
我提供给你一个其他人写好的脚本供你参考,脚本还是按你的思路来写,不要被我提供的demo影响了,仅参考其语法即可
textconst proxyGrepConfig = [ { name: "直连", gfw: false, urls: "https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Direct/Direct.yaml" }, { name: "ip138.com", gfw: true, payload: "DOMAIN-SUFFIX,ip138.com" }, ]; function main(config) { // 深拷贝原始配置以避免直接修改 const newConfig = JSON.parse(JSON.stringify(config)); // 过滤高倍率节点 const multiplierPattern = /(?:[4-9](?:\.5)?x)/i; newConfig.proxies = newConfig.proxies.filter(proxy => !multiplierPattern.test(proxy.name)); //创建域名规则组 function createRuleProviderUrl(url) { return { "type": "http", "interval": 86400, "behavior": "classical", "format": "yaml", "url": url } } // 创建payload对应的规则 function createPayloadRules(payload, name) { const rules = []; const payloads = Array.isArray(payload) ? payload : [payload]; for (const item of payloads) { const p = item.split(","); let pushIndex = p.length; if (p[p.length - 1].toLocaleLowerCase() == "no-resolve") { pushIndex--; } p.splice(pushIndex, 0, name.replaceAll(",", "-")); rules.push(p.join(",")); } console.log(rules); return rules; } // 被墙默认规则 function createGfwProxyGrep(name, addProxies) { addProxies = addProxies ? (Array.isArray(addProxies) ? addProxies : [addProxies]) : []; return { "name": name, "type": "select", "proxies": [...addProxies, "自动选择(最低延迟)", "负载均衡", "DIRECT"], "include-all": true, } } // 不被墙默认规则 function createProxyGrep(name, addProxies) { addProxies = addProxies ? (Array.isArray(addProxies) ? addProxies : [addProxies]) : []; return { "name": name, "type": "select", "proxies": [...addProxies, "DIRECT", "自动选择(最低延迟)", "负载均衡"], "include-all": true, } } const proxyGroups = []; const directGroups = []; const rules = []; const ruleProviders = {}; for (const { name, gfw, urls, payload, extraProxies } of proxyGrepConfig) { if (gfw) { proxyGroups.push(createGfwProxyGrep(name, extraProxies)); } else { directGroups.push(createProxyGrep(name, extraProxies)); } if (payload) { rules.push(...createPayloadRules(payload, name)); } else { const urlList = urls ? (Array.isArray(urls) ? urls : [urls]) : []; for (const index in urlList) { const theUrl = urlList[index]; const iName = `${name}-rule${index != 0 ? `-${index}` : ''}`; ruleProviders[iName] = createRuleProviderUrl(theUrl); rules.push(`RULE-SET,${iName},${name}`); } } } // 构建更新后的配置 const updatedConfig = { "find-process-mode": "strict", "global-client-fingerprint": "chrome", "unified-delay": true, // 更换延迟计算方式,去除握手等额外延迟 "tcp-concurrent": true, // TCP 并发 dns: { enable: true, ipv6: true, "enhanced-mode": "fake-ip", "fake-ip-range": "198.18.0.1/16", "use-hosts": true, "fake-ip-filter": [ "+.lan", "+.local", "+.stun.*.*", "time.*.com" ], nameserver: [ "system", "223.5.5.5", // 阿里 DNS "119.29.29.29", // 腾讯 DNS "https://dns.pub/dns-query" // DNSPod DoH ], fallback: [ "https://dns.cloudflare.com/dns-query", // Cloudflare 主要 "https://dns.google/dns-query", // Google 备用 "tls://1.1.1.1:853", // Cloudflare DoT "tls://8.8.8.8:853" // Google DoT ], "fallback-filter": { geoip: true, "geoip-code": "CN", geosite: ["gfw"], domain: ['+.google.com', '+.github.com'] } }, // 代理组配置 "proxy-groups": [ { "name": "自动选择(最低延迟)", "type": "url-test", "tolerance": 20, "include-all": true, "url": "https://play-lh.googleusercontent.com/1UF2WCBNl4918bNk8JsILadL9-agIjRtMpdjuPgx2ohsxnQyspdWDwYMquW1-r8mSQOSjSLOY4g=w720-rw" }, { "name": "国内网站", "type": "select", "proxies": ["DIRECT", "自动选择(最低延迟)", "负载均衡"], "include-all": true, "url": "https://www.baidu.com/favicon.ico" }, ...directGroups, { "name": "国外网站", "type": "select", "proxies": ["自动选择(最低延迟)", "DIRECT", "负载均衡"], "include-all": true, "url": "https://www.bing.com/favicon.ico", }, ...proxyGroups, { "name": "被墙网站", "type": "select", "proxies": ["自动选择(最低延迟)", "负载均衡", "DIRECT"], "include-all": true, "url": "https://play-lh.googleusercontent.com/1UF2WCBNl4918bNk8JsILadL9-agIjRtMpdjuPgx2ohsxnQyspdWDwYMquW1-r8mSQOSjSLOY4g=w720-rw" }, { "name": "负载均衡", "type": "load-balance", "include-all": true, "hidden": true, "strategy": "sticky-sessions", "url": "https://play-lh.googleusercontent.com/1UF2WCBNl4918bNk8JsILadL9-agIjRtMpdjuPgx2ohsxnQyspdWDwYMquW1-r8mSQOSjSLOY4g=w720-rw" } ], "rule-providers": ruleProviders, rules: [ ...rules, "GEOSITE,gfw,被墙网站", "GEOIP,CN,国内网站", "MATCH,国外网站" ] } // 合并配置,保留原配置中未覆盖的属性 return { ...newConfig, // 保留原配置中的其他属性 ...updatedConfig, // 更新需要修改的配置 } }
下面给出一个示例脚本,演示如何在 Clash Verge 中实现你所描述的需求。脚本主要思路如下:
过滤掉高倍率节点
使用正则 /(?:[4-9](?:\.5)?x)/i
筛掉名称中带有“4x ~ 9x”或“4.5x ~ 9.5x” 的代理节点。
默认使用内置 GEO DATA
GEOSITE,gfw
→ 代理(即被墙站点)GEOIP,CN
→ 直连(国内站点 / IP)加载外部规则集并自定义分流
REJECT
)PROXY
)DIRECT
)强制让特定域名走代理
ip138.com
和 linux.do
,后续可在脚本中直接往 forceProxyDomains
数组里添加更多域名。兜底规则
PROXY
进行兜底。由于 Clash/Clash Verge 版本或配置格式可能有所差异,请根据自身环境的需要做相应调整。以下脚本仅作示例,可结合你提供的 Demo 以及自己的思路进行进一步完善和修改。
js/** * Clash Verge 全局扩展脚本示例 * * 主要功能: * 1. 过滤高倍率节点 (如 4x ~ 9.5x) * 2. 默认使用内置 GEO DATA 对 gfw/国内 域名IP 分流 * 3. 支持外部规则集进行自定义分流/拦截 * 4. 指定域名强制走代理 * 5. 兜底走代理 */ function main(originalConfig) { // 1. 深拷贝原始配置,避免直接修改 const newConfig = JSON.parse(JSON.stringify(originalConfig)); // 2. 过滤掉高倍率节点 const multiplierPattern = /(?:[4-9](?:\.5)?x)/i; if (Array.isArray(newConfig.proxies)) { newConfig.proxies = newConfig.proxies.filter(proxy => { return !multiplierPattern.test(proxy.name); }); } /** * 3. 声明要使用的外部规则集 * - name: 在 rule-providers 中的唯一名称 * - action: 在主 rules 中对应的处理方式 (PROXY / DIRECT / REJECT) * - url: 规则集下载地址 * - interval: 刷新周期,单位秒 */ const externalRuleSets = [ { name: "AdvertisingLite", action: "REJECT", url: "https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/AdvertisingLite/AdvertisingLite.yaml", interval: 86400 }, { name: "Google", action: "PROXY", url: "https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Google/Google.yaml", interval: 86400 }, { name: "DirectRule", action: "DIRECT", url: "https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/Direct/Direct.yaml", interval: 86400 } ]; // 4. 强制走代理的域名(可扩展) const forceProxyDomains = ["ip138.com", "linux.do"]; // 5. 生成 rule-providers 配置 const ruleProviders = {}; externalRuleSets.forEach(item => { ruleProviders[item.name] = { type: "http", behavior: "classical", format: "yaml", interval: item.interval || 86400, url: item.url }; }); /** * 6. 构建最终 rules 数组 * 规则匹配顺序从上到下,直到命中第一个规则为止,然后停止继续匹配。 */ const rules = []; // 6.1 外部规则集 // 比如:AdvertisingLite → REJECT // Google → PROXY // DirectRule → DIRECT externalRuleSets.forEach(item => { rules.push(`RULE-SET,${item.name},${item.action}`); }); // 6.2 强制走代理的域名 forceProxyDomains.forEach(domain => { // 也可根据需要写成 DOMAIN-KEYWORD, DOMAIN-FULL, IP-CIDR 等 rules.push(`DOMAIN-SUFFIX,${domain},PROXY`); }); // 6.3 内置 GEO DATA // - gfw → PROXY(表示被墙) // - CN → DIRECT(国内) rules.push("GEOSITE,gfw,PROXY"); rules.push("GEOIP,CN,DIRECT"); // 6.4 最后兜底规则 → PROXY rules.push("MATCH,PROXY"); /** * 7. 定义代理组(proxy-groups) * * - 需要一个名为 "PROXY" 的组来匹配 rules 中的 "PROXY" 动作 * - 如果你想要支持手动选择/自动测速,可自行在这里把所有节点纳入到一个 url-test 或 load-balance 组,然后再让 "PROXY" 组引用它 * - 这里仅给出最简单的示例,直接把所有节点做成一个 "select" 组 */ // 提取所有剩余的节点名称(已过滤掉高倍率) let allProxyNames = []; if (Array.isArray(newConfig.proxies)) { allProxyNames = newConfig.proxies.map(p => p.name); } // 如果没有任何代理节点,可以在这里加个 “无节点” 占位,以免规则报错 if (allProxyNames.length === 0) { allProxyNames.push("No-Proxy-Node"); } const proxyGroups = [ { name: "PROXY", type: "select", proxies: [ ...allProxyNames, "DIRECT", // 备选:手动切回直连 "REJECT" // 备选:手动拦截 ] } ]; /** * 8. 将我们生成/修改的部分合并回配置中 * 注意尽量保留原配置中的其他字段(如 dns / port / logs 等)。 */ newConfig["rule-providers"] = { ...newConfig["rule-providers"], ...ruleProviders }; newConfig["proxy-groups"] = [ ...((newConfig["proxy-groups"] || []).filter(g => { // 如果用户原本配置中就有名为 "PROXY" 的组,可以在这里选择是否保留或覆盖 // 下面演示直接过滤掉同名组,覆盖之 return g.name !== "PROXY"; })), ...proxyGroups ]; // 将自定义 rules 替换/设置到配置中 newConfig["rules"] = rules; /** * 9. 返回修改后的配置 */ return newConfig; }
.js
文件(文件名随意,例如 verge_global_extend.js
),然后在 Clash Verge 的「配置 - 全局扩展脚本」选项中选择此脚本。forceProxyDomains
数组里添加即可。例如:
jsconst forceProxyDomains = ["ip138.com", "linux.do", "example.org", "anotherdomain.com"];
externalRuleSets
里添加配置。只需保持 { name, action, url, interval }
这套格式,然后在 action
中填写你想要的行为即可。这样,你就能在 Clash Verge 中通过一个脚本实现:
根据你的实际使用场景,你还可以自由调整本脚本中的规则顺序、代理组类型(url-test
/ load-balance
/ select
等),或在脚本中对 DNS 进行其他自定义。祝使用顺利!