switch_proxy.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import httpx
  2. import time
  3. import json
  4. import uuid
  5. import logging
  6. import websockets
  7. from typing import Optional, List
  8. from websockets import WebSocketCommonProtocol
  9. logging.basicConfig(level=logging.INFO)
  10. class ClashProxyManager:
  11. def __init__(self):
  12. self.clash_api_base_url = [
  13. "http://192.168.31.201:58001/api",
  14. "http://192.168.31.201:58002/api",
  15. "http://192.168.31.201:58003/api",
  16. "http://192.168.31.201:58004/api",
  17. "http://192.168.31.201:58005/api",
  18. "http://192.168.31.201:58006/api",
  19. "http://192.168.31.201:58007/api",
  20. "http://192.168.31.201:58008/api",
  21. "http://192.168.31.201:58009/api",
  22. "http://192.168.31.201:58010/api",
  23. ]
  24. self.proxy_keyword = ['sg', 'SG', '新加坡', '马来西亚']
  25. self.all_proxies = []
  26. self.selected_proxies = []
  27. def get_all_proxies(self, clash_tool_url: str) -> List[str]:
  28. url = f"{clash_tool_url}/proxies"
  29. try:
  30. response = httpx.get(url)
  31. response.raise_for_status()
  32. proxies = response.json()
  33. logging.info("Available proxies:")
  34. # 输出读取的所有代理信息
  35. # for proxy_name, proxy_info in proxies['proxies'].items():
  36. # logging.info(f"Name: {proxy_name}, Type: {proxy_info.get('type', 'Unknown')}")
  37. return list(proxies['proxies'].keys())
  38. except Exception as e:
  39. logging.error(f"Failed to get proxies: {e}")
  40. return []
  41. def filter_proxy(self):
  42. for keyword in self.proxy_keyword:
  43. for item in self.all_proxies:
  44. if keyword.lower() in item.lower():
  45. self.selected_proxies.append(item)
  46. def switch_proxy(self, proxy_name: str, clash_api_base_url: str) -> None:
  47. url = f"{clash_api_base_url}/proxies/GLOBAL"
  48. data = {"name": proxy_name}
  49. try:
  50. response = httpx.put(url, json=data)
  51. if response.status_code == 204:
  52. logging.info(f"Switched to proxy: {proxy_name}")
  53. else:
  54. logging.error(f"Failed to switch proxy: {response.status_code} - {proxy_name}")
  55. except Exception as e:
  56. logging.error(f"Failed to switch proxy: {e}")
  57. def main(self) -> None:
  58. # 读取所有代理
  59. if not self.all_proxies:
  60. for clash_tool_url in self.clash_api_base_url:
  61. proxies = self.get_all_proxies(clash_tool_url)
  62. if proxies:
  63. self.all_proxies = proxies
  64. break
  65. if not self.all_proxies:
  66. logging.error("Failed to get all proxies")
  67. return
  68. # 通过关键词过滤出需要的代理
  69. self.filter_proxy()
  70. if not self.selected_proxies:
  71. logging.error("Failed to filter proxies")
  72. return
  73. # 遍历所有的线路api, 切换代理
  74. for select_proxy, clash_api_base_url in zip(self.selected_proxies, self.clash_api_base_url):
  75. self.switch_proxy(select_proxy, clash_api_base_url)
  76. if __name__ == "__main__":
  77. manager = ClashProxyManager()
  78. manager.main()