| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- import httpx
- import time
- import json
- import uuid
- import logging
- import websockets
- from typing import Optional, List
- from websockets import WebSocketCommonProtocol
- logging.basicConfig(level=logging.INFO)
- class ClashProxyManager:
- def __init__(self):
- self.key_group = 0
- self.clash_api_base_url = [
- "http://192.168.31.201:58001/api",
- "http://192.168.31.201:58002/api",
- "http://192.168.31.201:58003/api",
- "http://192.168.31.201:58004/api",
- "http://192.168.31.201:58005/api",
- "http://192.168.31.201:58006/api",
- "http://192.168.31.201:58007/api",
- "http://192.168.31.201:58008/api",
- "http://192.168.31.201:58009/api",
- "http://192.168.31.201:58010/api",
- ]
- 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}/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')}")
- return list(proxies['proxies'].keys())
- 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, clash_api_base_url: str) -> None:
- url = f"{clash_api_base_url}/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 main(self) -> None:
- # 读取所有代理
- if not self.all_proxies:
- for clash_tool_url in self.clash_api_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, 切换代理
- # 两个循环, 设换不重复的代理
- switched_agent = []
- for clash_api_base_url in self.clash_api_base_url:
- for select_proxy in self.selected_proxies:
- if select_proxy in switched_agent:
- continue
- else:
- self.switch_proxy(select_proxy, clash_api_base_url)
- switched_agent.append(select_proxy)
- break
- if __name__ == "__main__":
- manager = ClashProxyManager()
- manager.main()
|