初步增加 gui
This commit is contained in:
@@ -0,0 +1,160 @@
|
||||
"""登录工作线程模块"""
|
||||
|
||||
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,
|
||||
})
|
||||
Reference in New Issue
Block a user