Browse Source

优化代码

jack 10 months ago
parent
commit
2757650575

+ 1 - 1
manual/MyGrassio/main.py

@@ -141,7 +141,7 @@ class Grass:
         await self.send_message(message)
 
     async def connect(self):
-        uri = "wss://proxy.wynd.network:4650/"
+        uri = "wss://proxy.wynd.network"
         headers = {
             'Pragma': 'no-cache',
             'Origin': 'chrome-extension://ilehaonighjijnmpnagapkhpcdbhclfg',

File diff suppressed because it is too large
+ 1009 - 0
manual/MyGrassio/ref/main.f4627661.js


+ 1 - 1
manual/MyGrassio/test_grass_connect.py → manual/MyGrassio/ref/test_grass_connect.py

@@ -25,7 +25,7 @@ class GrassConnect:
         await self.close()
 
     async def connect(self):
-        uri = f"wss://proxy.wynd.network:{random.choice(['4650', '4444'])}/"
+        uri = f"wss://proxy.wynd.network"
         headers = {
             'Pragma': 'no-cache',
             'Origin': 'chrome-extension://ilehaonighjijnmpnagapkhpcdbhclfg',

+ 0 - 0
manual/MyGrassio/test_grass_proxy_score.py → manual/MyGrassio/ref/test_grass_proxy_score.py


+ 74 - 0
manual/clash-multi/clash-group-proxy.py

@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+import os
+import yaml
+import shutil
+
+# 分组关键词
+proxy_split_group = {
+    "US": ['us', '美国', 'la-', '加拿大'],
+    'UE': ['uk', '英国'],
+    'ASIA': ['hk', '香港', 'tw', '台湾', 'sg', '新加坡', '马来西亚', '澳门', '泰国', '日本', 'jp', '韩国']
+}
+
+# 新文件夹名称
+new_folder_name = "config"
+
+downloads_path = os.path.join(os.path.expanduser('~'), 'Downloads')
+
+# 新文件夹的完整路径
+new_folder_path = os.path.join(downloads_path, new_folder_name)
+
+# 如果文件夹存在,删除整个文件夹
+if os.path.exists(new_folder_path):
+    shutil.rmtree(new_folder_path)
+
+# 创建新的文件夹
+os.makedirs(new_folder_path)
+
+config_path = os.path.join(os.getcwd(), "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
+
+out_data = {}
+
+for i in data.setdefault('proxies'):
+    for group_name, group_keywords in proxy_split_group.items():
+        if any(keyword in i['name'].lower() for keyword in group_keywords):
+            if group_name not in out_data:
+                out_data[group_name] = []
+            if i['name'] not in [x['name'] for x in out_data[group_name]]:
+                out_data[group_name].append(i)
+
+for g_name, g_proxy in out_data.items():
+    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-groups": [{'name': '所有节点', 'type': 'select', 'proxies': []}],
+    }
+    for proxy in g_proxy:
+        config_template['proxies'].append(proxy)
+        config_template['proxy-groups'][0]['proxies'].append(proxy['name'])
+
+    config_path = os.path.join(new_folder_path, f'{g_name.lower()}.yaml')
+    with open(config_path, 'w', encoding='utf-8') as file:
+        yaml.dump(config_template, file, allow_unicode=True, sort_keys=False)
+
+print('OK')

+ 74 - 0
manual/clash-pi-proxy/clash-group-proxy.py

@@ -0,0 +1,74 @@
+# -*- coding: utf-8 -*-
+import os
+import yaml
+import shutil
+
+# 分组关键词
+proxy_split_group = {
+    "US": ['us', '美国', 'la-', '加拿大'],
+    'UE': ['uk', '英国'],
+    'ASIA': ['hk', '香港', 'tw', '台湾', 'sg', '新加坡', '马来西亚', '澳门', '泰国', '日本', 'jp', '韩国']
+}
+
+# 新文件夹名称
+new_folder_name = "config"
+
+downloads_path = os.path.join(os.path.expanduser('~'), 'Downloads')
+
+# 新文件夹的完整路径
+new_folder_path = os.path.join(downloads_path, new_folder_name)
+
+# 如果文件夹存在,删除整个文件夹
+if os.path.exists(new_folder_path):
+    shutil.rmtree(new_folder_path)
+
+# 创建新的文件夹
+os.makedirs(new_folder_path)
+
+config_path = os.path.join(os.getcwd(), "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
+
+out_data = {}
+
+for i in data.setdefault('proxies'):
+    for group_name, group_keywords in proxy_split_group.items():
+        if any(keyword in i['name'].lower() for keyword in group_keywords):
+            if group_name not in out_data:
+                out_data[group_name] = []
+            if i['name'] not in [x['name'] for x in out_data[group_name]]:
+                out_data[group_name].append(i)
+
+for g_name, g_proxy in out_data.items():
+    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-groups": [{'name': '所有节点', 'type': 'select', 'proxies': []}],
+    }
+    for proxy in g_proxy:
+        config_template['proxies'].append(proxy)
+        config_template['proxy-groups'][0]['proxies'].append(proxy['name'])
+
+    config_path = os.path.join(new_folder_path, f'{g_name.lower()}.yaml')
+    with open(config_path, 'w', encoding='utf-8') as file:
+        yaml.dump(config_template, file, allow_unicode=True, sort_keys=False)
+
+print('OK')

+ 5 - 0
manual/clash-pi-proxy/config.json

@@ -0,0 +1,5 @@
+{
+    "total_container": 12,
+    "start_web_port": 32001,
+    "start_port": 32101
+}

+ 143 - 0
manual/clash-pi-proxy/merge.yaml

@@ -0,0 +1,143 @@
+proxies:
+  - {"name":"剩余流量:89.96 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}

+ 119 - 0
manual/clash-pi-proxy/switch_proxy.py

@@ -0,0 +1,119 @@
+import json
+import random
+import subprocess
+
+import httpx
+
+
+def load_config():
+    with open("config.json", "r") as f:
+        return json.load(f)
+
+
+config = load_config()
+
+END = config["total_container"]
+START_PORT = config["start_web_port"]
+START_API_PORT = config["start_port"]
+
+base_url_list = [f'http://192.168.31.201:{START_PORT + i}' for i in range(0, END)]
+base_api_list = [f'http://192.168.31.201:{START_API_PORT + i}' for i in range(0, END)]
+
+
+class ProxyManager:
+    def __init__(self, base_url):
+        self.base_url = base_url
+
+    def switch_to_global(self):
+        print(f"{self.base_url}/api/configs 切换全局代理")
+        headers = {
+            "accept": "application/json, text/plain, */*",
+            "accept-encoding": "gzip, deflate, br, zstd",
+            "accept-language": "zh-CN,zh",
+            "connection": "keep-alive",
+            "content-type": "application/json",
+            "host": base_url.replace('http://', ''),
+            "origin": base_url,
+            "referer": base_url,
+            "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"}
+        try:
+            with httpx.Client() as client:
+                response = client.patch(self.base_url + "/api/configs", json=data, headers=headers)
+                if response.status_code == 204:
+                    print(f"{self.base_url}/api/configs 切换全局代理成功")
+                else:
+                    print(f"{self.base_url}/api/configs 切换全局代理失败 {response.status_code}")
+                    exit(1)
+        except httpx.RequestError as exc:
+            print(f"请求失败: {exc}")
+            exit(1)
+
+    def get_proxy_name(self):
+        print(f'{self.base_url}/api/proxies 获取代理名称')
+        try:
+            response = httpx.get(self.base_url + "/api/proxies")
+            response.raise_for_status()
+            proxies = response.json()
+            proxy_name_list = [item for item in proxies['proxies']['GLOBAL']['all'] if item not in ('DIRECT', 'REJECT')]
+            return proxy_name_list
+        except Exception as e:
+            print(f'get_proxy_name: {e}')
+            exit(1)
+
+    def switch_proxy(self, proxy_name, base_api):
+        print(f'{self.base_url}/api/proxies/GLOBAL 切换代理')
+        try:
+            target_url = self.base_url + '/api/proxies/GLOBAL'
+            response = httpx.put(target_url, json={"name": proxy_name})
+            if response.status_code == 204:
+                # 切换代理成功, 检测代理
+                return self.check_proxy(base_api)
+            else:
+                print(f"切换代理失败: {response.status_code} - {proxy_name}\n重试...")
+                return False
+        except Exception as e:
+            print(f"切换代理失败: {e}\n重试...")
+            return False
+
+    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)
+            if not result:
+                return False
+
+            print("Output:", result.stdout)
+
+            return True
+        except subprocess.CalledProcessError as e:
+            # 如果命令执行失败,打印错误信息
+            print("Error:", e.stderr)
+            return False
+
+
+used_proxy = []
+for base_url, base_api in zip(base_url_list, base_api_list):
+    manager = ProxyManager(base_url)
+    manager.switch_to_global()
+    proxy_name_list = manager.get_proxy_name()
+
+    while proxy_name_list:
+        proxy_name = random.choice(proxy_name_list)
+        if proxy_name not in used_proxy:
+            if manager.switch_proxy(proxy_name, base_api):
+                break
+
+            result = used_proxy.append(proxy_name)

Some files were not shown because too many files changed in this diff