标签 订阅聚合 下的文章

市面上开源的各种订阅聚合工具挺多的,各有特色,但是涉及到添加中转相关,大多都需要有地方部署后端,或是配置非常复杂,我没找到能满足简单需求的。

这个脚本主要面向需求较为简单的用户,比如自己有常用网络环境下的线路鸡,但要访问目标网站有地域限制(比如 AI 不能走香港出口),又希望能从线路鸡中转到各种入口不那么好的机场的用户。

脚本的逻辑很简单,就是会添加 LANDINGENTRY 两个节点组。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 里创建一个空项目,复制以上代码块里的代码,修改代码块里的上游订阅,然后部署即可。


📌 转载信息
原作者:
koast18
转载时间:
2026/1/5 15:56:25