proxies中节点重复
#5 · closed · 8 comments
View on GitHub ↗
比如下面的筛选规则
生成的proxies依次是:hk,sgp,jp,us,hk,sgp,jp,us
预期结果应该是hk,sgp,jp,us
没有代码基础,不知道哪里出问题了,问chatgpt也没给我解决(保持文本顺序也是问的它,有用😅)
另外,一个group使用多个订阅链接来筛选,可以在一个url中识别多个连接吗?就是url: "url1", "url2"这种,现在只能识别第一个链接,需要为第二个链接再写一个筛选规则
```
[
{
name: "mySite", # 网站名称,仅用于日志输出
group: "国外媒体", # 目标 proxy-groups 的代理组名
url: "url1", # Clash 配置文件的订阅 URL
exclusion: ["127.0.0.1", "1.1.1.1", "官网", "IPv6", "测试"], # 节点名称或地址包含这些关键词的节点会被丢弃
inclusion: ["hk"], # 仅采纳包含这些关键词的节点
dedup: True # 是否基于节点入口 IP 地址进行去重
},
{
name: "mySite", # 网站名称,仅用于日志输出
group: "谷歌服务", # 目标 proxy-groups 的代理组名
url: "url1", # Clash 配置文件的订阅 URL
exclusion: ["127.0.0.1", "1.1.1.1", "官网", "IPv6", "测试"], # 节点名称或地址包含这些关键词的节点会被丢弃
inclusion: ["sgp","jp","us"], # 仅采纳包含这些关键词的节点
dedup: True # 是否基于节点入口 IP 地址进行去重
},
{
name: "mySite", # 网站名称,仅用于日志输出
group: "自动测速", # 目标 proxy-groups 的代理组名
url: "url1", # Clash 配置文件的订阅 URL
exclusion: ["127.0.0.1", "1.1.1.1", "官网", "IPv6", "测试"], # 节点名称或地址包含这些关键词的节点会被丢弃
inclusion: ["hk","sgp","jp","us"], # 仅采纳包含这些关键词的节点
dedup: True # 是否基于节点入口 IP 地址进行去重
},
]
```
Comments
> 生成的proxies依次是:hk,sgp,jp,us,hk,sgp,jp,us
> 预期结果应该是hk,sgp,jp,us
这个预期结果是错误的。节点命名有用 flag emoji 的,有用英文缩写,有用 IATA code,还有用中文的。即使是不同落地 IP 的节点,也可以使用相同入口的中转。技术上可以使用 Cloudflare `cdn-cgi` 或者 `ip.sb` 的接口来判断 region,但是没有必要。
这个项目只是手动实现了 Clash 的 `proxy-providers` 的功能,并加入了节点过滤和去重。筛选规则是针对每个订阅链接的,所以你应该为每个链接写一个 `{}` object,而不是将 URL 塞到一起。
我说的更具体一点,
假设我有一个订阅节点链接是url1,这个订阅链接只有5个节点如下:hk1、hk2、sgp1、jp1、us1,用上面的规则过滤之后,proxies中的节点依次如下:hk1、hk2、sgp1、jp1、us1、hk1、hk2、sgp1、jp1、us1。
就是说如果第三个规则取用的节点在第一个规则中已经取用过了,也不会被丢掉。
结果就是clash无法切换到这个配置,说xxx节点是一个重复的名字。
我觉得应该分两步,先执行全部的过滤规则,每个规则取用的节点添加到对应的group中,同时把每个过滤规则取用的节点都临时保存到一起,等所有过滤规则都执行完毕之后,再对这个临时列表进行去重处理,然后添加到proxies中。
项目的原始目的是将不同机场的节点塞到对应机场名的分组,手动将流媒体指向贵(节点优质)的分组,上网走便宜的分组。因此一个订阅链接只应对应一个 `{}` object。不要想复杂了。
对于你这个需求也很好解决:给 [L124](https://github.com/nonPointer/ClashHelper/blob/c70265b20dddddc81efcb90f713ada29234a2719/helper.py#L124) 对相同节点名的节点去重即可。
好的,就是我不会写代码,能帮忙写个去重吗?😅
试试新版本
可以了,非常感谢!可以把我提的那个保持文本顺序的PR合并吗?目前会打乱template.yaml的顺序,变成按字母排序了

想了下还是不 merge 吧,你可以将自己的 fork 改成 ruamel 自用。
yaml 是 Python 内置库,ruamel 得从 pip 下。没必要为这个 list 保序而引入一个第三方库,这不会影响 Clash 客户端的行为。
好的