彻底优化项目结构,使用 web
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
"""代理管理模块"""
|
||||
|
||||
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()
|
||||
Reference in New Issue
Block a user