main.js
· 18 KiB · JavaScript
Brut
// Define the `main` function
const proxyName = "代理模式";
function main (params) {
if (!params.proxies) return params;
overwriteRules (params);
overwriteProxyGroups (params);
overwriteDns (params);
return params;
}
// 覆写规则
function overwriteRules (params) {
const customRules = [
// 在此添加自定义规则,最高优先级。
// 为了方便区分,可设置 全局代理模式 或 自定义代理组。
// 示例 1 :使用 全局代理模式
//"DOMAIN-SUFFIX,linux.do," + proxyName,
// 示例 2 :使用 自定义代理组 1
//"DOMAIN-SUFFIX,gstatic.com, 自定义代理组 1",
// 示例 3 :使用 自定义代理组 2
//"DOMAIN-SUFFIX,googleapis.com, 自定义代理组 2",
];
const rules = [
...customRules,
"RULE-SET,reject, 广告拦截",
"RULE-SET,direct,DIRECT",
"RULE-SET,cncidr,DIRECT",
"RULE-SET,private,DIRECT",
"RULE-SET,lancidr,DIRECT",
"GEOIP,LAN,DIRECT,no-resolve",
"GEOIP,CN,DIRECT,no-resolve",
"RULE-SET,applications,DIRECT",
"RULE-SET,openai,ChatGPT",
"RULE-SET,claude,Claude",
"RULE-SET,spotify,Spotify",
"RULE-SET,telegramcidr,电报消息,no-resolve",
"RULE-SET,tld-not-cn," + proxyName,
"RULE-SET,google," + proxyName,
"RULE-SET,icloud," + proxyName,
"RULE-SET,apple," + proxyName,
"RULE-SET,gfw," + proxyName,
"RULE-SET,greatfire," + proxyName,
"RULE-SET,proxy," + proxyName,
"MATCH, 漏网之鱼",
];
const ruleProviders = {
reject: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt",
path: "./ruleset/reject.yaml",
interval: 86400,
},
icloud: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt",
path: "./ruleset/icloud.yaml",
interval: 86400,
},
apple: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt",
path: "./ruleset/apple.yaml",
interval: 86400,
},
google: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt",
path: "./ruleset/google.yaml",
interval: 86400,
},
proxy: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt",
path: "./ruleset/proxy.yaml",
interval: 86400,
},
openai: {
type: "http",
behavior: "classical",
url: "https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/OpenAI/OpenAI.yaml",
path: "./ruleset/custom/openai.yaml"
},
claude: {
type: "http",
behavior: "classical",
url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Claude/Claude.yaml",
path: "./ruleset/custom/Claude.yaml"
},
spotify: {
type: "http",
behavior: "classical",
url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Spotify/Spotify.yaml",
path: "./ruleset/custom/Spotify.yaml"
},
telegramcidr: {
type: "http",
behavior: "ipcidr",
url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt",
path: "./ruleset/custom/telegramcidr.yaml"
},
direct: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt",
path: "./ruleset/direct.yaml",
interval: 86400,
},
private: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt",
path: "./ruleset/private.yaml",
interval: 86400,
},
gfw: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt",
path: "./ruleset/gfw.yaml",
interval: 86400,
},
greatfire: {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt",
path: "./ruleset/greatfire.yaml",
interval: 86400,
},
"tld-not-cn": {
type: "http",
behavior: "domain",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt",
path: "./ruleset/tld-not-cn.yaml",
interval: 86400,
},
telegramcidr: {
type: "http",
behavior: "ipcidr",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt",
path: "./ruleset/telegramcidr.yaml",
interval: 86400,
},
cncidr: {
type: "http",
behavior: "ipcidr",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt",
path: "./ruleset/cncidr.yaml",
interval: 86400,
},
lancidr: {
type: "http",
behavior: "ipcidr",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt",
path: "./ruleset/lancidr.yaml",
interval: 86400,
},
applications: {
type: "http",
behavior: "classical",
url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt",
path: "./ruleset/applications.yaml",
interval: 86400,
},
};
params ["rule-providers"] = ruleProviders;
params ["rules"] = rules;
}
// 覆写代理组
function overwriteProxyGroups (params) {
// 添加自用代理
params.proxies.push (
// { name: '1 - 香港 - 示例 ', type: *, server: **, port: *, cipher: **, password: **, udp: true }
);
// 所有代理
const allProxies = params ["proxies"].map ((e) => e.name);
// 自动选择代理组,按地区分组选延迟最低
const autoProxyGroupRegexs = [
{ name: "HK - 自动选择", regex: / 香港 | HK|Hong|🇭🇰/ },
{ name: "TW - 自动选择", regex: / 台湾 | TW|Taiwan|Wan|🇨🇳|🇹🇼/ },
{ name: "SG - 自动选择", regex: / 新加坡 | 狮城 | SG|Singapore|🇸🇬/ },
{ name: "JP - 自动选择", regex: / 日本 | JP|Japan|🇯🇵/ },
{ name: "US - 自动选择", regex: / 美国 | US|United States|America|🇺🇸/ },
{ name: "其它 - 自动选择", regex: /(?!.*(?: 剩余 | 到期 | 主页 | 官网 | 游戏 | 关注))(.*)/ },
];
const autoProxyGroups = autoProxyGroupRegexs
.map ((item) => ({
name: item.name,
type: "url-test",
url: "http://www.gstatic.com/generate_204",
interval: 300,
tolerance: 50,
proxies: getProxiesByRegex (params, item.regex),
hidden: true,
}))
.filter ((item) => item.proxies.length > 0);
// 手工选择代理组
const manualProxyGroups = [
{ name: "HK - 手工选择", regex: / 香港 | HK|Hong|🇭🇰/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/hk.svg" },
{ name: "TW - 手工选择", regex: / 台湾 | TW|Taiwan|Wan|🇨🇳|🇹🇼/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/tw.svg" },
{ name: "SG - 手工选择", regex: / 新加坡 | 狮城 | SG|Singapore|🇸🇬/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/sg.svg" },
{ name: "JP - 手工选择", regex: / 日本 | JP|Japan|🇯🇵/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/jp.svg" },
{ name: "US - 手工选择", regex: / 美国 | US|United States|America|🇺🇸/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/us.svg" },
];
const manualProxyGroupsConfig = manualProxyGroups
.map ((item) => ({
name: item.name,
type: "select",
proxies: getManualProxiesByRegex (params, item.regex),
icon: item.icon,
hidden: false,
}))
.filter ((item) => item.proxies.length > 0);
const groups = [
{
name: proxyName,
type: "select",
url: "http://www.gstatic.com/generate_204",
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/adjust.svg",
proxies: [
"自动选择",
"手动选择",
"负载均衡 (散列)",
"负载均衡 (轮询)",
"DIRECT",
],
},
{
name: "手动选择",
type: "select",
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/link.svg",
proxies: allProxies,
},
{
name: "自动选择",
type: "select",
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/speed.svg",
proxies: ["ALL - 自动选择"],
},
{
name: "负载均衡 (散列)",
type: "load-balance",
url: "http://www.gstatic.com/generate_204",
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/balance.svg",
interval: 300,
"max-failed-times": 3,
strategy: "consistent-hashing",
lazy: true,
proxies: allProxies,
},
{
name: "负载均衡 (轮询)",
type: "load-balance",
url: "http://www.gstatic.com/generate_204",
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/merry_go.svg",
interval: 300,
"max-failed-times": 3,
strategy: "round-robin",
lazy: true,
proxies: allProxies,
},
{
name: "ALL - 自动选择",
type: "url-test",
url: "http://www.gstatic.com/generate_204",
interval: 300,
tolerance: 50,
proxies: allProxies,
hidden: true,
},
{
name: "自定义代理组 1",
type: "select",
proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/ambulance.svg"
},
{
name: "自定义代理组 2",
type: "select",
proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"],
"include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/ambulance.svg"
},
{
name: "电报消息",
type: "select",
proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"],
// "include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/telegram.svg"
},
{
name: "ChatGPT",
type: "select",
proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"],
// "include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/chatgpt.svg"
},
{
name: "Claude",
type: "select",
proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"],
// "include-all": true,
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/claude.svg"
},
{
name: "Spotify",
type: "select",
proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"],
// "include-all": true,
icon: "https://storage.googleapis.com/spotifynewsroom-jp.appspot.com/1/2020/12/Spotify_Icon_CMYK_Green.png"
},
{
name: "漏网之鱼",
type: "select",
proxies: ["DIRECT", proxyName],
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/fish.svg"
},
{
name: "广告拦截",
type: "select",
proxies: ["REJECT", "DIRECT", proxyName],
icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/block.svg"
},
];
autoProxyGroups.length &&
groups [2].proxies.unshift (...autoProxyGroups.map ((item) => item.name));
groups.push (...autoProxyGroups);
groups.push (...manualProxyGroupsConfig);
params ["proxy-groups"] = groups;
}
// 防止 dns 泄露
function overwriteDns (params) {
const cnDnsList = [
"https://223.5.5.5/dns-query",
"https://1.12.12.12/dns-query",
];
const trustDnsList = [
'quic://dns.cooluc.com',
"https://1.0.0.1/dns-query",
"https://1.1.1.1/dns-query",
];
const dnsOptions = {
enable: true,
"prefer-h3": true, // 如果 DNS 服务器支持 DoH3 会优先使用 h3
"default-nameserver": cnDnsList, // 用于解析其他 DNS 服务器、和节点的域名,必须为 IP, 可为加密 DNS。注意这个只用来解析节点和其他的 dns,其他网络请求不归他管
nameserver: trustDnsList, // 其他网络请求都归他管
// 这个用于覆盖上面的 nameserver
"nameserver-policy": {
//[combinedUrls]: notionDns,
"geosite:cn": cnDnsList,
"geosite:geolocation-!cn": trustDnsList,
// 如果你有一些内网使用的 DNS,应该定义在这里,多个域名用英文逗号分割
// '+. 公司域名.com, www.4399.com, +.baidu.com': '10.0.0.1'
},
fallback: trustDnsList,
"fallback-filter": {
geoip: true,
// 除了 geoip-code 配置的国家 IP, 其他的 IP 结果会被视为污染 geoip-code 配置的国家的结果会直接采用,否则将采用 fallback 结果
"geoip-code": "CN",
//geosite 列表的内容被视为已污染,匹配到 geosite 的域名,将只使用 fallback 解析,不去使用 nameserver
geosite: ["gfw"],
ipcidr: ["240.0.0.0/4"],
domain: ["+.google.com", "+.facebook.com", "+.youtube.com"],
},
};
// GitHub 加速前缀
const githubPrefix = "https://fastgh.lainbo.com/";
// GEO 数据 GitHub 资源原始下载地址
const rawGeoxURLs = {
geoip:
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat",
geosite:
"https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat",
mmdb: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb",
};
// 生成带有加速前缀的 GEO 数据资源对象
const accelURLs = Object.fromEntries (
Object.entries (rawGeoxURLs).map (([key, githubUrl]) => [
key,
`${githubPrefix}${githubUrl}`,
])
);
const otherOptions = {
"unified-delay": true,
"tcp-concurrent": true,
profile: {
"store-selected": true,
"store-fake-ip": true,
},
sniffer: {
enable: true,
sniff: {
TLS: {
ports: [443, 8443],
},
HTTP: {
ports: [80, "8080-8880"],
"override-destination": true,
},
},
},
"geodata-mode": true,
"geox-url": accelURLs,
};
params.dns = { ...params.dns, ...dnsOptions };
Object.keys (otherOptions).forEach ((key) => {
params [key] = otherOptions [key];
});
}
function getProxiesByRegex (params, regex) {
const matchedProxies = params.proxies.filter ((e) => regex.test (e.name)).map ((e) => e.name);
return matchedProxies.length > 0 ? matchedProxies : ["手动选择"];
}
function getManualProxiesByRegex (params, regex) {
const matchedProxies = params.proxies.filter ((e) => regex.test (e.name)).map ((e) => e.name);
return matchedProxies.length > 0 ? matchedProxies : ["DIRECT", "手动选择", proxyName];
}
| 1 | // Define the `main` function |
| 2 | |
| 3 | const proxyName = "代理模式"; |
| 4 | |
| 5 | function main (params) { |
| 6 | if (!params.proxies) return params; |
| 7 | overwriteRules (params); |
| 8 | overwriteProxyGroups (params); |
| 9 | overwriteDns (params); |
| 10 | return params; |
| 11 | } |
| 12 | // 覆写规则 |
| 13 | function overwriteRules (params) { |
| 14 | const customRules = [ |
| 15 | // 在此添加自定义规则,最高优先级。 |
| 16 | // 为了方便区分,可设置 全局代理模式 或 自定义代理组。 |
| 17 | // 示例 1 :使用 全局代理模式 |
| 18 | //"DOMAIN-SUFFIX,linux.do," + proxyName, |
| 19 | // 示例 2 :使用 自定义代理组 1 |
| 20 | //"DOMAIN-SUFFIX,gstatic.com, 自定义代理组 1", |
| 21 | // 示例 3 :使用 自定义代理组 2 |
| 22 | //"DOMAIN-SUFFIX,googleapis.com, 自定义代理组 2", |
| 23 | ]; |
| 24 | |
| 25 | |
| 26 | const rules = [ |
| 27 | ...customRules, |
| 28 | "RULE-SET,reject, 广告拦截", |
| 29 | "RULE-SET,direct,DIRECT", |
| 30 | "RULE-SET,cncidr,DIRECT", |
| 31 | "RULE-SET,private,DIRECT", |
| 32 | "RULE-SET,lancidr,DIRECT", |
| 33 | "GEOIP,LAN,DIRECT,no-resolve", |
| 34 | "GEOIP,CN,DIRECT,no-resolve", |
| 35 | "RULE-SET,applications,DIRECT", |
| 36 | "RULE-SET,openai,ChatGPT", |
| 37 | "RULE-SET,claude,Claude", |
| 38 | "RULE-SET,spotify,Spotify", |
| 39 | "RULE-SET,telegramcidr,电报消息,no-resolve", |
| 40 | "RULE-SET,tld-not-cn," + proxyName, |
| 41 | "RULE-SET,google," + proxyName, |
| 42 | "RULE-SET,icloud," + proxyName, |
| 43 | "RULE-SET,apple," + proxyName, |
| 44 | "RULE-SET,gfw," + proxyName, |
| 45 | "RULE-SET,greatfire," + proxyName, |
| 46 | "RULE-SET,proxy," + proxyName, |
| 47 | "MATCH, 漏网之鱼", |
| 48 | ]; |
| 49 | const ruleProviders = { |
| 50 | reject: { |
| 51 | type: "http", |
| 52 | behavior: "domain", |
| 53 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt", |
| 54 | path: "./ruleset/reject.yaml", |
| 55 | interval: 86400, |
| 56 | }, |
| 57 | icloud: { |
| 58 | type: "http", |
| 59 | behavior: "domain", |
| 60 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt", |
| 61 | path: "./ruleset/icloud.yaml", |
| 62 | interval: 86400, |
| 63 | }, |
| 64 | apple: { |
| 65 | type: "http", |
| 66 | behavior: "domain", |
| 67 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt", |
| 68 | path: "./ruleset/apple.yaml", |
| 69 | interval: 86400, |
| 70 | }, |
| 71 | google: { |
| 72 | type: "http", |
| 73 | behavior: "domain", |
| 74 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt", |
| 75 | path: "./ruleset/google.yaml", |
| 76 | interval: 86400, |
| 77 | }, |
| 78 | proxy: { |
| 79 | type: "http", |
| 80 | behavior: "domain", |
| 81 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt", |
| 82 | path: "./ruleset/proxy.yaml", |
| 83 | interval: 86400, |
| 84 | }, |
| 85 | openai: { |
| 86 | type: "http", |
| 87 | behavior: "classical", |
| 88 | url: "https://fastly.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/OpenAI/OpenAI.yaml", |
| 89 | path: "./ruleset/custom/openai.yaml" |
| 90 | }, |
| 91 | claude: { |
| 92 | type: "http", |
| 93 | behavior: "classical", |
| 94 | url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Claude/Claude.yaml", |
| 95 | path: "./ruleset/custom/Claude.yaml" |
| 96 | }, |
| 97 | spotify: { |
| 98 | type: "http", |
| 99 | behavior: "classical", |
| 100 | url: "https://raw.githubusercontent.com/blackmatrix7/ios_rule_script/master/rule/Clash/Spotify/Spotify.yaml", |
| 101 | path: "./ruleset/custom/Spotify.yaml" |
| 102 | }, |
| 103 | telegramcidr: { |
| 104 | type: "http", |
| 105 | behavior: "ipcidr", |
| 106 | url: "https://fastly.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt", |
| 107 | path: "./ruleset/custom/telegramcidr.yaml" |
| 108 | }, |
| 109 | direct: { |
| 110 | type: "http", |
| 111 | behavior: "domain", |
| 112 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt", |
| 113 | path: "./ruleset/direct.yaml", |
| 114 | interval: 86400, |
| 115 | }, |
| 116 | private: { |
| 117 | type: "http", |
| 118 | behavior: "domain", |
| 119 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt", |
| 120 | path: "./ruleset/private.yaml", |
| 121 | interval: 86400, |
| 122 | }, |
| 123 | gfw: { |
| 124 | type: "http", |
| 125 | behavior: "domain", |
| 126 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt", |
| 127 | path: "./ruleset/gfw.yaml", |
| 128 | interval: 86400, |
| 129 | }, |
| 130 | greatfire: { |
| 131 | type: "http", |
| 132 | behavior: "domain", |
| 133 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt", |
| 134 | path: "./ruleset/greatfire.yaml", |
| 135 | interval: 86400, |
| 136 | }, |
| 137 | "tld-not-cn": { |
| 138 | type: "http", |
| 139 | behavior: "domain", |
| 140 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt", |
| 141 | path: "./ruleset/tld-not-cn.yaml", |
| 142 | interval: 86400, |
| 143 | }, |
| 144 | telegramcidr: { |
| 145 | type: "http", |
| 146 | behavior: "ipcidr", |
| 147 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt", |
| 148 | path: "./ruleset/telegramcidr.yaml", |
| 149 | interval: 86400, |
| 150 | }, |
| 151 | cncidr: { |
| 152 | type: "http", |
| 153 | behavior: "ipcidr", |
| 154 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt", |
| 155 | path: "./ruleset/cncidr.yaml", |
| 156 | interval: 86400, |
| 157 | }, |
| 158 | lancidr: { |
| 159 | type: "http", |
| 160 | behavior: "ipcidr", |
| 161 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt", |
| 162 | path: "./ruleset/lancidr.yaml", |
| 163 | interval: 86400, |
| 164 | }, |
| 165 | applications: { |
| 166 | type: "http", |
| 167 | behavior: "classical", |
| 168 | url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt", |
| 169 | path: "./ruleset/applications.yaml", |
| 170 | interval: 86400, |
| 171 | }, |
| 172 | }; |
| 173 | params ["rule-providers"] = ruleProviders; |
| 174 | params ["rules"] = rules; |
| 175 | } |
| 176 | // 覆写代理组 |
| 177 | function overwriteProxyGroups (params) { |
| 178 | // 添加自用代理 |
| 179 | params.proxies.push ( |
| 180 | // { name: '1 - 香港 - 示例 ', type: *, server: **, port: *, cipher: **, password: **, udp: true } |
| 181 | |
| 182 | ); |
| 183 | |
| 184 | // 所有代理 |
| 185 | const allProxies = params ["proxies"].map ((e) => e.name); |
| 186 | // 自动选择代理组,按地区分组选延迟最低 |
| 187 | const autoProxyGroupRegexs = [ |
| 188 | { name: "HK - 自动选择", regex: / 香港 | HK|Hong|🇭🇰/ }, |
| 189 | { name: "TW - 自动选择", regex: / 台湾 | TW|Taiwan|Wan|🇨🇳|🇹🇼/ }, |
| 190 | { name: "SG - 自动选择", regex: / 新加坡 | 狮城 | SG|Singapore|🇸🇬/ }, |
| 191 | { name: "JP - 自动选择", regex: / 日本 | JP|Japan|🇯🇵/ }, |
| 192 | { name: "US - 自动选择", regex: / 美国 | US|United States|America|🇺🇸/ }, |
| 193 | { name: "其它 - 自动选择", regex: /(?!.*(?: 剩余 | 到期 | 主页 | 官网 | 游戏 | 关注))(.*)/ }, |
| 194 | ]; |
| 195 | |
| 196 | const autoProxyGroups = autoProxyGroupRegexs |
| 197 | .map ((item) => ({ |
| 198 | name: item.name, |
| 199 | type: "url-test", |
| 200 | url: "http://www.gstatic.com/generate_204", |
| 201 | interval: 300, |
| 202 | tolerance: 50, |
| 203 | proxies: getProxiesByRegex (params, item.regex), |
| 204 | hidden: true, |
| 205 | })) |
| 206 | .filter ((item) => item.proxies.length > 0); |
| 207 | |
| 208 | // 手工选择代理组 |
| 209 | const manualProxyGroups = [ |
| 210 | { name: "HK - 手工选择", regex: / 香港 | HK|Hong|🇭🇰/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/hk.svg" }, |
| 211 | { name: "TW - 手工选择", regex: / 台湾 | TW|Taiwan|Wan|🇨🇳|🇹🇼/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/tw.svg" }, |
| 212 | { name: "SG - 手工选择", regex: / 新加坡 | 狮城 | SG|Singapore|🇸🇬/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/sg.svg" }, |
| 213 | { name: "JP - 手工选择", regex: / 日本 | JP|Japan|🇯🇵/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/jp.svg" }, |
| 214 | { name: "US - 手工选择", regex: / 美国 | US|United States|America|🇺🇸/, icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/flags/us.svg" }, |
| 215 | ]; |
| 216 | |
| 217 | const manualProxyGroupsConfig = manualProxyGroups |
| 218 | .map ((item) => ({ |
| 219 | name: item.name, |
| 220 | type: "select", |
| 221 | proxies: getManualProxiesByRegex (params, item.regex), |
| 222 | icon: item.icon, |
| 223 | hidden: false, |
| 224 | })) |
| 225 | .filter ((item) => item.proxies.length > 0); |
| 226 | |
| 227 | const groups = [ |
| 228 | { |
| 229 | name: proxyName, |
| 230 | type: "select", |
| 231 | url: "http://www.gstatic.com/generate_204", |
| 232 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/adjust.svg", |
| 233 | proxies: [ |
| 234 | "自动选择", |
| 235 | "手动选择", |
| 236 | "负载均衡 (散列)", |
| 237 | "负载均衡 (轮询)", |
| 238 | "DIRECT", |
| 239 | ], |
| 240 | }, |
| 241 | { |
| 242 | name: "手动选择", |
| 243 | type: "select", |
| 244 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/link.svg", |
| 245 | proxies: allProxies, |
| 246 | }, |
| 247 | { |
| 248 | name: "自动选择", |
| 249 | type: "select", |
| 250 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/speed.svg", |
| 251 | proxies: ["ALL - 自动选择"], |
| 252 | }, |
| 253 | { |
| 254 | name: "负载均衡 (散列)", |
| 255 | type: "load-balance", |
| 256 | url: "http://www.gstatic.com/generate_204", |
| 257 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/balance.svg", |
| 258 | interval: 300, |
| 259 | "max-failed-times": 3, |
| 260 | strategy: "consistent-hashing", |
| 261 | lazy: true, |
| 262 | proxies: allProxies, |
| 263 | }, |
| 264 | { |
| 265 | name: "负载均衡 (轮询)", |
| 266 | type: "load-balance", |
| 267 | url: "http://www.gstatic.com/generate_204", |
| 268 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/merry_go.svg", |
| 269 | interval: 300, |
| 270 | "max-failed-times": 3, |
| 271 | strategy: "round-robin", |
| 272 | lazy: true, |
| 273 | proxies: allProxies, |
| 274 | }, |
| 275 | { |
| 276 | name: "ALL - 自动选择", |
| 277 | type: "url-test", |
| 278 | url: "http://www.gstatic.com/generate_204", |
| 279 | interval: 300, |
| 280 | tolerance: 50, |
| 281 | proxies: allProxies, |
| 282 | hidden: true, |
| 283 | }, |
| 284 | { |
| 285 | name: "自定义代理组 1", |
| 286 | type: "select", |
| 287 | proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"], |
| 288 | "include-all": true, |
| 289 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/ambulance.svg" |
| 290 | }, |
| 291 | { |
| 292 | name: "自定义代理组 2", |
| 293 | type: "select", |
| 294 | proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"], |
| 295 | "include-all": true, |
| 296 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/ambulance.svg" |
| 297 | }, |
| 298 | { |
| 299 | name: "电报消息", |
| 300 | type: "select", |
| 301 | proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"], |
| 302 | // "include-all": true, |
| 303 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/telegram.svg" |
| 304 | }, |
| 305 | { |
| 306 | name: "ChatGPT", |
| 307 | type: "select", |
| 308 | proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"], |
| 309 | // "include-all": true, |
| 310 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/chatgpt.svg" |
| 311 | }, |
| 312 | { |
| 313 | name: "Claude", |
| 314 | type: "select", |
| 315 | proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"], |
| 316 | // "include-all": true, |
| 317 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/claude.svg" |
| 318 | }, |
| 319 | { |
| 320 | name: "Spotify", |
| 321 | type: "select", |
| 322 | proxies: [proxyName, "HK - 自动选择", "TW - 自动选择", "SG - 自动选择", "JP - 自动选择", "US - 自动选择", "其它 - 自动选择", "HK - 手工选择", "TW - 手工选择", "SG - 手工选择", "JP - 手工选择", "US - 手工选择"], |
| 323 | // "include-all": true, |
| 324 | icon: "https://storage.googleapis.com/spotifynewsroom-jp.appspot.com/1/2020/12/Spotify_Icon_CMYK_Green.png" |
| 325 | }, |
| 326 | { |
| 327 | name: "漏网之鱼", |
| 328 | type: "select", |
| 329 | proxies: ["DIRECT", proxyName], |
| 330 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/fish.svg" |
| 331 | }, |
| 332 | { |
| 333 | name: "广告拦截", |
| 334 | type: "select", |
| 335 | proxies: ["REJECT", "DIRECT", proxyName], |
| 336 | icon: "https://fastly.jsdelivr.net/gh/clash-verge-rev/clash-verge-rev.github.io@main/docs/assets/icons/block.svg" |
| 337 | }, |
| 338 | ]; |
| 339 | |
| 340 | autoProxyGroups.length && |
| 341 | groups [2].proxies.unshift (...autoProxyGroups.map ((item) => item.name)); |
| 342 | groups.push (...autoProxyGroups); |
| 343 | groups.push (...manualProxyGroupsConfig); |
| 344 | params ["proxy-groups"] = groups; |
| 345 | |
| 346 | } |
| 347 | // 防止 dns 泄露 |
| 348 | function overwriteDns (params) { |
| 349 | const cnDnsList = [ |
| 350 | "https://223.5.5.5/dns-query", |
| 351 | "https://1.12.12.12/dns-query", |
| 352 | ]; |
| 353 | const trustDnsList = [ |
| 354 | 'quic://dns.cooluc.com', |
| 355 | "https://1.0.0.1/dns-query", |
| 356 | "https://1.1.1.1/dns-query", |
| 357 | ]; |
| 358 | |
| 359 | const dnsOptions = { |
| 360 | enable: true, |
| 361 | "prefer-h3": true, // 如果 DNS 服务器支持 DoH3 会优先使用 h3 |
| 362 | "default-nameserver": cnDnsList, // 用于解析其他 DNS 服务器、和节点的域名,必须为 IP, 可为加密 DNS。注意这个只用来解析节点和其他的 dns,其他网络请求不归他管 |
| 363 | nameserver: trustDnsList, // 其他网络请求都归他管 |
| 364 | |
| 365 | // 这个用于覆盖上面的 nameserver |
| 366 | "nameserver-policy": { |
| 367 | //[combinedUrls]: notionDns, |
| 368 | "geosite:cn": cnDnsList, |
| 369 | "geosite:geolocation-!cn": trustDnsList, |
| 370 | // 如果你有一些内网使用的 DNS,应该定义在这里,多个域名用英文逗号分割 |
| 371 | // '+. 公司域名.com, www.4399.com, +.baidu.com': '10.0.0.1' |
| 372 | }, |
| 373 | fallback: trustDnsList, |
| 374 | "fallback-filter": { |
| 375 | geoip: true, |
| 376 | // 除了 geoip-code 配置的国家 IP, 其他的 IP 结果会被视为污染 geoip-code 配置的国家的结果会直接采用,否则将采用 fallback 结果 |
| 377 | "geoip-code": "CN", |
| 378 | //geosite 列表的内容被视为已污染,匹配到 geosite 的域名,将只使用 fallback 解析,不去使用 nameserver |
| 379 | geosite: ["gfw"], |
| 380 | ipcidr: ["240.0.0.0/4"], |
| 381 | domain: ["+.google.com", "+.facebook.com", "+.youtube.com"], |
| 382 | }, |
| 383 | }; |
| 384 | |
| 385 | // GitHub 加速前缀 |
| 386 | const githubPrefix = "https://fastgh.lainbo.com/"; |
| 387 | |
| 388 | // GEO 数据 GitHub 资源原始下载地址 |
| 389 | const rawGeoxURLs = { |
| 390 | geoip: |
| 391 | "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat", |
| 392 | geosite: |
| 393 | "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat", |
| 394 | mmdb: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb", |
| 395 | }; |
| 396 | |
| 397 | // 生成带有加速前缀的 GEO 数据资源对象 |
| 398 | const accelURLs = Object.fromEntries ( |
| 399 | Object.entries (rawGeoxURLs).map (([key, githubUrl]) => [ |
| 400 | key, |
| 401 | `${githubPrefix}${githubUrl}`, |
| 402 | ]) |
| 403 | ); |
| 404 | |
| 405 | const otherOptions = { |
| 406 | "unified-delay": true, |
| 407 | "tcp-concurrent": true, |
| 408 | profile: { |
| 409 | "store-selected": true, |
| 410 | "store-fake-ip": true, |
| 411 | }, |
| 412 | sniffer: { |
| 413 | enable: true, |
| 414 | sniff: { |
| 415 | TLS: { |
| 416 | ports: [443, 8443], |
| 417 | }, |
| 418 | HTTP: { |
| 419 | ports: [80, "8080-8880"], |
| 420 | "override-destination": true, |
| 421 | }, |
| 422 | }, |
| 423 | }, |
| 424 | "geodata-mode": true, |
| 425 | "geox-url": accelURLs, |
| 426 | }; |
| 427 | |
| 428 | params.dns = { ...params.dns, ...dnsOptions }; |
| 429 | Object.keys (otherOptions).forEach ((key) => { |
| 430 | params [key] = otherOptions [key]; |
| 431 | }); |
| 432 | } |
| 433 | |
| 434 | function getProxiesByRegex (params, regex) { |
| 435 | const matchedProxies = params.proxies.filter ((e) => regex.test (e.name)).map ((e) => e.name); |
| 436 | return matchedProxies.length > 0 ? matchedProxies : ["手动选择"]; |
| 437 | } |
| 438 | |
| 439 | function getManualProxiesByRegex (params, regex) { |
| 440 | const matchedProxies = params.proxies.filter ((e) => regex.test (e.name)).map ((e) => e.name); |
| 441 | return matchedProxies.length > 0 ? matchedProxies : ["DIRECT", "手动选择", proxyName]; |
| 442 | } |