"""代理管理模块""" import re import requests from typing import Optional, List from loguru import logger class ProxyManager: """代理管理器""" def __init__(self, api_url: str = None): self.api_url = api_url or "http://api.xiequ.cn/VAD/GetIp.aspx?act=get&uid=106015&vkey=97111DB5379E38E3BC2FF09A1B00A0C7&num=1&time=30&plat=1&re=0&type=0&so=1&ow=1&spl=1&addr=&db=1" self.current_proxy: Optional[str] = None def get_proxy(self) -> Optional[str]: """ 从代理API获取代理IP Returns: 代理URL,格式: http://ip:port """ try: logger.info("获取代理IP...") response = requests.get(self.api_url, timeout=10) response.raise_for_status() text = response.text.strip() logger.debug(f"代理API响应: {text}") # 解析IP:Port格式 match = re.search(r'(\d+\.\d+\.\d+\.\d+):(\d+)', text) if match: ip = match.group(1) port = match.group(2) proxy = f"http://{ip}:{port}" self.current_proxy = proxy logger.info(f"获取到代理: {proxy}") return proxy else: logger.warning(f"无法解析代理地址: {text}") return None except Exception as e: logger.error(f"获取代理失败: {e}") return None def get_proxies_dict(self, proxy: str = None) -> dict: """ 获取requests使用的proxies字典 Args: proxy: 代理URL,如果不提供则使用当前代理 Returns: proxies字典 """ proxy = proxy or self.current_proxy if proxy: return { 'http': proxy, 'https': proxy, } return {} def verify_proxy(self, proxy: str = None) -> bool: """ 验证代理是否可用 Args: proxy: 代理URL Returns: 是否可用 """ proxy = proxy or self.current_proxy if not proxy: return False try: response = requests.get( 'https://httpbin.org/ip', proxies={'http': proxy, 'https': proxy}, timeout=10 ) if response.status_code == 200: data = response.json() logger.info(f"代理验证成功,当前IP: {data.get('origin')}") return True return False except Exception as e: logger.error(f"代理验证失败: {e}") return False # 全局代理管理器实例 _proxy_manager: Optional[ProxyManager] = None def get_proxy_manager(api_url: str = None) -> ProxyManager: """获取全局代理管理器实例""" global _proxy_manager if _proxy_manager is None: _proxy_manager = ProxyManager(api_url) return _proxy_manager def get_proxy() -> Optional[str]: """获取代理URL的便捷函数""" return get_proxy_manager().get_proxy() def get_proxies_dict() -> dict: """获取proxies字典的便捷函数""" return get_proxy_manager().get_proxies_dict()