【CF Worker】为 Mihomo 格式订阅便捷地添加中转落地节点组
市面上开源的各种订阅聚合工具挺多的,各有特色,但是涉及到添加中转相关,大多都需要有地方部署后端,或是配置非常复杂,我没找到能满足简单需求的。
这个脚本主要面向需求较为简单的用户,比如自己有常用网络环境下的线路鸡,但要访问目标网站有地域限制(比如 AI 不能走香港出口),又希望能从线路鸡中转到各种入口不那么好的机场的用户。
脚本的逻辑很简单,就是会添加 LANDING 和 ENTRY 两个节点组。ENTRY 中有上游订阅的所有节点,LANDING 中为上游订阅中的每个节点增加 dialer-proxy: ENTRY,再为其他策略组增加 LANDING 选项。这样只需要在 ENTRY 中选择自己的线路鸡,再点击 LANDING 组的测速按钮,选择落地鸡即可。中转节点和落地节点都可以随时切换。
如下图:
import yaml from 'js-yaml';
interface Proxy {
name: string;
[key: string]: unknown;
}
interface ProxyGroup {
name: string;
proxies?: string[];
[key: string]: unknown;
}
interface ClashConfig {
proxies?: Proxy[];
'proxy-groups'?: ProxyGroup[];
[key: string]: unknown;
}
export default {
async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
const upstream = url.searchParams.get('url') || '这里修改为你的上游订阅';
try {
const res = await fetch(upstream);
if (!res.ok) return new Response('Upstream error', { status: 502 });
const text = await res.text();
const config = yaml.load(text) as ClashConfig;
if (!config?.proxies) return new Response('Invalid config', { status: 400 });
const proxyNames = config.proxies.map(p => p.name);
const landingProxies: Proxy[] = config.proxies.map(p => ({
...p,
name: `${p.name}-landing`,
'dialer-proxy': 'ENTRY'
}));
config.proxies = [...config.proxies, ...landingProxies];
const entryGroup: ProxyGroup = { name: 'ENTRY', type: 'select', proxies: proxyNames };
const landingGroup: ProxyGroup = { name: 'LANDING', type: 'select', proxies: landingProxies.map(p => p.name) };
const groups = config['proxy-groups'] || [];
for (const g of groups) {
if (g.proxies) g.proxies.unshift('LANDING');
}
config['proxy-groups'] = [entryGroup, landingGroup, ...groups];
return new Response(yaml.dump(config), {
headers: { 'Content-Type': 'text/yaml; charset=utf-8' }
});
} catch {
return new Response('Parse error', { status: 400 });
}
}
};
只需要本地在 wrangler 里创建一个空项目,复制以上代码块里的代码,修改代码块里的上游订阅,然后部署即可。
