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: