161 lines
4.9 KiB
Python
161 lines
4.9 KiB
Python
"""登录工作线程模块"""
|
|
|
|
import threading
|
|
import time
|
|
from queue import Queue
|
|
from typing import Optional
|
|
from loguru import logger
|
|
|
|
from douyu import DouyuLogin
|
|
from douyu.config import Account, ProxyConfig
|
|
|
|
|
|
# IMAP服务器映射
|
|
IMAP_SERVERS = {
|
|
'qq.com': 'imap.qq.com',
|
|
'163.com': 'imap.163.com',
|
|
'126.com': 'imap.126.com',
|
|
'gmail.com': 'imap.gmail.com',
|
|
'outlook.com': 'outlook.office365.com',
|
|
'hotmail.com': 'outlook.office365.com',
|
|
'yeah.net': 'imap.yeah.net',
|
|
'sohu.com': 'imap.sohu.com',
|
|
'sina.com': 'imap.sina.com',
|
|
}
|
|
|
|
|
|
def get_imap_server(email: str) -> str:
|
|
"""从邮箱地址推导IMAP服务器"""
|
|
domain = email.split('@')[-1].lower()
|
|
return IMAP_SERVERS.get(domain, f'imap.{domain}')
|
|
|
|
|
|
def parse_accounts_text(text: str) -> list[Account]:
|
|
"""
|
|
解析账号文本
|
|
|
|
格式:用户名|密码|邮箱|邮箱密码(每行一个)
|
|
|
|
Returns:
|
|
Account列表
|
|
"""
|
|
accounts = []
|
|
|
|
for line_num, line in enumerate(text.strip().split('\n'), 1):
|
|
line = line.strip()
|
|
if not line or line.startswith('#'):
|
|
continue
|
|
|
|
parts = line.split('|')
|
|
if len(parts) < 4:
|
|
logger.warning(f"第{line_num}行格式错误,需要4个字段,实际{len(parts)}个: {line}")
|
|
continue
|
|
|
|
username, password, email, email_password = parts[0].strip(), parts[1].strip(), parts[2].strip(), parts[3].strip()
|
|
|
|
if not all([username, password, email, email_password]):
|
|
logger.warning(f"第{line_num}行存在空字段: {line}")
|
|
continue
|
|
|
|
accounts.append(Account(
|
|
username=username,
|
|
password=password,
|
|
email=email,
|
|
email_password=email_password,
|
|
email_imap_server=get_imap_server(email),
|
|
email_imap_port=993,
|
|
))
|
|
|
|
return accounts
|
|
|
|
|
|
class LoginWorker(threading.Thread):
|
|
"""登录工作线程"""
|
|
|
|
def __init__(
|
|
self,
|
|
account: Account,
|
|
index: int,
|
|
result_queue: Queue,
|
|
log_queue: Queue,
|
|
proxy_config: Optional[ProxyConfig] = None,
|
|
max_geetest_retries: int = 5,
|
|
):
|
|
super().__init__(daemon=True)
|
|
self.account = account
|
|
self.index = index
|
|
self.result_queue = result_queue
|
|
self.log_queue = log_queue
|
|
self.proxy_config = proxy_config
|
|
self.max_geetest_retries = max_geetest_retries
|
|
self._stop_event = threading.Event()
|
|
|
|
def stop(self):
|
|
"""停止线程"""
|
|
self._stop_event.set()
|
|
|
|
def run(self):
|
|
"""执行登录"""
|
|
username = self.account.username
|
|
|
|
try:
|
|
# 发送日志
|
|
self.log_queue.put(('info', f'[{self.index + 1}] 开始登录: {username}'))
|
|
|
|
# 配置代理
|
|
proxy_url = None
|
|
proxy_api_url = None
|
|
|
|
if self.proxy_config and self.proxy_config.enabled:
|
|
if self.proxy_config.api_url:
|
|
proxy_api_url = self.proxy_config.api_url
|
|
elif 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,
|
|
}
|
|
|
|
# 创建登录器
|
|
loginer = DouyuLogin(
|
|
self.account,
|
|
proxy=proxy_url,
|
|
proxy_api_url=proxy_api_url,
|
|
max_geetest_retries=self.max_geetest_retries,
|
|
)
|
|
|
|
# 执行登录
|
|
result = loginer.login()
|
|
|
|
if result.success:
|
|
self.log_queue.put(('success', f'[{self.index + 1}] {username} 登录成功'))
|
|
self.result_queue.put({
|
|
'index': self.index,
|
|
'username': username,
|
|
'email': self.account.email,
|
|
'status': 'success',
|
|
'cookie': result.cookie,
|
|
'message': '登录成功',
|
|
})
|
|
else:
|
|
self.log_queue.put(('error', f'[{self.index + 1}] {username} 登录失败: {result.message}'))
|
|
self.result_queue.put({
|
|
'index': self.index,
|
|
'username': username,
|
|
'email': self.account.email,
|
|
'status': 'failed',
|
|
'cookie': '',
|
|
'message': result.message,
|
|
})
|
|
|
|
except Exception as e:
|
|
error_msg = str(e)
|
|
self.log_queue.put(('error', f'[{self.index + 1}] {username} 登录异常: {error_msg}'))
|
|
self.result_queue.put({
|
|
'index': self.index,
|
|
'username': username,
|
|
'email': self.account.email,
|
|
'status': 'error',
|
|
'cookie': '',
|
|
'message': error_msg,
|
|
})
|