From d9487c820875f7590efceaeecb6e06b8aedaabd8 Mon Sep 17 00:00:00 2001 From: "[redacted]" <10243554+nonPointer@users.noreply.github.com> Date: Wed, 21 Feb 2024 18:50:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E5=88=A4=E6=96=AD=EF=BC=8C=E9=81=BF=E5=85=8D=E8=AF=AF=E4=BC=A4?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9B=B8=E5=90=8C=E4=B8=AD=E8=BD=AC=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E7=9A=84=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++------ helper.py | 8 ++++---- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 9903832..0e441aa 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,12 @@ 自动拉取、过滤、合并订阅节点至自己的 Clash 配置模板。 + 筛选节点名称和地址: - * `exclusion`: 丢弃无效节点,例如名称或地址包含 `127.0.0.1`、`官网` - * `inclusion`: 筛选仅含有特定关键词的节点,例如名称或地址包含 `香港`、`IPLC` 的节点。 + * `exclusion`: 丢弃无效节点,例如名称或地址包含 `127.0.0.1`、`官网` + * `inclusion`: 筛选仅含有特定关键词的节点,例如名称或地址包含 `香港`、`IPLC` 的节点 + 拉取订阅失败时自动使用上次缓存 -* 基于域名解析地址的节点去重:丢弃域名一致、解析地址一致的节点 - - todo: 将 `(ip, port)` 替代 `(ip)` 作为去重判定,避免误伤使用相同中转入口的节点 +* 基于 `(ip, port)` 节点去重:丢弃使用相同入口 IP 和端口的重复节点 -输出的配置文件不包含模板中的注释,不影响使用。 +输出的配置文件不包含模板中的注释,不影响使用。 ## 使用场景 @@ -32,7 +31,7 @@ ] ``` -模板文件 (`template.yaml`) 是一个预置的 Clash 配置文件。使用前必须为站点创建对应的代理分组,如下方所示。程序运行后会将网站的节点 **追加** 至目标代理组的 `proxies` 列表。如果不需预置节点,列表也可以留空:`proxies: []`。 +模板文件 (`template.yaml`) 是一个预置的 Clash 配置文件。使用前必须为站点创建对应的代理分组,如下方所示。程序运行后会将网站的节点 **追加** 至目标代理组的 `proxies` 列表。如果不需预置节点,列表也可以留空。 ```yaml proxy-groups: diff --git a/helper.py b/helper.py index 7480742..ab19289 100644 --- a/helper.py +++ b/helper.py @@ -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 @@ -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: @@ -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: