星期一, 一月 02, 2023

158 利用 Javascript, 让 Clash For Windows 的 mixin 同时支持多个机场切换, 而不用频繁修改 MATCH (以及 yaml + 多机场 的 proxy-providers 写法)

在154号文章中讲到, 利用混合配置 Mixin 将 Clash For Windows 和 AdGuard Home 组合起来使用, 但是 mixin 使用的 Yaml 是静态的, MATCH后面跟的是组名, 每个订阅的组名又不一样, 这就是说, 每次切换节点我还得改, 十分蛋疼. 

于是我在这里找到了解决方法, 从 Yaml 切换成 Javascript. 博主的代码中好像有些错误, 因为它在我这运行报错... 规则也会反过来, MATCH跑到第一位去了... 我也都将其改正了. 
注意 'GEOIP,CN,DIRECT', 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve', 这两句的顺序不能写反了, 我测试发现写反了会导致 AdGuard Home 屏蔽掉的域名又特么被拉进代理解析了... 

我的需求: DNS 走我的 AdGuard Home, 局域网流量直连, 解析出来的 CN IP 直连, 其余一律走代理, 无流媒体需求. 

自己按需修改规则即可. 注意, 如果用 tun 不要使用 fakeip dns 模式, 不然你外部自建的 dns 就废了. 


module.exports.parse = ({ content, name, url }, { yaml, axios, notify }) => {


    // 通用设置

    content['mixed-port'] = 1081;

    content['allow-lan'] = true;

    content['ipv6'] = false;

    content['bind-address'] = '*';

    content['mode'] = 'rule';

    content['log-level'] = 'error';

    content['unified-delay'] = true;

 

    //DNS

    content.dns = {

        'enable': true,

        //'listen' : '127.0.0.1:5335', 

        'nameserver': [

            '192.168.10.1:5335'

        ],

        'default-nameserver': [

            '192.168.10.1:5335'

        ]

    };


    // 自定义 DIRECT / REJECT 条目

    //先清空 rules 以达到覆盖的效果

    content['rules'] = []; 

    [

        'IP-CIDR,192.168.0.0/16,DIRECT,no-resolve',

        'IP-CIDR,10.0.0.0/8,DIRECT,no-resolve',

        'IP-CIDR,172.16.0.0/12,DIRECT,no-resolve',

        'IP-CIDR,127.0.0.0/8,DIRECT,no-resolve',

        'IP-CIDR,100.64.0.0/10,DIRECT,no-resolve',

        'IP-CIDR6,::1/128,DIRECT,no-resolve',

        'IP-CIDR6,fc00::/7,DIRECT,no-resolve',

        'IP-CIDR6,fe80::/10,DIRECT,no-resolve',

        'IP-CIDR6,fd00::/8,DIRECT,no-resolve',

        'GEOIP,CN,DIRECT',

        'IP-CIDR,255.255.255.255/32,REJECT,no-resolve',

    ].forEach(rule => {

        content.rules.push(rule);

    });


    // 自定义走梯子的条目, 无需写尾部的后缀, 末尾带上逗号

    const customProxy = [

        'MATCH,',

    ];


    // 需要对每个 Plan 配置相应的 GroupName

    var proxyGroupName = '';


    if (name == '订阅名1.yaml') {

        proxyGroupName = 'proxy';

    } else if (name == '订阅名2') {

        proxyGroupName = '🚀 节点选择';

    } else if (name == '订阅名3') {

        proxyGroupName = '🔰国外流量';

    }

    // 还可以继续添加


    customProxy.forEach(rule => {

        content.rules.push(rule + proxyGroupName);

    });


    // Debug

    // axios.get('http://localhost:4016/openFile?path=' + yaml.stringify(content));

    return content;

}



更新:  其实 yaml 也行, 只不过它那个空格太厦碧, 我从网上东拼西凑总是报错, 下面是测试能用的. 成功的标志是, 常规 - Clash 核心( API 端口) 右边有个小芯片图标, 点开有你修改的 mixin 的内容, 而且主界面左侧会多出来一个 "服务商".  博客复制出来的代码可能还会有缩进问题, 请仔细检查, 妈的真的服了 yaml 了...

mixin:

  mixed-port: 1081

  allow-lan: true

  bind-address: '*'

  mode: rule

  log-level: error

  ipv6: false


  dns:

    enable: true

    #listen: 127.0.0.1:5335

    nameserver:

      - 192.168.10.1:5335

    default-nameserver:

      - 192.168.10.1:5335

 

  proxy-providers:

    机场1:

      type: http

      url: "填节点订阅网址, 如果是v2board的机场面板, 记得加上 &flag=clash"

      path: 机场1.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


    机场2:

      type: http

      url: "https://v2board的面板订阅/api/v1/client/subscribe?token=123&flag=clash"

      path: 机场2.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


    机场3:

      type: http

      url: "https://sspanel的面板订阅/link/123?clash=1"

      path: 机场3.yaml

      interval: 21600

      health-check:

        enable: true

        url: http://www.gstatic.com/generate_204

        interval: 300


  proxy-groups:

    - name: Proxy

      type: select

      proxies:

        - cnix  #这里填机场提供的订阅里面, 含有一堆节点的那个组名(proxy-groups底下的name, 一般在type: select的前面, 我这里是随便举例写了个cnix)

        - 代理流量

        - amy

      

    - name: cnix  #和上面对应

      type: select

      use:

        - 机场1

      

    - name: 代理流量

      type: select

      use:

        - 机场2

      

    - name: amy

      type: select

      use:

        - 机场3


  rules:

    #- 'PROCESS-NAME,clash,REJECT' #安卓上防止回环, win上没见出问题

    - 'GEOIP,PRIVATE,DIRECT'

    - 'GEOIP,CN,DIRECT'

    - 'IP-CIDR,255.255.255.255/32,REJECT,no-resolve'

    - 'MATCH,Proxy'


0 条评论: