Skip to content

Commit

Permalink
feat: 修复去重判断,避免误伤使用相同中转入口的节点
Browse files Browse the repository at this point in the history
  • Loading branch information
nonPointer authored Feb 21, 2024
1 parent 4e6991d commit d9487c8
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 10 deletions.
11 changes: 5 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,12 @@
自动拉取、过滤、合并订阅节点至自己的 Clash 配置模板。

+ 筛选节点名称和地址:
* `exclusion`: <mark>丢弃无效节点</mark>,例如名称或地址包含 `127.0.0.1``官网`
* `inclusion`: <mark>筛选仅含有特定关键词的节点</mark>,例如名称或地址包含 `香港``IPLC` 的节点
* `exclusion`: 丢弃无效节点,例如名称或地址包含 `127.0.0.1``官网`
* `inclusion`: 筛选仅含有特定关键词的节点,例如名称或地址包含 `香港``IPLC` 的节点
+ 拉取订阅失败时自动使用上次缓存
* 基于域名解析地址的节点去重:<mark>丢弃域名一致、解析地址一致的节点</mark>
- todo: 将 `(ip, port)` 替代 `(ip)` 作为去重判定,避免误伤使用相同中转入口的节点
* 基于 `(ip, port)` 节点去重:丢弃使用相同入口 IP 和端口的重复节点

<mark>输出的配置文件不包含模板中的注释,不影响使用。</mark>
输出的配置文件不包含模板中的注释,不影响使用。

## 使用场景

Expand All @@ -32,7 +31,7 @@
]
```

模板文件 (`template.yaml`) 是一个预置的 Clash 配置文件。使用前必须为站点创建对应的代理分组,如下方所示。程序运行后会将网站的节点 **追加** 至目标代理组的 `proxies` 列表。如果不需预置节点,列表也可以留空`proxies: []`
模板文件 (`template.yaml`) 是一个预置的 Clash 配置文件。使用前必须为站点创建对应的代理分组,如下方所示。程序运行后会将网站的节点 **追加** 至目标代理组的 `proxies` 列表。如果不需预置节点,列表也可以留空。

```yaml
proxy-groups:
Expand Down
8 changes: 4 additions & 4 deletions helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, name: str, group: str, url: str, inclusion: list, exclusion:

try:
headers = {
"User-Agent": "ClashForAndroid/2.4.14", # V2board 根据 UA 下发配置
"User-Agent": "ClashForAndroid/2.5.12", # V2board 根据 UA 下发配置
}
r = requests.get(url, headers=headers)
assert r.status_code == 200
Expand All @@ -50,7 +50,6 @@ def __init__(self, name: str, group: str, url: str, inclusion: list, exclusion:
def purge(self):
self.nodes = self.data['proxies']
nodes_good = []

# blacklist keywords
for node in self.nodes:
for k in self.exclusion:
Expand All @@ -73,12 +72,13 @@ def purge(self):
for node in nodes_good:
try:
ip = socket.getaddrinfo(node['server'], None)[0][4][0]
if ip in used:
p = (ip, node['port'])
if p in used:
self.log("Drop: {}, dup!".format(node['name']))
nodes_good.remove(node)
else:
site.log("Take: {}".format(node['name']))
used.add(ip)
used.add(p)
except:
self.log(f"Failed to resolve node {node['name']}: {node['server']}")
else:
Expand Down

0 comments on commit d9487c8

Please sign in to comment.