switch_proxy.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import httpx
  2. import time
  3. import json
  4. import uuid
  5. import logging
  6. import websockets
  7. from typing import Optional
  8. from websockets import WebSocketCommonProtocol
  9. # 配置日志
  10. logging.basicConfig(level=logging.INFO)
  11. # Clash API 的基础 URL
  12. CLASH_API_BASE_URL = "http://localhost:17888/api"
  13. # 服务的基础 URL 和端口
  14. SERVER_HOSTNAME = "proxy.wynd.network"
  15. SERVER_PORT = 4444
  16. SERVER_URL = f"wss://{SERVER_HOSTNAME}:{SERVER_PORT}/"
  17. TEST_USER_ID = '2pcRp86m1r76nSzdtGy1DNpXjrF'
  18. PROXY_URL = "http://127.0.0.1:17890" # 代理地址
  19. def get_all_proxies():
  20. """获取Clash中所有可用的代理"""
  21. url = f"{CLASH_API_BASE_URL}/proxies"
  22. try:
  23. response = httpx.get(url)
  24. response.raise_for_status() # 检查请求是否成功
  25. proxies = response.json()
  26. logging.info("Available proxies:")
  27. for proxy_name, proxy_info in proxies['proxies'].items():
  28. logging.info(f"Name: {proxy_name}, Type: {proxy_info.get('type', 'Unknown')}")
  29. return list(proxies['proxies'].keys())
  30. except Exception as e:
  31. logging.error(f"Failed to get proxies: {e}")
  32. return []
  33. def switch_proxy(proxy_name):
  34. """切换到指定的代理"""
  35. url = f"{CLASH_API_BASE_URL}/proxies/GLOBAL"
  36. data = {"name": proxy_name}
  37. response = httpx.put(url, json=data)
  38. if response.status_code == 204:
  39. logging.info(f"Switched to proxy: {proxy_name}")
  40. else:
  41. logging.error(f"Failed to switch proxy: {response.status_code} - {proxy_name}")
  42. def main():
  43. # 获取所有代理
  44. proxies = get_all_proxies()
  45. if proxies:
  46. logging.info(f"Found {len(proxies)} proxies.")
  47. ok_proxy_list = []
  48. for proxy_name in proxies:
  49. if proxy_name in ["DIRECT", "REJECT", "GLOBAL"]:
  50. continue
  51. # 切换到指定的代理
  52. switch_proxy(proxy_name)
  53. # 暂停一段时间,避免频繁切换
  54. time.sleep(0.5)
  55. for proxy_name in ok_proxy_list:
  56. logging.info(f"Proxy {proxy_name} is OK.")
  57. else:
  58. logging.info("No proxies found. Exiting.")
  59. if __name__ == "__main__":
  60. main()