给大家分享一个几乎傻瓜式的链式代理脚本(+自动划分流量)支持 clash verge 和 flclash。

2026-04-11 11:431阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:

首先感谢 webshare.io 家宽包年 8 美元与 clash 链式代理部署教程,可以一定程度解决 ChatGPT 降智与注册较高风控账号 - 开发调优 / 开发调优,Lv1 - LINUX DO 这篇帖子,让我能用上便宜的家宽落地。

然后感谢 dialer-proxy 实现链式代理(最简配置、订阅转换和全局覆写 - 开发调优 - LINUX DO 这个帖子给我的启发。

论坛关于链式的帖子很多,但没有一个是能够粘贴进去不用大改就能用的,我直接给大家贴个全局扩展脚本,能匹配每一个机场的链式代理。

链式代理全局扩展脚本(clash verge专用):

clash verge专用脚本

function main (config, profileName) { // ========= 可调参数 ========= const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ]; // 分流规则 const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ]; const CHAIN_PREFIX = "中转→"; const DIRECT_GROUP = "直连节点"; // 这是“节点组”,里面是你的上游节点 const MASTER_CHAIN_GROUP = "中转总组"; const AUTO_GROUP = "自动选择"; // 这是 url-test 组(测速自动选优) const DIRECT_POLICY = "DIRECT"; // 这是 Clash 内置策略(真正直连不走代理) const MAX_GEN = 300; // 最大生成链式数量 const NAME_MAX_LEN = 60; // 名称最大长度 const ENABLE_FALLBACK = true; const EXCLUDE_KEYWORDS = ["测试", "官网", "到期", "流量", "剩余"]; // 解析配置 config.proxies = config.proxies || []; // 保留原有机场配置和规则(可能导致分流无效) // config["proxy-groups"] = config["proxy-groups"] || []; // config.rules = config.rules || []; // 删除所有已有的代理组(包括“节点选择”、“自动选择”等) config["proxy-groups"] = []; // 删除所有已有的规则 config.rules = []; // 移除所有原有的 MATCH 规则,防止干扰 config.rules = (config.rules || []).filter(rule => !rule.startsWith("MATCH,")); const pg = config["proxy-groups"]; // ========= 工具函数 ========= const isProxy = p => p && typeof p.name === "string" && typeof p.type === "string"; function uniq(list) { const seen = new Set(); const out = []; for (const x of (list || [])) { if (x === undefined || x === null) continue; if (!seen.has(x)) { seen.add(x); out.push(x); } } return out; } function upsertGroup(name, type, list, extra = {}) { const existing = pg.find(g => g && g.name === name); if (existing) { existing.type = type; existing.proxies = uniq(list); Object.assign(existing, extra); } else { pg.push(Object.assign({ name, type, proxies: uniq(list) }, extra)); } } // 安全创建/补齐 select 分组 function ensureSelectGroup(name, preferChain, upstreams, extra = {}) { const includeAuto = name !== AUTO_GROUP; // 防循环:自动选择组本身不引用自己 const baseFront = preferChain ? [MASTER_CHAIN_GROUP, DIRECT_GROUP] : [DIRECT_GROUP, MASTER_CHAIN_GROUP]; const desired = uniq([ DIRECT_POLICY, ...(includeAuto ? [AUTO_GROUP] : []), ...baseFront, ...upstreams ]); const existing = pg.find(g => g && g.name === name); if (!existing) { pg.push(Object.assign({ name, type: "select", proxies: desired }, extra)); return; } existing.type = existing.type || "select"; existing.proxies = uniq([...(existing.proxies || []), ...desired]); Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } // 自动测速选择最快 function ensureUrlTestGroup(name, candidates, extra = {}) { const existing = pg.find(g => g && g.name === name); const base = uniq(candidates); // candidates = upstreams(真实节点) if (!existing) { pg.push(Object.assign({ name, type: "url-test", proxies: base, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 50 }, extra)); return; } existing.type = "url-test"; existing.proxies = uniq([...(existing.proxies || []), ...base]); if (existing.url === undefined) existing.url = "http://www.gstatic.com/generate_204"; if (existing.interval === undefined) existing.interval = 300; if (existing.tolerance === undefined) existing.tolerance = 50; Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } function addRule(rule) { if (!config.rules.includes(rule)) config.rules.push(rule); } function addRules(rules) { (rules || []).forEach(addRule); } // ========= 清理旧链式 ========= config.proxies = config.proxies.filter( p => !(isProxy(p) && p.name.startsWith(CHAIN_PREFIX)) ); // 再移除包含排除关键词的节点 config.proxies = config.proxies.filter(p => { if (!isProxy(p)) return false; return !EXCLUDE_KEYWORDS.some(k => p.name.includes(k)); }); // ========= 添加落地 ========= LANDINGS.forEach(l => { config.proxies = config.proxies.filter(p => !(isProxy(p) && p.name === l.name)); config.proxies.push({ name: l.name, type: "socks5", server: l.server, port: l.port, username: l.username, password: l.password, udp: true }); }); // ========= 自动识别所有上游 ========= const upstreams = config.proxies .filter(isProxy) .map(p => p.name) .filter(name => !name.startsWith(CHAIN_PREFIX) && !LANDINGS.some(l => l.name === name) && !EXCLUDE_KEYWORDS.some(k => name.includes(k)) ); // ========= 按地区自动分类 ========= // const REGION_GROUP_PREFIX = "地区 -"; // const regionMap = {}; // upstreams.forEach(name => { // let region = "其他"; // if (/香港| HK|HK /i.test(name)) region = "香港"; // else if (/日本| JP|JP /i.test(name)) region = "日本"; // else if (/新加坡| SG|SG /i.test(name)) region = "新加坡"; // else if (/美国| US|US /i.test(name)) region = "美国"; // else if (/台湾| TW|TW /i.test(name)) region = "台湾"; // else if (/韩国| KR|KR /i.test(name)) region = "韩国"; // else if (/欧洲| EU|EU |德国|法国|英国/i.test(name)) region = "欧洲"; // regionMap[region] = regionMap[region] || []; // regionMap[region].push(name); // }); // Object.keys(regionMap).forEach(region => { // upsertGroup( // REGION_GROUP_PREFIX + region, // "select", // // 地区组也加入 DIRECT 与 自动选择,方便直连/测速自动 // uniq([DIRECT_POLICY, AUTO_GROUP, ...regionMap[region]]) // ); // }); // ========= 生成多落地链 ========= const landingGroups = []; LANDINGS.forEach(landing => { const groupName = landing.name + "- 链式"; landingGroups.push(groupName); const chained = []; upstreams.slice(0, MAX_GEN).forEach(up => { let newName = `${CHAIN_PREFIX}${landing.name} ${up}`; if (newName.length > NAME_MAX_LEN) newName = newName.slice(0, NAME_MAX_LEN); let finalName = newName; let i = 2; while (config.proxies.some(p => isProxy(p) && p.name === finalName)) { const suffix = `#${i++}`; finalName = newName.slice(0, NAME_MAX_LEN - suffix.length) + suffix; } config.proxies.push({ name: finalName, type: "socks5", server: landing.server, port: landing.port, username: landing.username, password: landing.password, udp: true, "dialer-proxy": up }); chained.push(finalName); }); if (ENABLE_FALLBACK) { upsertGroup(groupName, "fallback", chained, { url: "http://www.gstatic.com/generate_204", interval: 300 }); } else { upsertGroup(groupName, "select", chained); } }); // ========= 直连节点组 ========= // 注意:这是“节点组”,里面是上游节点;另外你还会在业务组里有 DIRECT(真正直连) upsertGroup( DIRECT_GROUP, ENABLE_FALLBACK ? "fallback" : "select", upstreams, ENABLE_FALLBACK ? { url: "http://www.gstatic.com/generate_204", interval: 300 } : {} ); // ========= 总中转组 ========= upsertGroup( MASTER_CHAIN_GROUP, "select", landingGroups ); // ========= 自动选择(url-test)先创建出来,供其它组引用 ========= ensureUrlTestGroup(AUTO_GROUP, upstreams); // ========= 自动注入所有业务组(安全去重版) ========= pg.forEach(group => { if ( group && group.type === "select" && group.name !== MASTER_CHAIN_GROUP && group.name !== DIRECT_GROUP && group.name !== AUTO_GROUP && !group.name.endsWith("- 链式") && !group.name.startsWith("地区 -") ) { // 先去掉旧入口,避免多次执行累积 group.proxies = (group.proxies || []).filter( x => x !== MASTER_CHAIN_GROUP && x !== DIRECT_GROUP && x !== AUTO_GROUP && x !== DIRECT_POLICY ); // 再补齐(去重保序) group.proxies = uniq([ ...(group.proxies || []), DIRECT_POLICY, AUTO_GROUP, DIRECT_GROUP, MASTER_CHAIN_GROUP ]); } }); // ============================================================ // 业务分组: // 每组默认可选:DIRECT / 自动选择 / 中转总组 / 直连节点 / 所有上游节点 // ============================================================ ensureSelectGroup("Gemini", true, upstreams); ensureSelectGroup("ChatGPT", true, upstreams); ensureSelectGroup("Copilot", true, upstreams); ensureSelectGroup("Telegram", true, upstreams); ensureSelectGroup("Cloudflare", true, upstreams); ensureSelectGroup("Netflix", true, upstreams); ensureSelectGroup("TikTok", false, upstreams); ensureSelectGroup("Steam", false, upstreams); ensureSelectGroup("Twitter", false, upstreams); ensureSelectGroup("哔哩哔哩", false, upstreams); ensureSelectGroup("苹果服务", false, upstreams); ensureSelectGroup("谷歌服务", false, upstreams); ensureSelectGroup("微软服务", false, upstreams); // 手动选择组 ensureSelectGroup("节点选择", false, upstreams); // ============================================================ // 规则写入 // - 逐条去重写入 config.rules // ============================================================ addRules(RULES_FULL); // ========= 兜底 ========= addRule(`MATCH,节点选择`); return config; }

链式代理脚本(flclash专用-支持苹果安卓以及电脑全端,对应教程之后更新):

flclash专用脚本

const main = (config) =>{ // ========= 可调参数 ========= const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ]; // 分流规则 const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ]; const CHAIN_PREFIX = "中转→"; const DIRECT_GROUP = "直连节点"; // 这是“节点组”,里面是你的上游节点 const MASTER_CHAIN_GROUP = "中转总组"; const AUTO_GROUP = "自动选择"; // 这是 url-test 组(测速自动选优) const DIRECT_POLICY = "DIRECT"; // 这是 Clash 内置策略(真正直连不走代理) const MAX_GEN = 300; // 最大生成链式数量 const NAME_MAX_LEN = 60; // 名称最大长度 const ENABLE_FALLBACK = true; const EXCLUDE_KEYWORDS = ["测试", "官网", "到期", "流量", "剩余"]; // 解析配置 config.proxies = config.proxies || []; // 保留原有机场配置和规则(可能导致分流无效) // config["proxy-groups"] = config["proxy-groups"] || []; // config.rules = config.rules || []; // 删除所有已有的代理组(包括“节点选择”、“自动选择”等) config["proxy-groups"] = []; // 删除所有已有的规则 config.rules = []; // 移除所有原有的 MATCH 规则,防止干扰 config.rules = (config.rules || []).filter(rule => !rule.startsWith("MATCH,")); const pg = config["proxy-groups"]; // ========= 工具函数 ========= const isProxy = p => p && typeof p.name === "string" && typeof p.type === "string"; function uniq(list) { const seen = new Set(); const out = []; for (const x of (list || [])) { if (x === undefined || x === null) continue; if (!seen.has(x)) { seen.add(x); out.push(x); } } return out; } function upsertGroup(name, type, list, extra = {}) { const existing = pg.find(g => g && g.name === name); if (existing) { existing.type = type; existing.proxies = uniq(list); Object.assign(existing, extra); } else { pg.push(Object.assign({ name, type, proxies: uniq(list) }, extra)); } } // 安全创建/补齐 select 分组 function ensureSelectGroup(name, preferChain, upstreams, extra = {}) { const includeAuto = name !== AUTO_GROUP; // 防循环:自动选择组本身不引用自己 const baseFront = preferChain ? [MASTER_CHAIN_GROUP, DIRECT_GROUP] : [DIRECT_GROUP, MASTER_CHAIN_GROUP]; const desired = uniq([ DIRECT_POLICY, ...(includeAuto ? [AUTO_GROUP] : []), ...baseFront, ...upstreams ]); const existing = pg.find(g => g && g.name === name); if (!existing) { pg.push(Object.assign({ name, type: "select", proxies: desired }, extra)); return; } existing.type = existing.type || "select"; existing.proxies = uniq([...(existing.proxies || []), ...desired]); Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } // 自动测速选择最快 function ensureUrlTestGroup(name, candidates, extra = {}) { const existing = pg.find(g => g && g.name === name); const base = uniq(candidates); // candidates = upstreams(真实节点) if (!existing) { pg.push(Object.assign({ name, type: "url-test", proxies: base, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 50 }, extra)); return; } existing.type = "url-test"; existing.proxies = uniq([...(existing.proxies || []), ...base]); if (existing.url === undefined) existing.url = "http://www.gstatic.com/generate_204"; if (existing.interval === undefined) existing.interval = 300; if (existing.tolerance === undefined) existing.tolerance = 50; Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } function addRule(rule) { if (!config.rules.includes(rule)) config.rules.push(rule); } function addRules(rules) { (rules || []).forEach(addRule); } // ========= 清理旧链式 ========= config.proxies = config.proxies.filter( p => !(isProxy(p) && p.name.startsWith(CHAIN_PREFIX)) ); // 再移除包含排除关键词的节点 config.proxies = config.proxies.filter(p => { if (!isProxy(p)) return false; return !EXCLUDE_KEYWORDS.some(k => p.name.includes(k)); }); // ========= 添加落地 ========= LANDINGS.forEach(l => { config.proxies = config.proxies.filter(p => !(isProxy(p) && p.name === l.name)); config.proxies.push({ name: l.name, type: "socks5", server: l.server, port: l.port, username: l.username, password: l.password, udp: true }); }); // ========= 自动识别所有上游 ========= const upstreams = config.proxies .filter(isProxy) .map(p => p.name) .filter(name => !name.startsWith(CHAIN_PREFIX) && !LANDINGS.some(l => l.name === name) && !EXCLUDE_KEYWORDS.some(k => name.includes(k)) ); // ========= 按地区自动分类 ========= // const REGION_GROUP_PREFIX = "地区 -"; // const regionMap = {}; // upstreams.forEach(name => { // let region = "其他"; // if (/香港| HK|HK /i.test(name)) region = "香港"; // else if (/日本| JP|JP /i.test(name)) region = "日本"; // else if (/新加坡| SG|SG /i.test(name)) region = "新加坡"; // else if (/美国| US|US /i.test(name)) region = "美国"; // else if (/台湾| TW|TW /i.test(name)) region = "台湾"; // else if (/韩国| KR|KR /i.test(name)) region = "韩国"; // else if (/欧洲| EU|EU |德国|法国|英国/i.test(name)) region = "欧洲"; // regionMap[region] = regionMap[region] || []; // regionMap[region].push(name); // }); // Object.keys(regionMap).forEach(region => { // upsertGroup( // REGION_GROUP_PREFIX + region, // "select", // // 地区组也加入 DIRECT 与 自动选择,方便直连/测速自动 // uniq([DIRECT_POLICY, AUTO_GROUP, ...regionMap[region]]) // ); // }); // ========= 生成多落地链 ========= const landingGroups = []; LANDINGS.forEach(landing => { const groupName = landing.name + "- 链式"; landingGroups.push(groupName); const chained = []; upstreams.slice(0, MAX_GEN).forEach(up => { let newName = `${CHAIN_PREFIX}${landing.name} ${up}`; if (newName.length > NAME_MAX_LEN) newName = newName.slice(0, NAME_MAX_LEN); let finalName = newName; let i = 2; while (config.proxies.some(p => isProxy(p) && p.name === finalName)) { const suffix = `#${i++}`; finalName = newName.slice(0, NAME_MAX_LEN - suffix.length) + suffix; } config.proxies.push({ name: finalName, type: "socks5", server: landing.server, port: landing.port, username: landing.username, password: landing.password, udp: true, "dialer-proxy": up }); chained.push(finalName); }); if (ENABLE_FALLBACK) { upsertGroup(groupName, "fallback", chained, { url: "http://www.gstatic.com/generate_204", interval: 300 }); } else { upsertGroup(groupName, "select", chained); } }); // ========= 直连节点组 ========= // 注意:这是“节点组”,里面是上游节点;另外你还会在业务组里有 DIRECT(真正直连) upsertGroup( DIRECT_GROUP, ENABLE_FALLBACK ? "fallback" : "select", upstreams, ENABLE_FALLBACK ? { url: "http://www.gstatic.com/generate_204", interval: 300 } : {} ); // ========= 总中转组 ========= upsertGroup( MASTER_CHAIN_GROUP, "select", landingGroups ); // ========= 自动选择(url-test)先创建出来,供其它组引用 ========= ensureUrlTestGroup(AUTO_GROUP, upstreams); // ========= 自动注入所有业务组(安全去重版) ========= pg.forEach(group => { if ( group && group.type === "select" && group.name !== MASTER_CHAIN_GROUP && group.name !== DIRECT_GROUP && group.name !== AUTO_GROUP && !group.name.endsWith("- 链式") && !group.name.startsWith("地区 -") ) { // 先去掉旧入口,避免多次执行累积 group.proxies = (group.proxies || []).filter( x => x !== MASTER_CHAIN_GROUP && x !== DIRECT_GROUP && x !== AUTO_GROUP && x !== DIRECT_POLICY ); // 再补齐(去重保序) group.proxies = uniq([ ...(group.proxies || []), DIRECT_POLICY, AUTO_GROUP, DIRECT_GROUP, MASTER_CHAIN_GROUP ]); } }); // ============================================================ // 业务分组: // 每组默认可选:DIRECT / 自动选择 / 中转总组 / 直连节点 / 所有上游节点 // ============================================================ ensureSelectGroup("Gemini", true, upstreams); ensureSelectGroup("ChatGPT", true, upstreams); ensureSelectGroup("Copilot", true, upstreams); ensureSelectGroup("Telegram", true, upstreams); ensureSelectGroup("Cloudflare", true, upstreams); ensureSelectGroup("Netflix", true, upstreams); ensureSelectGroup("TikTok", false, upstreams); ensureSelectGroup("Steam", false, upstreams); ensureSelectGroup("Twitter", false, upstreams); ensureSelectGroup("哔哩哔哩", false, upstreams); ensureSelectGroup("苹果服务", false, upstreams); ensureSelectGroup("谷歌服务", false, upstreams); ensureSelectGroup("微软服务", false, upstreams); // 手动选择组 ensureSelectGroup("节点选择", false, upstreams); // ============================================================ // 规则写入 // - 逐条去重写入 config.rules // ============================================================ addRules(RULES_FULL); // ========= 兜底 ========= addRule(`MATCH,节点选择`); return config; }

使用起来的话主要修改开头这一部分:

// ========= 可调参数 ========= const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ]; // 分流规则 const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ];

代码用 ai 优化了一下,对于一些不显示地区的机场或者自建也能快速划分地理位置(ai 的自作多情,看着还不错我懒得删了)

如果不需要可以自行删除对应的代码,都有注释了(ai 标注好了,问题不大)

clash verge 使用脚本教程如下:
clash verge 使用脚本教程

复制代码后打开clash,我这边用的是clash verge( Mihomo (Clash Meta) 内核)的,如果是旧的内核可能不支持
image1274×830 48.5 KB
然后粘贴
image1274×830 84.1 KB
之后翻到上面配置落地节点
image1274×830 73.5 KB
最后简单的切换下节点让配置生效即可,这一步就不截图了(懒)。
希望能帮助到大家,感觉有用的话帮佬点个 ,感谢
配置生效就是刷新一下配置或者切换一下配置就行了,而且一般是默认生效,然后你就可以在代理页面看到这些组:
image2448×1604 258 KB

更新了一下,现在能直接针对 GPT 等类型做中转落地代理,规则论坛文本长度限制我放不下,在这里添加规则

RULES_FULL规则使用方式

const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ];

规则文件:
clash 脚本规则集.txt (65.9 KB)

类似这样子把规则粘贴到这里:
image2448×1604 378 KB
这样子就可控分流了

flclash 脚本教程如下:
flclash 脚本教程(安卓、mac、win、linux 可用)

flclash 工具页面选择进阶配置:

image870×2044 118 KB
然后打开脚本的选项:
image886×756 75.5 KB
命名粘贴并保存:
image870×1958 210 KB
按如下步骤操作,打开更多:
image984×1970 97.8 KB
进入覆写选项:
image908×654 50.5 KB
选择脚本,并启用
image894×828 79 KB
脚本的圆形选框亮起即可退出,此时代理组已经准备就绪:
image838×360 27.4 KB

脚本修改指南

不需要地区的,删除下面这一段

自动划分地区代码段落

// ========= 按地区自动分类 ========= const REGION_GROUP_PREFIX = "地区 -"; const regionMap = {}; upstreams.forEach(name => { let region = "其他"; if (/香港| HK|HK /i.test(name)) region = "香港"; else if (/日本| JP|JP /i.test(name)) region = "日本"; else if (/新加坡| SG|SG /i.test(name)) region = "新加坡"; else if (/美国| US|US /i.test(name)) region = "美国"; else if (/台湾| TW|TW /i.test(name)) region = "台湾"; else if (/韩国| KR|KR /i.test(name)) region = "韩国"; else if (/欧洲| EU|EU |德国|法国|英国/i.test(name)) region = "欧洲"; regionMap[region] = regionMap[region] || []; regionMap[region].push(name); }); Object.keys(regionMap).forEach(region => { upsertGroup( REGION_GROUP_PREFIX + region, "select", // 地区组也加入 DIRECT 与 自动选择,方便直连/测速自动 uniq([DIRECT_POLICY, AUTO_GROUP, ...regionMap[region]]) ); });

不需要自动划分流量范围的,删除下面这一段:

自动划分流量范围代码段落

// ============================================================ // 业务分组: // 每组默认可选:DIRECT / 自动选择 / 中转总组 / 直连节点 / 所有上游节点 // ============================================================ ensureSelectGroup("Gemini", true, upstreams); ensureSelectGroup("ChatGPT", true, upstreams); ensureSelectGroup("Copilot", true, upstreams); ensureSelectGroup("Telegram", true, upstreams); ensureSelectGroup("Netflix", true, upstreams); ensureSelectGroup("TikTok", false, upstreams); ensureSelectGroup("Steam", false, upstreams); ensureSelectGroup("Twitter", false, upstreams); ensureSelectGroup("哔哩哔哩", false, upstreams); ensureSelectGroup("苹果服务", false, upstreams); ensureSelectGroup("谷歌服务", false, upstreams); ensureSelectGroup("微软服务", false, upstreams); // 手动选择组 ensureSelectGroup("节点选择", false, upstreams); addRules(RULES_FULL);

26.2.25 稍微排版了一下,有问题可以提出来,之前的排版感觉太占位置了,如果有帮助到你,麻烦点个赞,如果觉得可以,给个开发调优的认可,感谢各位支持的佬。

26.2.26
更新,加入 telegram 规则,前面脚本也更新了

26.2.27
添加直接删除所有机场自带配置,并优化可调参数位置

26.3.6 修改删除地区分类可能出现的代码错误,并默认注释地区分类,添加 telegram 和 cloudflare 的规则

网友解答:
--【壹】--:

666,感谢分享


--【贰】--:

mark 一下


--【叁】--:

还有一点就是为什么不直接使用家宽,反而用机场影响了速度,如果你买了家宽的 socks5 你就会发现,连不上,只能中转落地


--【肆】--:

感谢大佬


--【伍】--:

mark一下 clash分流这方面确实不懂


--【陆】--:

感谢佬友解答,准备银行卡下来了就搞个webshare家宽玩玩


--【柒】--:

好贴帮顶


--【捌】--:

只配置这四个,方便的话把具体信息私发给我我看看,会不会是你代理不能用
image452×154 12.4 KB


--【玖】--:

家宽纯净节点一般来说是 10$ 一个月,一年就要 100$,这还是最低价
如果服务器自建类似 rn 那种节点是被标记为机房的,注册亚马逊,tg 等无法绕过限制,与机场节点差距不大,有些机场甚至是 cn2 节点,这样对比一下就更比不上了。而且 rn一年也要至少 10$,没法切换 ip,如果遇到特殊情况根本连不上,这时候还是需要机场。
所以说综合对比一下还是机场+落地家宽是最廉价的选择,尤其是你有家宽的需求, webshare的家宽一年能换 20 个 ip,黑了也有机会换,要是自建的话一般服务器是不提供退款和换 ip 的。
这一切的前提都是你需要一个纯净的国外代理,如果没有这个需求廉价机场即可。


--【拾】--:

你是不是没填配置啊,要配置落地的 socks5:

// ========= 可调参数 ========= const CHAIN_PREFIX = "中转→"; const DIRECT_GROUP = "直连节点"; const MASTER_CHAIN_GROUP = "中转总组"; const REGION_GROUP_PREFIX = "地区 -"; const MAX_GEN = 300; // 最大生成链式数量 const NAME_MAX_LEN = 60; // 名称最大长度 const ENABLE_FALLBACK = true; const EXCLUDE_KEYWORDS = [ "测试", "官网", "到期", "流量", "剩余" ]; const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ];


--【拾壹】--:

感谢大佬


--【拾贰】--:

佬,我是配置了上面那个美国的


--【拾叁】--:

image2510×1461 313 KB
佬,我是这样的,clash verge


--【拾肆】--:

感谢分享

[教程3.0] 草履虫也能学会的 Clash 配置:UI界面一键配置精确分流、链式代理 开发调优, Lv1
本文更新可能不及时,推荐阅读博客原文 1. 版本更新说明 有佬友说2.0版本也看不懂,想要一个UI界面可视化配置。 因此。3.0最终版的教程,会基于 SubBoost 进行在线配置,这下还学不会的真是草履虫了。 现在,你不再需要打开 YAML 文件手动修改,也不需要去研究语法。 只用把订阅链接或节点链接粘贴进 SubBoost,就能一键生成配置。 登录后还能直接生成优化后的订阅链…

这个大佬的也不错


--【拾伍】--:

教程和代码都更新了,你这个应该是没配置落地服务器的 socks5


--【拾陆】--:

佬,这个让配置生效是怎么弄的呀


--【拾柒】--:

mark一下,本人小白,这个是不是只能解决ip纯净度问题,具体延迟网速之类的还是取决于原来的机场?既然这样,自建节点更快,ip也干净,为什么不选择自建呢?我目前在犹豫到底要不要尝试自建,感觉太麻烦玩不来,但是单纯用落地鸡+链式代理一年10$觉得也划不来,希望有佬能解惑一下


--【拾捌】--:

,干货满满


--【拾玖】--:

刷新一下配置或者切换一下配置就行了,而且一般是默认生效,然后你就可以在代理页面看到这些组:
image2448×1604 258 KB
顺便,如果不能生效你告诉我你的客户端,flclash 还要另外设置、clash verge 就直接生效的

问题描述:

首先感谢 webshare.io 家宽包年 8 美元与 clash 链式代理部署教程,可以一定程度解决 ChatGPT 降智与注册较高风控账号 - 开发调优 / 开发调优,Lv1 - LINUX DO 这篇帖子,让我能用上便宜的家宽落地。

然后感谢 dialer-proxy 实现链式代理(最简配置、订阅转换和全局覆写 - 开发调优 - LINUX DO 这个帖子给我的启发。

论坛关于链式的帖子很多,但没有一个是能够粘贴进去不用大改就能用的,我直接给大家贴个全局扩展脚本,能匹配每一个机场的链式代理。

链式代理全局扩展脚本(clash verge专用):

clash verge专用脚本

function main (config, profileName) { // ========= 可调参数 ========= const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ]; // 分流规则 const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ]; const CHAIN_PREFIX = "中转→"; const DIRECT_GROUP = "直连节点"; // 这是“节点组”,里面是你的上游节点 const MASTER_CHAIN_GROUP = "中转总组"; const AUTO_GROUP = "自动选择"; // 这是 url-test 组(测速自动选优) const DIRECT_POLICY = "DIRECT"; // 这是 Clash 内置策略(真正直连不走代理) const MAX_GEN = 300; // 最大生成链式数量 const NAME_MAX_LEN = 60; // 名称最大长度 const ENABLE_FALLBACK = true; const EXCLUDE_KEYWORDS = ["测试", "官网", "到期", "流量", "剩余"]; // 解析配置 config.proxies = config.proxies || []; // 保留原有机场配置和规则(可能导致分流无效) // config["proxy-groups"] = config["proxy-groups"] || []; // config.rules = config.rules || []; // 删除所有已有的代理组(包括“节点选择”、“自动选择”等) config["proxy-groups"] = []; // 删除所有已有的规则 config.rules = []; // 移除所有原有的 MATCH 规则,防止干扰 config.rules = (config.rules || []).filter(rule => !rule.startsWith("MATCH,")); const pg = config["proxy-groups"]; // ========= 工具函数 ========= const isProxy = p => p && typeof p.name === "string" && typeof p.type === "string"; function uniq(list) { const seen = new Set(); const out = []; for (const x of (list || [])) { if (x === undefined || x === null) continue; if (!seen.has(x)) { seen.add(x); out.push(x); } } return out; } function upsertGroup(name, type, list, extra = {}) { const existing = pg.find(g => g && g.name === name); if (existing) { existing.type = type; existing.proxies = uniq(list); Object.assign(existing, extra); } else { pg.push(Object.assign({ name, type, proxies: uniq(list) }, extra)); } } // 安全创建/补齐 select 分组 function ensureSelectGroup(name, preferChain, upstreams, extra = {}) { const includeAuto = name !== AUTO_GROUP; // 防循环:自动选择组本身不引用自己 const baseFront = preferChain ? [MASTER_CHAIN_GROUP, DIRECT_GROUP] : [DIRECT_GROUP, MASTER_CHAIN_GROUP]; const desired = uniq([ DIRECT_POLICY, ...(includeAuto ? [AUTO_GROUP] : []), ...baseFront, ...upstreams ]); const existing = pg.find(g => g && g.name === name); if (!existing) { pg.push(Object.assign({ name, type: "select", proxies: desired }, extra)); return; } existing.type = existing.type || "select"; existing.proxies = uniq([...(existing.proxies || []), ...desired]); Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } // 自动测速选择最快 function ensureUrlTestGroup(name, candidates, extra = {}) { const existing = pg.find(g => g && g.name === name); const base = uniq(candidates); // candidates = upstreams(真实节点) if (!existing) { pg.push(Object.assign({ name, type: "url-test", proxies: base, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 50 }, extra)); return; } existing.type = "url-test"; existing.proxies = uniq([...(existing.proxies || []), ...base]); if (existing.url === undefined) existing.url = "http://www.gstatic.com/generate_204"; if (existing.interval === undefined) existing.interval = 300; if (existing.tolerance === undefined) existing.tolerance = 50; Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } function addRule(rule) { if (!config.rules.includes(rule)) config.rules.push(rule); } function addRules(rules) { (rules || []).forEach(addRule); } // ========= 清理旧链式 ========= config.proxies = config.proxies.filter( p => !(isProxy(p) && p.name.startsWith(CHAIN_PREFIX)) ); // 再移除包含排除关键词的节点 config.proxies = config.proxies.filter(p => { if (!isProxy(p)) return false; return !EXCLUDE_KEYWORDS.some(k => p.name.includes(k)); }); // ========= 添加落地 ========= LANDINGS.forEach(l => { config.proxies = config.proxies.filter(p => !(isProxy(p) && p.name === l.name)); config.proxies.push({ name: l.name, type: "socks5", server: l.server, port: l.port, username: l.username, password: l.password, udp: true }); }); // ========= 自动识别所有上游 ========= const upstreams = config.proxies .filter(isProxy) .map(p => p.name) .filter(name => !name.startsWith(CHAIN_PREFIX) && !LANDINGS.some(l => l.name === name) && !EXCLUDE_KEYWORDS.some(k => name.includes(k)) ); // ========= 按地区自动分类 ========= // const REGION_GROUP_PREFIX = "地区 -"; // const regionMap = {}; // upstreams.forEach(name => { // let region = "其他"; // if (/香港| HK|HK /i.test(name)) region = "香港"; // else if (/日本| JP|JP /i.test(name)) region = "日本"; // else if (/新加坡| SG|SG /i.test(name)) region = "新加坡"; // else if (/美国| US|US /i.test(name)) region = "美国"; // else if (/台湾| TW|TW /i.test(name)) region = "台湾"; // else if (/韩国| KR|KR /i.test(name)) region = "韩国"; // else if (/欧洲| EU|EU |德国|法国|英国/i.test(name)) region = "欧洲"; // regionMap[region] = regionMap[region] || []; // regionMap[region].push(name); // }); // Object.keys(regionMap).forEach(region => { // upsertGroup( // REGION_GROUP_PREFIX + region, // "select", // // 地区组也加入 DIRECT 与 自动选择,方便直连/测速自动 // uniq([DIRECT_POLICY, AUTO_GROUP, ...regionMap[region]]) // ); // }); // ========= 生成多落地链 ========= const landingGroups = []; LANDINGS.forEach(landing => { const groupName = landing.name + "- 链式"; landingGroups.push(groupName); const chained = []; upstreams.slice(0, MAX_GEN).forEach(up => { let newName = `${CHAIN_PREFIX}${landing.name} ${up}`; if (newName.length > NAME_MAX_LEN) newName = newName.slice(0, NAME_MAX_LEN); let finalName = newName; let i = 2; while (config.proxies.some(p => isProxy(p) && p.name === finalName)) { const suffix = `#${i++}`; finalName = newName.slice(0, NAME_MAX_LEN - suffix.length) + suffix; } config.proxies.push({ name: finalName, type: "socks5", server: landing.server, port: landing.port, username: landing.username, password: landing.password, udp: true, "dialer-proxy": up }); chained.push(finalName); }); if (ENABLE_FALLBACK) { upsertGroup(groupName, "fallback", chained, { url: "http://www.gstatic.com/generate_204", interval: 300 }); } else { upsertGroup(groupName, "select", chained); } }); // ========= 直连节点组 ========= // 注意:这是“节点组”,里面是上游节点;另外你还会在业务组里有 DIRECT(真正直连) upsertGroup( DIRECT_GROUP, ENABLE_FALLBACK ? "fallback" : "select", upstreams, ENABLE_FALLBACK ? { url: "http://www.gstatic.com/generate_204", interval: 300 } : {} ); // ========= 总中转组 ========= upsertGroup( MASTER_CHAIN_GROUP, "select", landingGroups ); // ========= 自动选择(url-test)先创建出来,供其它组引用 ========= ensureUrlTestGroup(AUTO_GROUP, upstreams); // ========= 自动注入所有业务组(安全去重版) ========= pg.forEach(group => { if ( group && group.type === "select" && group.name !== MASTER_CHAIN_GROUP && group.name !== DIRECT_GROUP && group.name !== AUTO_GROUP && !group.name.endsWith("- 链式") && !group.name.startsWith("地区 -") ) { // 先去掉旧入口,避免多次执行累积 group.proxies = (group.proxies || []).filter( x => x !== MASTER_CHAIN_GROUP && x !== DIRECT_GROUP && x !== AUTO_GROUP && x !== DIRECT_POLICY ); // 再补齐(去重保序) group.proxies = uniq([ ...(group.proxies || []), DIRECT_POLICY, AUTO_GROUP, DIRECT_GROUP, MASTER_CHAIN_GROUP ]); } }); // ============================================================ // 业务分组: // 每组默认可选:DIRECT / 自动选择 / 中转总组 / 直连节点 / 所有上游节点 // ============================================================ ensureSelectGroup("Gemini", true, upstreams); ensureSelectGroup("ChatGPT", true, upstreams); ensureSelectGroup("Copilot", true, upstreams); ensureSelectGroup("Telegram", true, upstreams); ensureSelectGroup("Cloudflare", true, upstreams); ensureSelectGroup("Netflix", true, upstreams); ensureSelectGroup("TikTok", false, upstreams); ensureSelectGroup("Steam", false, upstreams); ensureSelectGroup("Twitter", false, upstreams); ensureSelectGroup("哔哩哔哩", false, upstreams); ensureSelectGroup("苹果服务", false, upstreams); ensureSelectGroup("谷歌服务", false, upstreams); ensureSelectGroup("微软服务", false, upstreams); // 手动选择组 ensureSelectGroup("节点选择", false, upstreams); // ============================================================ // 规则写入 // - 逐条去重写入 config.rules // ============================================================ addRules(RULES_FULL); // ========= 兜底 ========= addRule(`MATCH,节点选择`); return config; }

链式代理脚本(flclash专用-支持苹果安卓以及电脑全端,对应教程之后更新):

flclash专用脚本

const main = (config) =>{ // ========= 可调参数 ========= const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ]; // 分流规则 const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ]; const CHAIN_PREFIX = "中转→"; const DIRECT_GROUP = "直连节点"; // 这是“节点组”,里面是你的上游节点 const MASTER_CHAIN_GROUP = "中转总组"; const AUTO_GROUP = "自动选择"; // 这是 url-test 组(测速自动选优) const DIRECT_POLICY = "DIRECT"; // 这是 Clash 内置策略(真正直连不走代理) const MAX_GEN = 300; // 最大生成链式数量 const NAME_MAX_LEN = 60; // 名称最大长度 const ENABLE_FALLBACK = true; const EXCLUDE_KEYWORDS = ["测试", "官网", "到期", "流量", "剩余"]; // 解析配置 config.proxies = config.proxies || []; // 保留原有机场配置和规则(可能导致分流无效) // config["proxy-groups"] = config["proxy-groups"] || []; // config.rules = config.rules || []; // 删除所有已有的代理组(包括“节点选择”、“自动选择”等) config["proxy-groups"] = []; // 删除所有已有的规则 config.rules = []; // 移除所有原有的 MATCH 规则,防止干扰 config.rules = (config.rules || []).filter(rule => !rule.startsWith("MATCH,")); const pg = config["proxy-groups"]; // ========= 工具函数 ========= const isProxy = p => p && typeof p.name === "string" && typeof p.type === "string"; function uniq(list) { const seen = new Set(); const out = []; for (const x of (list || [])) { if (x === undefined || x === null) continue; if (!seen.has(x)) { seen.add(x); out.push(x); } } return out; } function upsertGroup(name, type, list, extra = {}) { const existing = pg.find(g => g && g.name === name); if (existing) { existing.type = type; existing.proxies = uniq(list); Object.assign(existing, extra); } else { pg.push(Object.assign({ name, type, proxies: uniq(list) }, extra)); } } // 安全创建/补齐 select 分组 function ensureSelectGroup(name, preferChain, upstreams, extra = {}) { const includeAuto = name !== AUTO_GROUP; // 防循环:自动选择组本身不引用自己 const baseFront = preferChain ? [MASTER_CHAIN_GROUP, DIRECT_GROUP] : [DIRECT_GROUP, MASTER_CHAIN_GROUP]; const desired = uniq([ DIRECT_POLICY, ...(includeAuto ? [AUTO_GROUP] : []), ...baseFront, ...upstreams ]); const existing = pg.find(g => g && g.name === name); if (!existing) { pg.push(Object.assign({ name, type: "select", proxies: desired }, extra)); return; } existing.type = existing.type || "select"; existing.proxies = uniq([...(existing.proxies || []), ...desired]); Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } // 自动测速选择最快 function ensureUrlTestGroup(name, candidates, extra = {}) { const existing = pg.find(g => g && g.name === name); const base = uniq(candidates); // candidates = upstreams(真实节点) if (!existing) { pg.push(Object.assign({ name, type: "url-test", proxies: base, url: "http://www.gstatic.com/generate_204", interval: 300, tolerance: 50 }, extra)); return; } existing.type = "url-test"; existing.proxies = uniq([...(existing.proxies || []), ...base]); if (existing.url === undefined) existing.url = "http://www.gstatic.com/generate_204"; if (existing.interval === undefined) existing.interval = 300; if (existing.tolerance === undefined) existing.tolerance = 50; Object.keys(extra).forEach(k => { if (existing[k] === undefined) existing[k] = extra[k]; }); } function addRule(rule) { if (!config.rules.includes(rule)) config.rules.push(rule); } function addRules(rules) { (rules || []).forEach(addRule); } // ========= 清理旧链式 ========= config.proxies = config.proxies.filter( p => !(isProxy(p) && p.name.startsWith(CHAIN_PREFIX)) ); // 再移除包含排除关键词的节点 config.proxies = config.proxies.filter(p => { if (!isProxy(p)) return false; return !EXCLUDE_KEYWORDS.some(k => p.name.includes(k)); }); // ========= 添加落地 ========= LANDINGS.forEach(l => { config.proxies = config.proxies.filter(p => !(isProxy(p) && p.name === l.name)); config.proxies.push({ name: l.name, type: "socks5", server: l.server, port: l.port, username: l.username, password: l.password, udp: true }); }); // ========= 自动识别所有上游 ========= const upstreams = config.proxies .filter(isProxy) .map(p => p.name) .filter(name => !name.startsWith(CHAIN_PREFIX) && !LANDINGS.some(l => l.name === name) && !EXCLUDE_KEYWORDS.some(k => name.includes(k)) ); // ========= 按地区自动分类 ========= // const REGION_GROUP_PREFIX = "地区 -"; // const regionMap = {}; // upstreams.forEach(name => { // let region = "其他"; // if (/香港| HK|HK /i.test(name)) region = "香港"; // else if (/日本| JP|JP /i.test(name)) region = "日本"; // else if (/新加坡| SG|SG /i.test(name)) region = "新加坡"; // else if (/美国| US|US /i.test(name)) region = "美国"; // else if (/台湾| TW|TW /i.test(name)) region = "台湾"; // else if (/韩国| KR|KR /i.test(name)) region = "韩国"; // else if (/欧洲| EU|EU |德国|法国|英国/i.test(name)) region = "欧洲"; // regionMap[region] = regionMap[region] || []; // regionMap[region].push(name); // }); // Object.keys(regionMap).forEach(region => { // upsertGroup( // REGION_GROUP_PREFIX + region, // "select", // // 地区组也加入 DIRECT 与 自动选择,方便直连/测速自动 // uniq([DIRECT_POLICY, AUTO_GROUP, ...regionMap[region]]) // ); // }); // ========= 生成多落地链 ========= const landingGroups = []; LANDINGS.forEach(landing => { const groupName = landing.name + "- 链式"; landingGroups.push(groupName); const chained = []; upstreams.slice(0, MAX_GEN).forEach(up => { let newName = `${CHAIN_PREFIX}${landing.name} ${up}`; if (newName.length > NAME_MAX_LEN) newName = newName.slice(0, NAME_MAX_LEN); let finalName = newName; let i = 2; while (config.proxies.some(p => isProxy(p) && p.name === finalName)) { const suffix = `#${i++}`; finalName = newName.slice(0, NAME_MAX_LEN - suffix.length) + suffix; } config.proxies.push({ name: finalName, type: "socks5", server: landing.server, port: landing.port, username: landing.username, password: landing.password, udp: true, "dialer-proxy": up }); chained.push(finalName); }); if (ENABLE_FALLBACK) { upsertGroup(groupName, "fallback", chained, { url: "http://www.gstatic.com/generate_204", interval: 300 }); } else { upsertGroup(groupName, "select", chained); } }); // ========= 直连节点组 ========= // 注意:这是“节点组”,里面是上游节点;另外你还会在业务组里有 DIRECT(真正直连) upsertGroup( DIRECT_GROUP, ENABLE_FALLBACK ? "fallback" : "select", upstreams, ENABLE_FALLBACK ? { url: "http://www.gstatic.com/generate_204", interval: 300 } : {} ); // ========= 总中转组 ========= upsertGroup( MASTER_CHAIN_GROUP, "select", landingGroups ); // ========= 自动选择(url-test)先创建出来,供其它组引用 ========= ensureUrlTestGroup(AUTO_GROUP, upstreams); // ========= 自动注入所有业务组(安全去重版) ========= pg.forEach(group => { if ( group && group.type === "select" && group.name !== MASTER_CHAIN_GROUP && group.name !== DIRECT_GROUP && group.name !== AUTO_GROUP && !group.name.endsWith("- 链式") && !group.name.startsWith("地区 -") ) { // 先去掉旧入口,避免多次执行累积 group.proxies = (group.proxies || []).filter( x => x !== MASTER_CHAIN_GROUP && x !== DIRECT_GROUP && x !== AUTO_GROUP && x !== DIRECT_POLICY ); // 再补齐(去重保序) group.proxies = uniq([ ...(group.proxies || []), DIRECT_POLICY, AUTO_GROUP, DIRECT_GROUP, MASTER_CHAIN_GROUP ]); } }); // ============================================================ // 业务分组: // 每组默认可选:DIRECT / 自动选择 / 中转总组 / 直连节点 / 所有上游节点 // ============================================================ ensureSelectGroup("Gemini", true, upstreams); ensureSelectGroup("ChatGPT", true, upstreams); ensureSelectGroup("Copilot", true, upstreams); ensureSelectGroup("Telegram", true, upstreams); ensureSelectGroup("Cloudflare", true, upstreams); ensureSelectGroup("Netflix", true, upstreams); ensureSelectGroup("TikTok", false, upstreams); ensureSelectGroup("Steam", false, upstreams); ensureSelectGroup("Twitter", false, upstreams); ensureSelectGroup("哔哩哔哩", false, upstreams); ensureSelectGroup("苹果服务", false, upstreams); ensureSelectGroup("谷歌服务", false, upstreams); ensureSelectGroup("微软服务", false, upstreams); // 手动选择组 ensureSelectGroup("节点选择", false, upstreams); // ============================================================ // 规则写入 // - 逐条去重写入 config.rules // ============================================================ addRules(RULES_FULL); // ========= 兜底 ========= addRule(`MATCH,节点选择`); return config; }

使用起来的话主要修改开头这一部分:

// ========= 可调参数 ========= const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ]; // 分流规则 const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ];

代码用 ai 优化了一下,对于一些不显示地区的机场或者自建也能快速划分地理位置(ai 的自作多情,看着还不错我懒得删了)

如果不需要可以自行删除对应的代码,都有注释了(ai 标注好了,问题不大)

clash verge 使用脚本教程如下:
clash verge 使用脚本教程

复制代码后打开clash,我这边用的是clash verge( Mihomo (Clash Meta) 内核)的,如果是旧的内核可能不支持
image1274×830 48.5 KB
然后粘贴
image1274×830 84.1 KB
之后翻到上面配置落地节点
image1274×830 73.5 KB
最后简单的切换下节点让配置生效即可,这一步就不截图了(懒)。
希望能帮助到大家,感觉有用的话帮佬点个 ,感谢
配置生效就是刷新一下配置或者切换一下配置就行了,而且一般是默认生效,然后你就可以在代理页面看到这些组:
image2448×1604 258 KB

更新了一下,现在能直接针对 GPT 等类型做中转落地代理,规则论坛文本长度限制我放不下,在这里添加规则

RULES_FULL规则使用方式

const RULES_FULL = [ // 在这里粘贴你的全部规则(每条一个字符串) // 例如: // "DOMAIN,ai.google.dev,Gemini", // "DOMAIN-SUFFIX,chatgpt.com,ChatGPT", // "GEOIP,CN,DIRECT,no-resolve", ];

规则文件:
clash 脚本规则集.txt (65.9 KB)

类似这样子把规则粘贴到这里:
image2448×1604 378 KB
这样子就可控分流了

flclash 脚本教程如下:
flclash 脚本教程(安卓、mac、win、linux 可用)

flclash 工具页面选择进阶配置:

image870×2044 118 KB
然后打开脚本的选项:
image886×756 75.5 KB
命名粘贴并保存:
image870×1958 210 KB
按如下步骤操作,打开更多:
image984×1970 97.8 KB
进入覆写选项:
image908×654 50.5 KB
选择脚本,并启用
image894×828 79 KB
脚本的圆形选框亮起即可退出,此时代理组已经准备就绪:
image838×360 27.4 KB

脚本修改指南

不需要地区的,删除下面这一段

自动划分地区代码段落

// ========= 按地区自动分类 ========= const REGION_GROUP_PREFIX = "地区 -"; const regionMap = {}; upstreams.forEach(name => { let region = "其他"; if (/香港| HK|HK /i.test(name)) region = "香港"; else if (/日本| JP|JP /i.test(name)) region = "日本"; else if (/新加坡| SG|SG /i.test(name)) region = "新加坡"; else if (/美国| US|US /i.test(name)) region = "美国"; else if (/台湾| TW|TW /i.test(name)) region = "台湾"; else if (/韩国| KR|KR /i.test(name)) region = "韩国"; else if (/欧洲| EU|EU |德国|法国|英国/i.test(name)) region = "欧洲"; regionMap[region] = regionMap[region] || []; regionMap[region].push(name); }); Object.keys(regionMap).forEach(region => { upsertGroup( REGION_GROUP_PREFIX + region, "select", // 地区组也加入 DIRECT 与 自动选择,方便直连/测速自动 uniq([DIRECT_POLICY, AUTO_GROUP, ...regionMap[region]]) ); });

不需要自动划分流量范围的,删除下面这一段:

自动划分流量范围代码段落

// ============================================================ // 业务分组: // 每组默认可选:DIRECT / 自动选择 / 中转总组 / 直连节点 / 所有上游节点 // ============================================================ ensureSelectGroup("Gemini", true, upstreams); ensureSelectGroup("ChatGPT", true, upstreams); ensureSelectGroup("Copilot", true, upstreams); ensureSelectGroup("Telegram", true, upstreams); ensureSelectGroup("Netflix", true, upstreams); ensureSelectGroup("TikTok", false, upstreams); ensureSelectGroup("Steam", false, upstreams); ensureSelectGroup("Twitter", false, upstreams); ensureSelectGroup("哔哩哔哩", false, upstreams); ensureSelectGroup("苹果服务", false, upstreams); ensureSelectGroup("谷歌服务", false, upstreams); ensureSelectGroup("微软服务", false, upstreams); // 手动选择组 ensureSelectGroup("节点选择", false, upstreams); addRules(RULES_FULL);

26.2.25 稍微排版了一下,有问题可以提出来,之前的排版感觉太占位置了,如果有帮助到你,麻烦点个赞,如果觉得可以,给个开发调优的认可,感谢各位支持的佬。

26.2.26
更新,加入 telegram 规则,前面脚本也更新了

26.2.27
添加直接删除所有机场自带配置,并优化可调参数位置

26.3.6 修改删除地区分类可能出现的代码错误,并默认注释地区分类,添加 telegram 和 cloudflare 的规则

网友解答:
--【壹】--:

666,感谢分享


--【贰】--:

mark 一下


--【叁】--:

还有一点就是为什么不直接使用家宽,反而用机场影响了速度,如果你买了家宽的 socks5 你就会发现,连不上,只能中转落地


--【肆】--:

感谢大佬


--【伍】--:

mark一下 clash分流这方面确实不懂


--【陆】--:

感谢佬友解答,准备银行卡下来了就搞个webshare家宽玩玩


--【柒】--:

好贴帮顶


--【捌】--:

只配置这四个,方便的话把具体信息私发给我我看看,会不会是你代理不能用
image452×154 12.4 KB


--【玖】--:

家宽纯净节点一般来说是 10$ 一个月,一年就要 100$,这还是最低价
如果服务器自建类似 rn 那种节点是被标记为机房的,注册亚马逊,tg 等无法绕过限制,与机场节点差距不大,有些机场甚至是 cn2 节点,这样对比一下就更比不上了。而且 rn一年也要至少 10$,没法切换 ip,如果遇到特殊情况根本连不上,这时候还是需要机场。
所以说综合对比一下还是机场+落地家宽是最廉价的选择,尤其是你有家宽的需求, webshare的家宽一年能换 20 个 ip,黑了也有机会换,要是自建的话一般服务器是不提供退款和换 ip 的。
这一切的前提都是你需要一个纯净的国外代理,如果没有这个需求廉价机场即可。


--【拾】--:

你是不是没填配置啊,要配置落地的 socks5:

// ========= 可调参数 ========= const CHAIN_PREFIX = "中转→"; const DIRECT_GROUP = "直连节点"; const MASTER_CHAIN_GROUP = "中转总组"; const REGION_GROUP_PREFIX = "地区 -"; const MAX_GEN = 300; // 最大生成链式数量 const NAME_MAX_LEN = 60; // 名称最大长度 const ENABLE_FALLBACK = true; const EXCLUDE_KEYWORDS = [ "测试", "官网", "到期", "流量", "剩余" ]; const LANDINGS = [ { name: "落地 - 美国", server: "美国服务器 ip", port: 端口, username: "用户名 1", password: "密码 1" }, { name: "落地 - 欧洲", server: "欧洲服务器 ip", port: 端口, username: "用户 2", password: "密码 2" } ];


--【拾壹】--:

感谢大佬


--【拾贰】--:

佬,我是配置了上面那个美国的


--【拾叁】--:

image2510×1461 313 KB
佬,我是这样的,clash verge


--【拾肆】--:

感谢分享

[教程3.0] 草履虫也能学会的 Clash 配置:UI界面一键配置精确分流、链式代理 开发调优, Lv1
本文更新可能不及时,推荐阅读博客原文 1. 版本更新说明 有佬友说2.0版本也看不懂,想要一个UI界面可视化配置。 因此。3.0最终版的教程,会基于 SubBoost 进行在线配置,这下还学不会的真是草履虫了。 现在,你不再需要打开 YAML 文件手动修改,也不需要去研究语法。 只用把订阅链接或节点链接粘贴进 SubBoost,就能一键生成配置。 登录后还能直接生成优化后的订阅链…

这个大佬的也不错


--【拾伍】--:

教程和代码都更新了,你这个应该是没配置落地服务器的 socks5


--【拾陆】--:

佬,这个让配置生效是怎么弄的呀


--【拾柒】--:

mark一下,本人小白,这个是不是只能解决ip纯净度问题,具体延迟网速之类的还是取决于原来的机场?既然这样,自建节点更快,ip也干净,为什么不选择自建呢?我目前在犹豫到底要不要尝试自建,感觉太麻烦玩不来,但是单纯用落地鸡+链式代理一年10$觉得也划不来,希望有佬能解惑一下


--【拾捌】--:

,干货满满


--【拾玖】--:

刷新一下配置或者切换一下配置就行了,而且一般是默认生效,然后你就可以在代理页面看到这些组:
image2448×1604 258 KB
顺便,如果不能生效你告诉我你的客户端,flclash 还要另外设置、clash verge 就直接生效的