给大家分享一个几乎傻瓜式的链式代理脚本(+自动划分流量)支持 clash verge 和 flclash。
- 内容介绍
- 文章标签
- 相关推荐
首先感谢 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 脚本教程(安卓、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 脚本教程(安卓、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 就直接生效的

