"""登录工作线程模块""" 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, })