clash_for_windows_pkg icon indicating copy to clipboard operation
clash_for_windows_pkg copied to clipboard

分享一个parser,实现自动替换订阅规则,完全使用自己的规则,自由切换黑白名单。

Open Iridescent-me opened this issue 4 years ago • 31 comments

听说CFW TUN模式可以实现真全局代理,于是从别的代理软件转来用CFW,发现clash的规则居然是机场提供的,各个机场的规则又参差不齐,用起来始终不能顺心。 非重度用户,只想实现一个黑白名单的规则,又是强迫症,不需要订阅带的杂七杂八的一大堆策略。 修改规则的话一更新订阅就没了,研究了老半天,发现可以通过parser实现,迷迷糊糊的,反正能用! 用的是 Loyalsoldier/clash-rules 的规则集,收录的应该是很全了,而且每天更新。 复制到预处理配置(Settings-Profiles-Parsers)里,更新订阅就好,会替换整个服务商的规则,下面规则可以自由切换黑白名单,给同是小白的人参考,直接用或者根据自己的需求修改。 有三个不可选的套娃分组,如果想界面整洁一点,可以去设置里隐藏起来(Settings-Proxies-Hide Unselectable Group)

parsers: # array
  # - reg: ^.*$ 匹配所有订阅,或  - url: https://example.com/profile.yaml 指定订阅
  - reg: ^.*$
  # 删除服务商提供的策略组和规则
    code: |
      module.exports.parse = (raw, { yaml }) => {
        const rawObj = yaml.parse(raw)
        const groups = []
        const rules = []
        return yaml.stringify({ ...rawObj, 'proxy-groups': groups, rules })
      } 
  # 建立自己的配置
    yaml:
      prepend-proxy-groups: # 建立策略组
        - name: 🔯 代理模式 
          type: select
          proxies:
            - 绕过大陆丨黑名单(GFWlist) # 黑名单模式,意为「只有命中规则的网络流量,才使用代理」
            - 绕过大陆丨白名单(Whitelist) # 白名单模式,意为「没有命中规则的网络流量,统统使用代理」
            
        - name: 🔰 选择节点 
          type: select
            
        - name: 🛑 广告拦截
          type: select
          proxies:
            - DIRECT
            - REJECT
            - PROXY
            
        - name: 绕过大陆丨黑名单(GFWlist)
          type: url-test
          url: http://www.gstatic.com/generate_204
          interval: 86400
          proxies:
            - DIRECT
            
        - name: 绕过大陆丨白名单(Whitelist)
          type: url-test
          url: http://www.gstatic.com/generate_204
          interval: 86400
          proxies:
            - PROXY
            
        - name: PROXY
          type: url-test
          url: http://www.gstatic.com/generate_204
          interval: 86400
          proxies:
            - 🔰 选择节点
            
  # 策略组示例
       # - name: 分组名
         # type: select       # 手动选点   
               # url-test     # 自动选择延迟最低的节点
               # fallback     # 节点故障时自动切换下一个
               # laod-balance # 均衡使用分组内的节点
         # url: http://www.gstatic.com/generate_204 # 测试地址 非select类型分组必要
         # interval: 300 # 自动测试间隔时间,单位秒 非select类型分组必要
         # tolerance: 50 # 允许的偏差,节点之间延迟差小于该值不切换 非必要
         # proxies:  
           # - 节点名称或其他分组套娃
          
      commands:
        - proxy-groups.🔰 选择节点.proxies=[]proxyNames # 向指定策略组添加订阅中的节点名,可使用正则过滤
        - proxy-groups.🔰 选择节点.proxies.0+DIRECT # 向指定分组第一个位置添加一个 DIRECT 节点名
        
        # 一些可能用到的正则过滤节点示例,使分组更细致
        # []proxyNames|a                         # 包含a
        # []proxyNames|^(.*)(a|b)+(.*)$          # 包含a或b
        # []proxyNames|^(?=.*a)(?=.*b).*$        # 包含a和b
        # []proxyNames|^((?!b).)*a((?!b).)*$     # 包含a且不包含b
        # []proxyNames|^((?!b|c).)*a((?!b|c).)*$ # 包含a且不包含b或c
        
  # 添加规则
      prepend-rules: # 规则由上往下遍历,如上面规则已经命中,则不再往下处理
        - RULE-SET,applications,DIRECT
        - DOMAIN,clash.razord.top,DIRECT
        - DOMAIN,yacd.haishan.me,DIRECT
        - RULE-SET,private,DIRECT
        - RULE-SET,reject,🛑 广告拦截
        - RULE-SET,icloud,DIRECT #
        - RULE-SET,apple,DIRECT # 这三个为国内可直连地址,如果希望走代理改为PROXY
        - RULE-SET,google,DIRECT # 
        - RULE-SET,tld-not-cn,PROXY
        - RULE-SET,gfw,PROXY
        - RULE-SET,greatfire,PROXY
        - RULE-SET,telegramcidr,PROXY
        - RULE-SET,lancidr,DIRECT
        - RULE-SET,cncidr,DIRECT
        - GEOIP,,DIRECT
        - GEOIP,CN,DIRECT
        - RULE-SET,direct,DIRECT
        - RULE-SET,proxy,🔯 代理模式
        - MATCH,🔯 代理模式 # 规则之外的
  # 添加规则集
      mix-rule-providers: 
        reject: # 广告域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
          path: ./ruleset/reject.yaml
          interval: 86400
          
        icloud: # iCloud 域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt"
          path: ./ruleset/icloud.yaml
          interval: 86400
          
        apple: # Apple 在中国大陆可直连的域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt"
          path: ./ruleset/apple.yaml
          interval: 86400
          
        google: # Google 在中国大陆可直连的域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt"
          path: ./ruleset/google.yaml
          interval: 86400
          
        proxy: # 代理域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
          path: ./ruleset/proxy.yaml
          interval: 86400
          
        direct: # 直连域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
          path: ./ruleset/direct.yaml
          interval: 86400
          
        private: # 私有网络专用域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt"
          path: ./ruleset/private.yaml
          interval: 86400
          
        gfw: # GFWList 域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
          path: ./ruleset/gfw.yaml
          interval: 86400
          
        greatfire: # GreatFire 域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt"
          path: ./ruleset/greatfire.yaml
          interval: 86400
          
        tld-not-cn: # 非中国大陆使用的顶级域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt"
          path: ./ruleset/tld-not-cn.yaml
          interval: 86400
          
        telegramcidr: # Telegram 使用的 IP 地址列表
          type: http
          behavior: ipcidr
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt"
          path: ./ruleset/telegramcidr.yaml
          interval: 86400
          
        cncidr: # 中国大陆 IP 地址列表
          type: http
          behavior: ipcidr
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
          path: ./ruleset/cncidr.yaml
          interval: 86400
          
        lancidr: # 局域网 IP 及保留 IP 地址列表
          type: http
          behavior: ipcidr
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt"
          path: ./ruleset/lancidr.yaml
          interval: 86400
          
        applications: # 需要直连的常见软件列表
          type: http
          behavior: classical
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt"
          path: ./ruleset/applications.yaml
          interval: 86400

1

Iridescent-me avatar Sep 03 '21 03:09 Iridescent-me

需要下载的文件太多,连接失败了。这个确实是更好的自己用的rules。

zakizou avatar Jan 06 '22 09:01 zakizou

image

zakizou avatar Jan 06 '22 09:01 zakizou

这个没有自动选择节点。自己添加一个自动切换最快节点更好。这个黑名单和白名单,是先走这两个规则之后再走选择的节点线路吗

flymec avatar Jan 10 '22 02:01 flymec

这个没有自动选择节点。自己添加一个自动切换最快节点更好。这个黑名单和白名单,是先走这两个规则之后再走选择的节点线路吗

需要根据自己的情况再处理,预处理配置可以只添加规则,不修改分类这些,也挺好用,

zakizou avatar Jan 10 '22 09:01 zakizou

我也有一个:Clash_configuration,包含自动分组和自动签到功能

我看了你的订阅文件,纯小白,那个”所有订阅链接请先转化为后端为localhost的subconverter链接“是什么意思?为什么我按照你的步骤做了parsers文件是这样的 image

cyclonemd avatar Feb 07 '22 16:02 cyclonemd

需要,试试

guoguo6510 avatar Feb 09 '22 10:02 guoguo6510

简直是神器啊,太有用了,感谢!

zicai1026 avatar Mar 02 '22 10:03 zicai1026

请问hosts能写在parsers不

vip110880 avatar Mar 03 '22 06:03 vip110880

请问hosts能写在parsers不

已经找到了: image

vip110880 avatar Mar 03 '22 07:03 vip110880

请问hosts能写在parsers不

已经找到了: image

我觉得这种写在mixin更合适

zicai1026 avatar Mar 03 '22 07:03 zicai1026

请问hosts能写在parsers不

已经找到了: image

我觉得这种写在mixin更合适

刚用clash,小白一个,但是这样操作我的需求已经满足了

vip110880 avatar Mar 03 '22 07:03 vip110880

请教一下 如何在你这个规则里新增某个域名走代理呢?就是单独添加个域名该域名下所有链接走代理。。。

simcatSL avatar Apr 05 '22 23:04 simcatSL

请教一下 如何在你这个规则里新增某个域名走代理呢?就是单独添加个域名该域名下所有链接走代理。。。

parsers:

  • url: yaml: prepend-rules: - DOMAIN-KEYWORD,domain,Proxies

horryruo avatar Apr 06 '22 02:04 horryruo

谢谢分享!有用

amiglistimo avatar May 23 '22 17:05 amiglistimo

听说CFW TUN模式可以实现真全局代理,于是从别的代理软件转来用CFW,发现clash的规则居然是机场提供的,各个机场的规则又参差不齐,用起来始终不能顺心。 非重度用户,只想实现一个黑白名单的规则,又是强迫症,不需要订阅带的杂七杂八的一大堆策略。 修改规则的话一更新订阅就没了,研究了老半天,发现可以通过parser实现,迷迷糊糊的,反正能用! 用的是 Loyalsoldier/clash-rules 的规则集,收录的应该是很全了,而且每天更新。 复制到预处理配置(Settings-Profiles-Parsers)里,更新订阅就好,会替换整个服务商的规则,下面规则可以自由切换黑白名单,给同是小白的人参考,直接用或者根据自己的需求修改。 有三个不可选的套娃分组,如果想界面整洁一点,可以去设置里隐藏起来(Settings-Proxies-Hide Unselectable Group)

parsers: # array
  # - reg: ^.*$ 匹配所有订阅,或  - url: https://example.com/profile.yaml 指定订阅
  - reg: ^.*$
  # 删除服务商提供的策略组和规则
    code: |
      module.exports.parse = (raw, { yaml }) => {
        const rawObj = yaml.parse(raw)
        const groups = []
        const rules = []
        return yaml.stringify({ ...rawObj, 'proxy-groups': groups, rules })
      } 
  # 建立自己的配置
    yaml:
      prepend-proxy-groups: # 建立策略组
        - name: 🔯 代理模式 
          type: select
          proxies:
            - 绕过大陆丨黑名单(GFWlist) # 黑名单模式,意为「只有命中规则的网络流量,才使用代理」
            - 绕过大陆丨白名单(Whitelist) # 白名单模式,意为「没有命中规则的网络流量,统统使用代理」
            
        - name: 🔰 选择节点 
          type: select
            
        - name: 🛑 广告拦截
          type: select
          proxies:
            - DIRECT
            - REJECT
            - PROXY
            
        - name: 绕过大陆丨黑名单(GFWlist)
          type: url-test
          url: http://www.gstatic.com/generate_204
          interval: 86400
          proxies:
            - DIRECT
            
        - name: 绕过大陆丨白名单(Whitelist)
          type: url-test
          url: http://www.gstatic.com/generate_204
          interval: 86400
          proxies:
            - PROXY
            
        - name: PROXY
          type: url-test
          url: http://www.gstatic.com/generate_204
          interval: 86400
          proxies:
            - 🔰 选择节点
            
  # 策略组示例
       # - name: 分组名
         # type: select       # 手动选点   
               # url-test     # 自动选择延迟最低的节点
               # fallback     # 节点故障时自动切换下一个
               # laod-balance # 均衡使用分组内的节点
         # url: http://www.gstatic.com/generate_204 # 测试地址 非select类型分组必要
         # interval: 300 # 自动测试间隔时间,单位秒 非select类型分组必要
         # tolerance: 50 # 允许的偏差,节点之间延迟差小于该值不切换 非必要
         # proxies:  
           # - 节点名称或其他分组套娃
          
      commands:
        - proxy-groups.🔰 选择节点.proxies=[]proxyNames # 向指定策略组添加订阅中的节点名,可使用正则过滤
        - proxy-groups.🔰 选择节点.proxies.0+DIRECT # 向指定分组第一个位置添加一个 DIRECT 节点名
        
        # 一些可能用到的正则过滤节点示例,使分组更细致
        # []proxyNames|a                         # 包含a
        # []proxyNames|^(.*)(a|b)+(.*)$          # 包含a或b
        # []proxyNames|^(?=.*a)(?=.*b).*$        # 包含a和b
        # []proxyNames|^((?!b).)*a((?!b).)*$     # 包含a且不包含b
        # []proxyNames|^((?!b|c).)*a((?!b|c).)*$ # 包含a且不包含b或c
        
  # 添加规则
      prepend-rules: # 规则由上往下遍历,如上面规则已经命中,则不再往下处理
        - RULE-SET,applications,DIRECT
        - DOMAIN,clash.razord.top,DIRECT
        - DOMAIN,yacd.haishan.me,DIRECT
        - RULE-SET,private,DIRECT
        - RULE-SET,reject,🛑 广告拦截
        - RULE-SET,icloud,DIRECT #
        - RULE-SET,apple,DIRECT # 这三个为国内可直连地址,如果希望走代理改为PROXY
        - RULE-SET,google,DIRECT # 
        - RULE-SET,tld-not-cn,PROXY
        - RULE-SET,gfw,PROXY
        - RULE-SET,greatfire,PROXY
        - RULE-SET,telegramcidr,PROXY
        - RULE-SET,lancidr,DIRECT
        - RULE-SET,cncidr,DIRECT
        - GEOIP,,DIRECT
        - GEOIP,CN,DIRECT
        - RULE-SET,direct,DIRECT
        - RULE-SET,proxy,🔯 代理模式
        - MATCH,🔯 代理模式 # 规则之外的
  # 添加规则集
      mix-rule-providers: 
        reject: # 广告域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/reject.txt"
          path: ./ruleset/reject.yaml
          interval: 86400
          
        icloud: # iCloud 域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/icloud.txt"
          path: ./ruleset/icloud.yaml
          interval: 86400
          
        apple: # Apple 在中国大陆可直连的域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/apple.txt"
          path: ./ruleset/apple.yaml
          interval: 86400
          
        google: # Google 在中国大陆可直连的域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/google.txt"
          path: ./ruleset/google.yaml
          interval: 86400
          
        proxy: # 代理域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/proxy.txt"
          path: ./ruleset/proxy.yaml
          interval: 86400
          
        direct: # 直连域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/direct.txt"
          path: ./ruleset/direct.yaml
          interval: 86400
          
        private: # 私有网络专用域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/private.txt"
          path: ./ruleset/private.yaml
          interval: 86400
          
        gfw: # GFWList 域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/gfw.txt"
          path: ./ruleset/gfw.yaml
          interval: 86400
          
        greatfire: # GreatFire 域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/greatfire.txt"
          path: ./ruleset/greatfire.yaml
          interval: 86400
          
        tld-not-cn: # 非中国大陆使用的顶级域名列表
          type: http
          behavior: domain
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/tld-not-cn.txt"
          path: ./ruleset/tld-not-cn.yaml
          interval: 86400
          
        telegramcidr: # Telegram 使用的 IP 地址列表
          type: http
          behavior: ipcidr
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/telegramcidr.txt"
          path: ./ruleset/telegramcidr.yaml
          interval: 86400
          
        cncidr: # 中国大陆 IP 地址列表
          type: http
          behavior: ipcidr
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/cncidr.txt"
          path: ./ruleset/cncidr.yaml
          interval: 86400
          
        lancidr: # 局域网 IP 及保留 IP 地址列表
          type: http
          behavior: ipcidr
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/lancidr.txt"
          path: ./ruleset/lancidr.yaml
          interval: 86400
          
        applications: # 需要直连的常见软件列表
          type: http
          behavior: classical
          url: "https://cdn.jsdelivr.net/gh/Loyalsoldier/clash-rules@release/applications.txt"
          path: ./ruleset/applications.yaml
          interval: 86400

1

谢谢楼主的分享,楼主我有使用过程,有个问题困扰着我,reject.yaml、icloud.yaml。。。等14个规则文件,每次更新订阅时,PARSER不能从在线地址下载最新的规则文件,用的一直是第一次下载的???请问如何解决??

bergy010 avatar May 25 '22 17:05 bergy010

@bergy010

刚好我也有这个疑问,查了下,interval:86400 这个应该就是更新间隔,单位估计是秒,刚好是一天的时间。

但好像本地文件没有每天更新,这个不知道为啥没生效。。

ffplayer avatar May 27 '22 07:05 ffplayer

#2368 “provider更新时,如果内容无变化,不会更改文件,则修改日期不变,表现为更新日期较早。并不是不检查更新。”

Super-Zoe avatar Jul 23 '22 13:07 Super-Zoe

找遍全网,楼主nb

TimeJason avatar Aug 09 '22 07:08 TimeJason

楼主厉害!

yifai avatar Aug 19 '22 00:08 yifai

image

同样出现这样的情况,这是为什么呀?

08spider avatar Aug 27 '22 15:08 08spider

image

同样出现这样的情况,这是为什么呀?

jsdelivr在国内不能用了,换个镜像吧

zicai1026 avatar Aug 29 '22 06:08 zicai1026

怎么增加一个指定节点的新项,我用Paypal想指定节点,其余代理随意。

yifai avatar Sep 02 '22 07:09 yifai

遇到个问题,如果某一个订阅里的匹配的策略是空的节点则会报错【proxy groupl2] : use or proxies missing】,虽然可以删除那个策略或者手动添加一个DIRECT,但是另一个订阅里这个策略是有节点的,如果是url-test、fallback、laod-balance这几个类型的策略在有节点的时候再添加了一个DIRECT进去就有很大几率会自动选择到DIRECT。请问如和在匹配到空组的时候默认添加一个DIRECT或者干脆自动删除这个策略呢?不知道有没有大佬知道如何解决!

lrs95 avatar Sep 07 '22 15:09 lrs95

由于google翻译从中国撤退,而且chrome浏览器将google翻译作为独立线程,不走chrome的代理,而gstatic.com是楼主设置中用来判断走国内还是国外关键,需要将这个测试网址标记为DIRECT:

添加规则

  prepend-rules: # 规则由上往下遍历,如上面规则已经命中,则不再往下处理
    - DOMAIN,gstatic.com,DIRECT
    - RULE-SET,applications,DIRECT
    - DOMAIN,clash.razord.top,DIRECT
    - DOMAIN,yacd.haishan.me,DIRECT
    - RULE-SET,private,DIRECT
    - RULE-SET,reject,🛑 广告拦截
    - RULE-SET,icloud,DIRECT #
    - RULE-SET,apple,DIRECT # 这三个为国内可直连地址,如果希望走代理改为PROXY
    - RULE-SET,google,PROXY # 

其中google改为走PROXY,这样开启tun模式以后,谷歌chrome浏览器中的谷歌翻译能通过代理完成翻译功能。

banq avatar Oct 04 '22 03:10 banq