166 lines
4.4 KiB
Python
166 lines
4.4 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
斗鱼自动登录工具 - Python版
|
|
|
|
功能:
|
|
1. 自动登录斗鱼账号
|
|
2. 自动过极验滑块验证
|
|
3. 自动获取邮箱验证码
|
|
4. 批量获取Cookie
|
|
"""
|
|
|
|
import sys
|
|
import argparse
|
|
from pathlib import Path
|
|
from loguru import logger
|
|
|
|
from douyu import DouyuLogin, Config
|
|
from utils import setup_logger, save_cookie, load_accounts
|
|
|
|
|
|
def login_single(config: Config, account_index: int = 0) -> str:
|
|
"""
|
|
单账号登录
|
|
|
|
Args:
|
|
config: 配置对象
|
|
account_index: 账号索引
|
|
|
|
Returns:
|
|
Cookie字符串
|
|
"""
|
|
accounts = config.get_accounts()
|
|
|
|
if account_index >= len(accounts):
|
|
logger.error(f"账号索引 {account_index} 超出范围,共有 {len(accounts)} 个账号")
|
|
return ""
|
|
|
|
account = accounts[account_index]
|
|
logger.info(f"登录账号: {account.username}")
|
|
|
|
# 创建登录器
|
|
proxy = config.get_proxy()
|
|
proxy_url = None
|
|
proxy_api_url = None
|
|
|
|
if proxy.enabled:
|
|
if proxy.api_url:
|
|
# 使用代理API
|
|
proxy_api_url = proxy.api_url
|
|
elif proxy.http or proxy.https:
|
|
# 使用静态代理
|
|
proxy_url = {
|
|
'http': proxy.http or proxy.https,
|
|
'https': proxy.https or proxy.http,
|
|
}
|
|
|
|
# 获取极验配置
|
|
geetest_config = config.get_geetest_config()
|
|
max_retries = geetest_config.get('max_retries', 5)
|
|
|
|
loginer = DouyuLogin(
|
|
account,
|
|
proxy=proxy_url,
|
|
proxy_api_url=proxy_api_url,
|
|
max_geetest_retries=max_retries,
|
|
)
|
|
|
|
# 执行登录
|
|
result = loginer.login()
|
|
|
|
if result.success:
|
|
# 保存Cookie
|
|
cookie_dir = config.get_cookie_dir()
|
|
save_cookie(account.username, result.cookie, cookie_dir)
|
|
return result.cookie
|
|
else:
|
|
logger.error(f"登录失败: {result.message}")
|
|
return ""
|
|
|
|
|
|
def login_batch(config: Config) -> dict:
|
|
"""
|
|
批量登录
|
|
|
|
Returns:
|
|
{username: cookie} 字典
|
|
"""
|
|
accounts = config.get_accounts()
|
|
results = {}
|
|
|
|
logger.info(f"开始批量登录,共 {len(accounts)} 个账号")
|
|
|
|
for i, account in enumerate(accounts):
|
|
logger.info(f"[{i+1}/{len(accounts)}] 登录账号: {account.username}")
|
|
|
|
try:
|
|
cookie = login_single(config, i)
|
|
if cookie:
|
|
results[account.username] = cookie
|
|
logger.success(f"账号 {account.username} 登录成功")
|
|
else:
|
|
logger.error(f"账号 {account.username} 登录失败")
|
|
except Exception as e:
|
|
logger.error(f"账号 {account.username} 登录异常: {e}")
|
|
|
|
# 统计结果
|
|
success_count = len(results)
|
|
total_count = len(accounts)
|
|
logger.info(f"批量登录完成: 成功 {success_count}/{total_count}")
|
|
|
|
return results
|
|
|
|
|
|
def main():
|
|
"""主函数"""
|
|
parser = argparse.ArgumentParser(description='斗鱼自动登录工具')
|
|
parser.add_argument('-c', '--config', default='config.yaml', help='配置文件路径')
|
|
parser.add_argument('-i', '--index', type=int, default=0, help='单账号登录时的账号索引')
|
|
parser.add_argument('-b', '--batch', action='store_true', help='批量登录模式')
|
|
parser.add_argument('-g', '--gui', action='store_true', help='启动GUI界面')
|
|
parser.add_argument('-w', '--web', action='store_true', help='启动Web后台')
|
|
parser.add_argument('-v', '--verbose', action='store_true', help='详细日志')
|
|
|
|
args = parser.parse_args()
|
|
|
|
# 配置日志
|
|
log_level = "DEBUG" if args.verbose else "INFO"
|
|
setup_logger(level=log_level)
|
|
|
|
# 启动GUI
|
|
if args.gui:
|
|
from gui import DouyuLoginApp
|
|
app = DouyuLoginApp()
|
|
app.run()
|
|
return
|
|
|
|
# 启动Web后台
|
|
if args.web:
|
|
from web.backend.main import run
|
|
run()
|
|
return
|
|
|
|
# 加载配置
|
|
try:
|
|
config = Config(args.config)
|
|
except FileNotFoundError as e:
|
|
logger.error(str(e))
|
|
sys.exit(1)
|
|
|
|
# 执行登录
|
|
if args.batch:
|
|
results = login_batch(config)
|
|
print(f"\n登录结果: 成功 {len(results)} 个账号")
|
|
else:
|
|
cookie = login_single(config, args.index)
|
|
if cookie:
|
|
print(f"\n登录成功!")
|
|
print(f"Cookie: {cookie[:50]}...")
|
|
else:
|
|
print("\n登录失败")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|