此前代理配置页开启后所有斗鱼任务(含查积分/刷列表等只读任务)统一走代理: - API 模式每任务 fetch 新代理, 查询任务白白消耗代理额度 - 查询任务失败面被代理抖动放大, 但查询本不怕 IP 频控 新策略 (DOUYU_PROXY_TASK_TYPES 白名单): - 写操作/消耗类: lock/pay/exchange_goods, exchange_esports/xpd_goods, create_elite/esports/gold_qr, donate_* 走代理 (静态模式或 API 每任务新代理) - 读操作类: query_*/refresh_*/get_*_bind_qr 等始终直连, 不消耗额度 - 判型用批次 task_type (同批次同类型, 与任务一致); 总开关仍为代理配置页 测试: 新增读任务直连/白名单覆盖断言, 三模式行为断言保留, 101 单测通过
斗鱼批量登录 Web 后台
全自动登录斗鱼账号、获取 Cookie 的 Web 管理平台。
功能特性
- 极验 v3 滑块自动识别
- 邮箱验证码自动获取(IMAP)
- 批量登录 + 实时日志推送(WebSocket)
- 代理 & 白名单自动管理
- 角色权限控制(超级管理员 / 运营 / 客服)
项目结构
douyu_login_py/
├── core/ # 核心业务逻辑
│ ├── models.py # Account, ProxyConfig 数据类
│ ├── douyu/ # 斗鱼登录模块
│ │ ├── login.py # 登录流程
│ │ ├── crypto.py # 密码加密
│ │ ├── email_verifier.py # 邮箱验证码
│ │ ├── proxy.py # 代理管理
│ │ └── whitelist.py # 白名单管理
│ └── geetest/ # 极验验证码求解
│ ├── common/ # 公共工具(网络/加密/图像/轨迹)
│ └── v3_slide/ # v3 滑块求解器
├── web/ # Web 后台
│ ├── backend/ # FastAPI 后端
│ │ ├── main.py # 入口
│ │ ├── routers/ # API 路由
│ │ ├── migrations/ # Alembic 数据库迁移
│ │ └── services/ # 业务服务
│ └── frontend/ # React + Ant Design 前端
├── utils/ # 通用工具
│ └── logger.py
├── data/ # 运行时数据(gitignore)
├── deploy.sh # 部署/重置工具
└── pyproject.toml
快速开始
# Docker 部署(推荐)
./deploy.sh
访问 http://localhost:8800,默认账号 admin / admin123。
应用宝充值 Worker
应用宝充值 Worker 已合并到 Web 应用容器中,内部仅监听 127.0.0.1:8810,不发布额外端口。任务数据与应用数据一起保存在 data/yyb-worker-jobs/。
cd /opt/douyu_login_py
python3 -c 'import secrets; print(secrets.token_urlsafe(32))'
将生成的值写入项目 .env:
YYB_WORKER_KEY=随机密钥
随后执行 ./deploy.sh,它会构建并启动应用与 MySQL。Worker 不发布端口;扫码图片和支付二维码只经后台授权接口返回。服务器只需要此仓库,不需要部署 js_reverse。
本机热更新调试使用 ./dev.sh(或 ./deploy.sh dev)。它会直接启动一个仅绑定 127.0.0.1:8810 的开发 Worker,后端自动使用该地址;Worker 动态数据写入 data/yyb-worker-dev/,按 Ctrl+C 会一并停止。应用文件日志按日期写入项目的 logs/app-YYYY-MM-DD.log,可另开终端执行 ./dev.sh logs 跟踪当天文件。
常用命令:
./deploy.sh # 构建并部署
./deploy.sh logs # 查看当天持久化应用日志(logs/app-YYYY-MM-DD.log)
./deploy.sh logs container # 查看 Docker 容器输出(含 Worker)
./deploy.sh stop # 停止服务
./deploy.sh restart # 重启服务
./deploy.sh reset # 重置所有数据(需二次确认)
敏感数据加密
账号密码、邮箱密码、Cookie、代理密钥等敏感字段会以密文形式落盘。生产环境请在 .env 中设置稳定的 APP_ENCRYPTION_KEY,并长期保留;更换该密钥会导致历史密文无法解密。
python -c "import secrets; print(secrets.token_urlsafe(32))"
邮件验证码服务
验证码读取默认使用内置的 Roundcube 服务地址;如部署自己的邮件读取服务,可在 .env 中设置 MAIL_ROUNDCUBE_URL 覆盖。
角色权限
| 角色 | 权限 |
|---|---|
| 超级管理员 | 全部功能 + 用户管理 + 权限分配 |
| 运营 | 账号管理 + 批量登录 + 代理配置 + Cookie 导出 |
| 客服 | 仅查看分配给自己的账号(只显示用户名) |
登录流程
1. 获取极验参数 → 滑块验证 → 自动识别缺口
2. 获取邮箱验证 code → 发送验证邮件
3. IMAP 获取验证码 → 提交验证码 → 获取 Cookie
技术栈
- 后端:FastAPI + SQLAlchemy + SQLite + JWT
- 前端:React + Ant Design + Vite
- 核心:Python + OpenCV + pycryptodome
- 迁移:Alembic
许可证
MIT License
部署
Docker 部署
# 一键部署(自动构建镜像 + 启动服务)
./deploy.sh
# 重置所有数据(删除数据库/Cookie/日志,需二次确认)
./deploy.sh reset
部署完成后访问 http://服务器IP:8800,默认账号 admin / admin123。
数据持久化: 数据库和日志通过 volume 挂载到宿主机 ./data 和 ./logs 目录,容器重建后数据不丢失。
代理配置说明
在 Web 界面"代理配置"页面设置:
- API 代理:填入代理 API 地址(支持返回 JSON 格式),系统自动获取并验证代理
- 白名单:如代理需要白名单,填入 UID 和 UKEY,系统自动同步出口 IP
- 出口 IP 漂移:移动网络出口 IP 频繁漂移时,系统会保留多个出口 IP 在白名单中
代理 API JSON 格式:
// 正常返回
{"code":0,"success":"true","msg":"","data":[{"IP":"1.2.3.4","Port":8080}]}
// 白名单错误
{"code":-1,"msg":"51.请先添加白名单:1.2.3.4","data":""}