优化代理配置
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
"""登录服务:复用 douyu/ 核心模块,在线程池中执行登录并推送日志。"""
|
||||
"""登录服务:复用 core/ 核心模块,在线程池中执行登录并推送日志。"""
|
||||
|
||||
import asyncio
|
||||
import threading
|
||||
import time
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
@@ -11,6 +10,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 ..models import Account as AccountModel, LoginTask, ProxyConfig as ProxyConfigModel
|
||||
from ..permissions import has_permission
|
||||
|
||||
@@ -50,6 +50,42 @@ class LoginBatchRunner:
|
||||
self.loop,
|
||||
)
|
||||
|
||||
def _resolve_proxy(self) -> tuple[Optional[dict], str]:
|
||||
"""
|
||||
解析代理配置,返回 (proxy_dict, message)。
|
||||
|
||||
- 静态代理:直接返回 dict
|
||||
- API代理:调用 resolve_working_proxy 预检,自动同步白名单
|
||||
- 无代理:返回 (None, '')
|
||||
"""
|
||||
if not self.proxy_config or not self.proxy_config.enabled:
|
||||
return None, ''
|
||||
|
||||
# 静态代理
|
||||
if self.proxy_config.http or self.proxy_config.https:
|
||||
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,
|
||||
)
|
||||
if proxy_url:
|
||||
return {'http': proxy_url, 'https': proxy_url}, msg
|
||||
return None, msg
|
||||
|
||||
return None, ''
|
||||
|
||||
def run(self):
|
||||
"""在线程中执行批量登录。"""
|
||||
batch_id = self.batch_id
|
||||
@@ -78,17 +114,20 @@ class LoginBatchRunner:
|
||||
|
||||
self.db.commit()
|
||||
|
||||
# 构建代理配置
|
||||
proxy_url = None
|
||||
proxy_api_url = None
|
||||
if self.proxy_config and self.proxy_config.enabled:
|
||||
if self.proxy_config.http or self.proxy_config.https:
|
||||
proxy_url = {
|
||||
'http': self.proxy_config.http or self.proxy_config.https,
|
||||
'https': self.proxy_config.https or self.proxy_config.http,
|
||||
}
|
||||
elif self.proxy_config.api_url:
|
||||
proxy_api_url = self.proxy_config.api_url
|
||||
# 代理预检
|
||||
proxy_dict, proxy_msg = self._resolve_proxy()
|
||||
if proxy_msg:
|
||||
self._push_log("info", proxy_msg)
|
||||
|
||||
# 如果启用了代理但预检失败,终止任务
|
||||
if self.proxy_config and self.proxy_config.enabled and not proxy_dict:
|
||||
self._push_log("error", f"代理不可用,任务终止: {proxy_msg}")
|
||||
for task, _ in tasks:
|
||||
task.status = "error"
|
||||
task.message = f"代理不可用: {proxy_msg}"
|
||||
task.finished_at = datetime.utcnow()
|
||||
self.db.commit()
|
||||
return
|
||||
|
||||
for i, (task, acc) in enumerate(tasks):
|
||||
if self._stop.is_set():
|
||||
@@ -112,8 +151,7 @@ class LoginBatchRunner:
|
||||
|
||||
loginer = DouyuLogin(
|
||||
account,
|
||||
proxy=proxy_url,
|
||||
proxy_api_url=proxy_api_url,
|
||||
proxy=proxy_dict,
|
||||
max_geetest_retries=self.max_geetest_retries,
|
||||
)
|
||||
result = loginer.login()
|
||||
|
||||
Reference in New Issue
Block a user