优化代理管理与增加请求日志系统
代理优化(P0+P1): - 修复极验失败后代理刷新空操作bug(共享ProxyManager+白名单参数) - 极验请求超时从(3.05,12)调大到(10,30) - 白名单sync_ip加全局锁防并发限流,保留多个出口IP应对漂移 - 代理池缓存共享:Condition防并发获取+mark_bad移除坏代理 - 适配代理API的JSON响应格式(code/data/白名单错误) - 简化代理验证只验斗鱼主站,减少日志噪音 - 获取代理前主动同步白名单(解决ow=1模式不报白名单错误的问题) - 每次重试重新检测出口IP并同步白名单 请求日志系统: - 新增HttpLogger记录请求/响应详情到JSONL文件 - login.py的_request和proxy.py的verify_proxy_url接入日志 - 新增/api/logs路由查看和清空HTTP详情日志 - 前端新增请求日志页面(筛选/搜索/分页/自动刷新/详情查看) 其他: - 添加pysocks依赖支持SOCKS5代理 - gitignore添加*.log
This commit is contained in:
@@ -11,7 +11,7 @@ from sqlalchemy.orm import Session
|
||||
|
||||
from core.douyu import DouyuLogin
|
||||
from core.models import Account, ProxyConfig as DouyuProxyConfig
|
||||
from core.douyu.proxy import resolve_working_proxy
|
||||
from core.douyu.proxy import resolve_working_proxy, get_proxy_manager
|
||||
from ..models import Account as AccountModel, LoginTask, ProxyConfig as ProxyConfigModel
|
||||
from ..permissions import has_permission
|
||||
|
||||
@@ -47,6 +47,17 @@ class LoginBatchRunner:
|
||||
self._counter_lock = threading.Lock()
|
||||
self._completed = 0
|
||||
|
||||
# 共享代理管理器(带锁,避免并发白名单限流;极验失败时可刷新代理)
|
||||
self._shared_proxy_manager = None
|
||||
if proxy_config and proxy_config.enabled and proxy_config.api_url:
|
||||
wl_uid = proxy_config.whitelist_uid or "" if proxy_config.whitelist_enabled else ""
|
||||
wl_ukey = proxy_config.whitelist_ukey or "" if proxy_config.whitelist_enabled else ""
|
||||
self._shared_proxy_manager = get_proxy_manager(
|
||||
proxy_config.api_url,
|
||||
whitelist_uid=wl_uid,
|
||||
whitelist_ukey=wl_ukey,
|
||||
)
|
||||
|
||||
def stop(self):
|
||||
self._stop.set()
|
||||
|
||||
@@ -62,7 +73,7 @@ class LoginBatchRunner:
|
||||
解析代理配置,返回 (proxy_dict, message)。
|
||||
|
||||
- 静态代理:直接返回 dict
|
||||
- API代理:调用 resolve_working_proxy 预检,自动同步白名单
|
||||
- API代理:通过共享 ProxyManager(带已验证代理池缓存)获取,自动同步白名单
|
||||
- 无代理:返回 (None, '')
|
||||
"""
|
||||
if not self.proxy_config or not self.proxy_config.enabled:
|
||||
@@ -73,23 +84,12 @@ class LoginBatchRunner:
|
||||
proxy_url = self.proxy_config.http or self.proxy_config.https
|
||||
return {'http': proxy_url, 'https': proxy_url}, f'使用静态代理: {proxy_url}'
|
||||
|
||||
# API代理:预检获取可用代理
|
||||
if self.proxy_config.api_url:
|
||||
whitelist_uid = ''
|
||||
whitelist_ukey = ''
|
||||
if self.proxy_config.whitelist_enabled:
|
||||
whitelist_uid = self.proxy_config.whitelist_uid or ''
|
||||
whitelist_ukey = self.proxy_config.whitelist_ukey or ''
|
||||
|
||||
proxy_url, msg = resolve_working_proxy(
|
||||
api_url=self.proxy_config.api_url,
|
||||
whitelist_uid=whitelist_uid,
|
||||
whitelist_ukey=whitelist_ukey,
|
||||
log_func=self._push_log,
|
||||
)
|
||||
# API代理:通过共享代理管理器获取(优先从已验证代理池复用)
|
||||
if self._shared_proxy_manager:
|
||||
proxy_url = self._shared_proxy_manager.get_proxy()
|
||||
if proxy_url:
|
||||
return {'http': proxy_url, 'https': proxy_url}, msg
|
||||
return None, msg
|
||||
return {'http': proxy_url, 'https': proxy_url}, f'使用API代理: {proxy_url}'
|
||||
return None, '代理不可用'
|
||||
|
||||
return None, ''
|
||||
|
||||
@@ -144,6 +144,7 @@ class LoginBatchRunner:
|
||||
proxy=proxy_dict,
|
||||
max_geetest_retries=self.max_geetest_retries,
|
||||
max_proxy_retries=self.max_proxy_retries,
|
||||
proxy_manager=self._shared_proxy_manager,
|
||||
)
|
||||
result = loginer.login()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user