first commit

This commit is contained in:
jack
2025-11-12 15:56:25 +08:00
commit 2c0019254d
108 changed files with 51129 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# -*- coding: utf-8 -*-
+58
View File
@@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
import os
import yaml
# 读取当前路径
current_path = os.getcwd()
# 新文件夹名称
new_folder_name = "clash_each_node"
# 新文件夹的完整路径
new_folder_path = os.path.join(current_path, new_folder_name)
# 检查文件夹是否存在,如果不存在则创建
if not os.path.exists(new_folder_path):
os.makedirs(new_folder_path)
config_path = os.path.join(current_path, "merge.yaml")
with open(config_path, 'r', encoding='utf-8') as file:
data = yaml.safe_load(file)
if not data:
print(f"Error reading {config_path}")
exit(1)
config_name_serial_start = 1
port_start = 7890
for proxy in data['proxies']:
if '剩余流量' in proxy['name']:
continue
if '套餐到期' in proxy['name']:
continue
config_template = {
"mixed-port": port_start,
"allow-lan": True,
"bind-address": "*",
"mode": "rule",
"log-level": "info",
"external-controller": "0.0.0.0:9090",
"secret": "",
"dns": {
"enable": False,
"ipv6": False,
"nameserver": [],
"fallback": []
},
"proxies": [proxy],
"proxy-groups": [{'name': 'single node', 'type': 'select', 'proxies': [proxy['name']]}],
}
config_name = f"config{str(config_name_serial_start)}.yaml"
save_path = os.path.join(new_folder_path, config_name)
with open(save_path, 'w', encoding='utf-8') as file:
yaml.dump(config_template, file, allow_unicode=True, default_flow_style=False)
config_name_serial_start += 1
# port_start += 1
File diff suppressed because it is too large Load Diff
+143
View File
@@ -0,0 +1,143 @@
proxies:
- {"name":"剩余流量:76.66 GB","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12001,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"套餐到期:长期有效","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12001,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇭🇰 香港 01","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12001,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇭🇰 香港 02","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12002,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇭🇰 香港 03","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12003,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇭🇰 香港 04","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12004,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇭🇰 香港 05","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12005,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇭🇰 香港 06","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12006,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇲🇴 澳门 01","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12007,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇨🇳 台湾 01","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12011,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇨🇳 台湾 02","type":"trojan","server":"cn1.cdn.xfltd-cdn.top","port":12012,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇸🇬 新加坡 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12021,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇸🇬 新加坡 02","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12022,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇸🇬 新加坡 03","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12023,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇸🇬 新加坡 04","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12024,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇸🇬 新加坡 05","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12025,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇯🇵 日本 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12031,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇯🇵 日本 02","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12032,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇯🇵 日本 03","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12033,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇯🇵 日本 04","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12034,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇯🇵 日本 05","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12035,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇺🇸 美国 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12051,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇺🇸 美国 02","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12052,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇺🇸 美国 03","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12053,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇺🇸 美国 04","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12054,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇵🇰 巴基斯坦 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12077,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇰🇷 韩国 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12041,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇮🇩 印尼 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12061,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇮🇹 意大利 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12062,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇹🇷 土耳其 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12064,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇫🇷 法国 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12065,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇦🇷 阿根廷 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12066,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇲🇾 马来西亚 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12067,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇦🇺 澳大利亚 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12068,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇬🇧 英国 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12069,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇩🇪 德国 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12070,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇸🇪 瑞典 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12071,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇮🇳 印度 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12072,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇳🇬 尼日利亚 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12073,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇳🇱 荷兰 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12074,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇷🇺 俄罗斯 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12075,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"🇹🇭 泰国 01","type":"trojan","server":"cn2.cdn.xfltd-cdn.top","port":12076,"password":"d058a1cb-5dbd-4664-9d8b-ae26bc699ed4","udp":true,"sni":"cdn.alibaba.com","skip-cert-verify":true}
- {"name":"DE-Detour 01 AEAD","type":"vmess","server":"de-detour-01.grabgo.pro","port":15801,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"DE-Detour 02 AEAD","type":"vmess","server":"de-detour-02.grabgo.pro","port":15802,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"DE-Detour-03 AEAD","type":"vmess","server":"de-detour-03.grabgo.pro","port":15803,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 01 AEAD","type":"vmess","server":"hkt-detour-01.grabgo.pro","port":15101,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 02 AEAD","type":"vmess","server":"hkt-detour-02.grabgo.pro","port":15102,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 05 AEAD","type":"vmess","server":"hkt-detour-05.grabgo.pro","port":15105,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 06 AEAD","type":"vmess","server":"hkt-detour-06.grabgo.pro","port":15106,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 09 AEAD","type":"vmess","server":"hkt-detour-09.grabgo.pro","port":15109,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 10 AEAD","type":"vmess","server":"hkt-detour-10.grabgo.pro","port":15110,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 11 AEAD","type":"vmess","server":"hkt-detour-11.grabgo.pro","port":15111,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 12 AEAD","type":"vmess","server":"hkt-detour-12.grabgo.pro","port":15112,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 13 AEAD","type":"vmess","server":"hkt-detour-13.grabgo.pro","port":15113,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 14 AEAD","type":"vmess","server":"hkt-detour-14.grabgo.pro","port":15114,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 17 AEAD","type":"vmess","server":"hkt-detour-17.grabgo.pro","port":15117,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 18 AEAD","type":"vmess","server":"hkt-detour-18.grabgo.pro","port":15118,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 19 AEAD","type":"vmess","server":"hkt-detour-19.grabgo.pro","port":15119,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 20 AEAD","type":"vmess","server":"hkt-detour-20.grabgo.pro","port":15120,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 21 AEAD","type":"vmess","server":"hkt-detour-21.grabgo.pro","port":15131,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"HKT-Detour 23 AEAD","type":"vmess","server":"hkt-detour-23.grabgo.pro","port":15133,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"JP-Detour 01 AEAD","type":"vmess","server":"jp-01.grabgo.pro","port":15601,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"JP-Detour 02 AEAD","type":"vmess","server":"jp-02.grabgo.pro","port":15602,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"JP-Detour 03 AEAD","type":"vmess","server":"jp-03.grabgo.pro","port":15603,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"JP-Detour 04 AEAD","type":"vmess","server":"jp-04.grabgo.pro","port":15604,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"JP-Detour 05 AEAD","type":"vmess","server":"jp-05.grabgo.pro","port":15605,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"JP-Detour 06 AEAD","type":"vmess","server":"jp-06.grabgo.pro","port":15606,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"LA-Detour 02 AEAD","type":"vmess","server":"la-detour-02.grabgo.pro","port":15502,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"LA-Detour 03 AEAD","type":"vmess","server":"la-detour-03.grabgo.pro","port":15503,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"LA-Detour 05 AEAD","type":"vmess","server":"la-detour-05.grabgo.pro","port":15505,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"LA-Detour 07 AEAD","type":"vmess","server":"la-detour-07.grabgo.pro","port":15507,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"LA-Detour 09 AEAD","type":"vmess","server":"la-detour-09.grabgo.pro","port":15509,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"LA-Detour 10 AEAD","type":"vmess","server":"la-detour-10.grabgo.pro","port":15510,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"Oz-Detour 01 AEAD","type":"vmess","server":"oz-detour-01.grabgo.pro","port":15811,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"Oz-Detour 02 AEAD","type":"vmess","server":"oz-detour-02.grabgo.pro","port":15812,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"SG-Detour 01 AEAD","type":"vmess","server":"sg-detour-01.grabgo.pro","port":15301,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"SG-Detour 02 AEAD","type":"vmess","server":"sg-detour-02.grabgo.pro","port":15302,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"SG-Detour 03 AEAD","type":"vmess","server":"sg-detour-03.grabgo.pro","port":15303,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 01 AEAD","type":"vmess","server":"tw-detour-01.grabgo.pro","port":15201,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 02 AEAD","type":"vmess","server":"tw-detour-02.grabgo.pro","port":15202,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 03 AEAD","type":"vmess","server":"tw-detour-03.grabgo.pro","port":15203,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 05 AEAD","type":"vmess","server":"tw-detour-05.grabgo.pro","port":15205,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 06 AEAD","type":"vmess","server":"tw-detour-06.grabgo.pro","port":15206,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 08 AEAD","type":"vmess","server":"tw-detour-08.grabgo.pro","port":15208,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 09 AEAD","type":"vmess","server":"tw-detour-09.grabgo.pro","port":15209,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 10 AEAD","type":"vmess","server":"tw-detour-10.grabgo.pro","port":15210,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 12 AEAD","type":"vmess","server":"tw-detour-12.grabgo.pro","port":15212,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 13 AEAD","type":"vmess","server":"tw-detour-13.grabgo.pro","port":15213,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 15 AEAD","type":"vmess","server":"tw-detour-15.grabgo.pro","port":15215,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 16 AEAD","type":"vmess","server":"tw-detour-16.grabgo.pro","port":15216,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 18 AEAD","type":"vmess","server":"tw-detour-18.grabgo.pro","port":15218,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 19 AEAD","type":"vmess","server":"tw-detour-19.grabgo.pro","port":15219,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 20 AEAD","type":"vmess","server":"tw-detour-20.grabgo.pro","port":15220,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 22 AEAD","type":"vmess","server":"tw-detour-22.grabgo.pro","port":15222,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"TW-Detour 23 AEAD","type":"vmess","server":"tw-detour-23.grabgo.pro","port":15223,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"UK Detour-01 AEAD","type":"vmess","server":"uk-detour-01.grabgo.pro","port":15711,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"UK Detour-02 AEAD","type":"vmess","server":"uk-detour-02.grabgo.pro","port":15712,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"UK Detour-03 AEAD","type":"vmess","server":"uk-detour-03.grabgo.pro","port":15713,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"UK Detour-04 AEAD","type":"vmess","server":"uk-detour-04.grabgo.pro","port":15714,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"UK Detour-05 AEAD","type":"vmess","server":"uk-detour-05.grabgo.pro","port":15715,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"UK Detour-06 AEAD","type":"vmess","server":"uk-detour-06.grabgo.pro","port":15716,"uuid":"22a14509-a8ab-46cb-bb26-d47d4d18e1d6","alterId":0,"cipher":"auto","ws-path":"/"}
- {"name":"🇭🇰 香港-广东专线 BGP 1","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32443,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 BGP 2","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32445,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 Akari","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32037,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 NeaRoute","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32029,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 HKBN","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32000,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 HGC","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32042,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 HKT","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32033,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇭🇰 香港-广东专线 GCore","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32027,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇺🇸 美国-广东专线 BGP 1","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32001,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇺🇸 美国-广东专线 BGP 2","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32028,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇺🇸 美国-广东专线 DAOport","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32031,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇺🇸 美国-广东专线 GCore","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32021,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇹🇼 台湾-广东专线 NeaRoute","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32003,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇹🇼 台湾-广东专线 STUIX","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32040,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇯🇵 日本-广东专线 BGP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32004,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇯🇵 日本-广东专线 Akari","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32036,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇯🇵 日本-广东专线 GCore","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32022,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇰🇷 韩国-广东专线 VUKR","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32005,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇸🇬 新加坡-广东专线 BGP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32007,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇷🇺 俄罗斯-广东专线 PQ","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32008,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇫🇷 法国-广东专线 BGP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32009,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇬🇧 英国-广东专线 BGP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32010,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇨🇦 加拿大-广东专线 BGP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32039,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇩🇪 德国-广东专线 BGP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32011,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇦🇺 澳大利亚-广东专线 VUAU","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32012,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇦🇺 澳大利亚-广东专线 GCore","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32023,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇲🇾 马来西亚-广东专线 Shin","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32038,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇵🇭 菲律宾-广东专线 Zenlayer","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32013,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇵🇭 菲律宾-广东专线 Comfac","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32030,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇹🇭 泰国-广东专线 Bangmod","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32043,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇹🇷 土耳其-广东专线 Kapteyan","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32014,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇹🇷 土耳其-广东专线 GCore","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32026,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇦🇷 阿根廷-广东专线 DonWeb","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32015,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇳🇬 尼日利亚-广东专线 Melbicom","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32034,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇺🇦 乌克兰-广东专线 Vik","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32019,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇧🇷 巴西-广东专线 GCore 1","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32016,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇧🇷 巴西-广东专线 GCore 2","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32025,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇮🇳 印度-广东专线 DOIN","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32017,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇮🇳 印度-广东专线 GCore","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32024,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇸🇦 沙特-广东专线 STC","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32035,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
- {"name":"🇦🇶 南极-广东专线 WARP","password":"f2e8e50c-ffb8-48a1-a460-2e72dfaf7845","port":32041,"server":"lbso.bnnodeservice.com","sni":"cert.bitbyte.one","type":"trojan","udp":true}
+69
View File
@@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
import os
import yaml
# 无分组版本, 需要
# 读取的 yaml 的文件名
file_name = 'merge.yaml'
# 创建 config.yaml 模版, 读出来的 proxies 和 proxy-groups 存到对应的地方, rules 不要了
config_template = {
"mixed-port": 7890,
"allow-lan": True,
"bind-address": "*",
"mode": "rule",
"log-level": "info",
"external-controller": "0.0.0.0:9090",
"secret": "",
"dns": {
"enable": False,
"ipv6": False,
"nameserver": [],
"fallback": []
},
"proxies": [],
"proxy-groups": [],
}
def process_yaml_file():
temp_data = []
data = None
with open(file_name, 'r', encoding='utf-8') as file:
data = yaml.safe_load(file)
if not data:
print(f"Error reading {file_name}")
return
proxies = data['proxies']
for proxy in proxies:
if '剩余流量' in proxy['name']:
continue
if '套餐到期' in proxy['name']:
continue
print('{}: {}'.format(file_name, proxy['name']))
temp_data.append(proxy)
sorted_proxies = sorted(temp_data, key=lambda x: x['name'] if 'name' in x else '')
if temp_data:
config_template['proxies'] = sorted_proxies
# 创建 proxy-groups 中的 select 组,包含所有 proxies
select_group = {
"name": "GLOBAL",
"type": "select",
"proxies": [proxy['name'] for proxy in sorted_proxies]
}
config_template['proxy-groups'].append(select_group)
if __name__ == '__main__':
process_yaml_file()
with open(f'config.yaml', 'w', encoding='utf-8') as file:
yaml.dump(config_template, file, allow_unicode=True, default_flow_style=False)
print('done!')
@@ -0,0 +1,168 @@
# -*- coding: utf-8 -*-
'''
切换到随机代理
'''
import random
import httpx
import time
import logging
import subprocess
from typing import Optional, List
logging.basicConfig(level=logging.INFO)
BASE_URL = "http://192.168.31.201"
PORT_LIST = [
["58001", "59001"],
["58002", "59002"],
["58003", "59003"],
["58004", "59004"],
["58005", "59005"],
["58006", "59006"],
["58007", "59007"],
["58008", "59008"],
["58009", "59009"],
["58010", "59010"],
]
class ClashProxyManager:
def __init__(self, base_url, base_port):
self.key_group = 0
self.base_url = base_url
self.base_port = base_port
self.all_proxies = []
def get_all_proxies(self, clash_tool_url: str) -> List[str]:
url = f"{clash_tool_url}/api/proxies"
try:
response = httpx.get(url)
response.raise_for_status()
proxies = response.json()
logging.info("Available proxies:")
# 输出读取的所有代理信息
# for proxy_name, proxy_info in proxies['proxies'].items():
# logging.info(f"Name: {proxy_name}, Type: {proxy_info.get('type', 'Unknown')}")
proxy_list = list(proxies['proxies'].keys())
filtered_list = [item for item in proxy_list if item not in {'REJECT', 'GLOBAL', 'DIRECT'}]
return filtered_list
except Exception as e:
logging.error(f"Failed to get proxies: {e}")
return []
def switch_proxy(self, proxy_name: str, url_and_port: str) -> None:
logging.info("switch proxy")
url = f"{url_and_port}/api/proxies/GLOBAL"
data = {"name": proxy_name}
try:
response = httpx.put(url, json=data)
if response.status_code == 204:
logging.info(f"Switched to proxy: {proxy_name}")
else:
logging.error(f"Failed to switch proxy: {response.status_code} - {proxy_name}")
except Exception as e:
logging.error(f"Failed to switch proxy: {e}")
def update_configs(self):
for base_port in self.base_port:
url_and_port = self.base_url + ":" + base_port[0]
key = "/api/configs"
url = url_and_port + key
headers = {
"accept": "application/json, text/plain, */*",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "zh-CN,zh",
"connection": "keep-alive",
"content-type": "application/json",
"origin": url_and_port,
"referer": url_and_port,
"sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"macOS"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"sec-gpc": "1",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
}
# 请求体数据
data = {"mode": "Global"} # 替换为实际的请求数据
# 使用 httpx 发送 PATCH 请求
try:
with httpx.Client() as client:
response = client.patch(url, headers=headers, json=data)
if response.status_code == 204:
print(f"{url} OK")
else:
print("响应内容:", response.text)
except httpx.RequestError as exc:
print(f"请求失败: {exc}")
def check_proxy(self, proxy_url):
# proxy_url: 代理地址, 没有密码
# 测试目标地址:
command = ["curl", "-x", proxy_url, "ip.sb"]
# 执行命令并获取输出
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
# 打印命令的标准输出
print("Output:", result.stdout)
return True
except subprocess.CalledProcessError as e:
# 如果命令执行失败,打印错误信息
print("Error:", e.stderr)
return False
def main(self) -> None:
# 设置全局代理
self.update_configs()
# 读取所有代理
if not self.all_proxies:
for port_list in self.base_port:
base_url = self.base_url + ":" + port_list[0]
clash_tool_url = f"{base_url}"
proxies = self.get_all_proxies(clash_tool_url)
if proxies:
self.all_proxies = proxies
break
if not self.all_proxies:
logging.error("Failed to get all proxies")
return
# 遍历所有的线路api, 切换不重复代理
# 切换后, 检测代理, 如果检测返回失败, 再次切换
used_proxy = []
for base_port in self.base_port:
url_and_port = self.base_url + ":" + base_port[0]
proxy_url = self.base_url + ":" + base_port[1]
while True:
# 选一个代理
choose_proxy = random.choice(self.all_proxies)
# 如果已经选过就继续下一个
if choose_proxy in used_proxy:
continue
# 切换代理
self.switch_proxy(choose_proxy, url_and_port)
# 切换后检测代理
if self.check_proxy(proxy_url):
print(f"代理 {choose_proxy} 切换成功,检测通过!")
used_proxy.append(choose_proxy) # 标记为已使用
break # 成功后退出当前代理的重试循环
else:
print(f"{url_and_port} 切换 {choose_proxy} 检测失败")
time.sleep(1)
if __name__ == "__main__":
manager = ClashProxyManager(BASE_URL, PORT_LIST)
manager.main()
+178
View File
@@ -0,0 +1,178 @@
# -*- coding: utf-8 -*-
'''
切换到指定代理组
'''
import httpx
import time
import logging
import subprocess
from typing import Optional, List
logging.basicConfig(level=logging.INFO)
BASE_URL = "http://192.168.31.194"
PORT_LIST = [
["58001", "59001"],
["58002", "59002"],
["58003", "59003"],
["58004", "59004"],
["58005", "59005"],
["58006", "59006"],
["58007", "59007"],
["58008", "59008"],
["58009", "59009"],
["58010", "59010"],
]
class ClashProxyManager:
def __init__(self, base_url, base_port):
self.key_group = 0
self.base_url = base_url
self.base_port = base_port
self.proxy_keyword = [
['sg', 'SG', '新加坡', '马来西亚'],
['jp', '日本'],
]
self.all_proxies = []
self.selected_proxies = []
def get_all_proxies(self, clash_tool_url: str) -> List[str]:
url = f"{clash_tool_url}/api/proxies"
try:
response = httpx.get(url)
response.raise_for_status()
proxies = response.json()
logging.info("Available proxies:")
# 输出读取的所有代理信息
# for proxy_name, proxy_info in proxies['proxies'].items():
# logging.info(f"Name: {proxy_name}, Type: {proxy_info.get('type', 'Unknown')}")
proxy_list = list(proxies['proxies'].keys())
filtered_list = [item for item in proxy_list if item not in {'REJECT', 'GLOBAL', 'DIRECT'}]
return filtered_list
except Exception as e:
logging.error(f"Failed to get proxies: {e}")
return []
def filter_proxy(self):
for keyword in self.proxy_keyword[self.key_group]:
for item in self.all_proxies:
if keyword.lower() in item.lower():
self.selected_proxies.append(item)
def switch_proxy(self, proxy_name: str, url_and_port: str) -> None:
logging.info("switch proxy")
url = f"{url_and_port}/api/proxies/GLOBAL"
data = {"name": proxy_name}
try:
response = httpx.put(url, json=data)
if response.status_code == 204:
logging.info(f"Switched to proxy: {proxy_name}")
else:
logging.error(f"Failed to switch proxy: {response.status_code} - {proxy_name}")
except Exception as e:
logging.error(f"Failed to switch proxy: {e}")
def update_configs(self):
for base_port in self.base_port:
url_and_port = self.base_url + ":" + base_port[0]
key = "/api/configs"
url = url_and_port + key
headers = {
"accept": "application/json, text/plain, */*",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "zh-CN,zh",
"connection": "keep-alive",
"content-type": "application/json",
"origin": url_and_port,
"referer": url_and_port,
"sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132", "Brave";v="132"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"macOS"',
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"sec-gpc": "1",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
}
# 请求体数据
data = {"mode": "Global"} # 替换为实际的请求数据
# 使用 httpx 发送 PATCH 请求
try:
with httpx.Client() as client:
response = client.patch(url, headers=headers, json=data)
if response.status_code == 204:
print(f"{url} OK")
else:
print("响应内容:", response.text)
except httpx.RequestError as exc:
print(f"请求失败: {exc}")
def check_proxy(self, proxy_url):
# proxy_url: 代理地址, 没有密码
# 测试目标地址:
command = ["curl", "-x", proxy_url, "ip.sb"]
# 执行命令并获取输出
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
# 打印命令的标准输出
print("Output:", result.stdout)
return True
except subprocess.CalledProcessError as e:
# 如果命令执行失败,打印错误信息
print("Error:", e.stderr)
return False
def main(self) -> None:
# 设置全局代理
self.update_configs()
# 读取所有代理
if not self.all_proxies:
for port_list in self.base_port:
base_url = self.base_url + ":" + port_list[0]
clash_tool_url = f"{base_url}"
proxies = self.get_all_proxies(clash_tool_url)
if proxies:
self.all_proxies = proxies
break
if not self.all_proxies:
logging.error("Failed to get all proxies")
return
# 通过关键词过滤出需要的代理
self.filter_proxy()
if not self.selected_proxies:
logging.error("Failed to filter proxies")
return
# 遍历所有的线路api, 切换不重复代理
# 切换后, 检测代理, 如果检测返回失败, 再次切换
used_proxy = []
for base_port in self.base_port:
url_and_port = self.base_url + ":" + base_port[0]
proxy_url = self.base_url + ":" + base_port[1]
for select_proxy in self.selected_proxies:
if select_proxy in used_proxy:
continue
# 尝试切换代理并检测
self.switch_proxy(select_proxy, url_and_port)
if self.check_proxy(proxy_url):
print(f"代理 {select_proxy} 切换成功,检测通过!")
used_proxy.append(select_proxy) # 标记为已使用
break # 成功后退出当前代理的重试循环
else:
print(f"{url_and_port} 切换 {select_proxy} 检测失败")
time.sleep(1) # 等待一段时间后重试
if __name__ == "__main__":
manager = ClashProxyManager(BASE_URL, PORT_LIST)
manager.main()