189 lines
6.6 KiB
Markdown
189 lines
6.6 KiB
Markdown
# 斗鱼批量登录 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
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
```bash
|
||
# Docker 部署(推荐)
|
||
./deploy.sh
|
||
```
|
||
|
||
访问 `http://localhost:8800`,默认账号 `admin / admin123`。
|
||
|
||
### 应用宝充值 Worker
|
||
|
||
应用宝充值 Worker 已合并到 Web 应用容器中,内部仅监听 `127.0.0.1:8810`,不发布额外端口。任务数据与应用数据一起保存在 `data/yyb-worker-jobs/`。
|
||
|
||
```bash
|
||
cd /opt/douyu_login_py
|
||
python3 -c 'import secrets; print(secrets.token_urlsafe(32))'
|
||
```
|
||
|
||
将生成的值写入项目 `.env`:
|
||
|
||
```dotenv
|
||
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` 跟踪当天文件。
|
||
|
||
**常用命令:**
|
||
|
||
```bash
|
||
./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`,并长期保留;更换该密钥会导致历史密文无法解密。
|
||
|
||
```bash
|
||
python -c "import secrets; print(secrets.token_urlsafe(32))"
|
||
```
|
||
|
||
### 邮件验证码服务
|
||
|
||
验证码读取默认使用内置的 Roundcube 服务地址;如部署自己的邮件读取服务,可在 `.env` 中设置 `MAIL_ROUNDCUBE_URL` 覆盖。
|
||
|
||
## 角色权限
|
||
|
||
| 角色 | 权限 |
|
||
|---|---|
|
||
| 超级管理员 | 全部功能 + 用户管理 + 权限分配 |
|
||
| 运营 | 账号管理 + 批量登录 + 代理配置 + Cookie 导出 |
|
||
| 客服 | 仅查看分配给自己的账号(只显示用户名) |
|
||
|
||
## 登录流程
|
||
|
||
```
|
||
1. 获取极验参数 → 滑块验证 → 自动识别缺口
|
||
2. 获取邮箱验证 code → 发送验证邮件
|
||
3. IMAP 获取验证码 → 提交验证码 → 获取 Cookie
|
||
```
|
||
|
||
## 运行测试
|
||
|
||
```bash
|
||
# 全量回归(SQLite 内存库,无需 MySQL / .env 配置)
|
||
uv run --group dev pytest # 或 ./dev.sh test
|
||
|
||
# 只跑单个文件 / 用例
|
||
uv run --group dev pytest tests/test_cookie_operations.py
|
||
|
||
# 格式化 / 仅检查格式
|
||
./dev.sh format tests conftest.py
|
||
./dev.sh format-check tests conftest.py
|
||
|
||
# 类型检查(当前为渐进式接入,先查看存量诊断)
|
||
./dev.sh type-check
|
||
|
||
# 容器内回归(镜像内为构建时代码,改动后需重新构建)
|
||
docker compose --profile test run --rm test
|
||
```
|
||
|
||
测试使用各文件自建的 SQLite 内存引擎,互不干扰;根目录 `conftest.py`
|
||
统一兜底 `DATABASE_URL` / `APP_ENCRYPTION_KEY`,防止误连开发/生产库。
|
||
数据库迁移链的冒烟校验见 `tests/test_migrations.py`(链线性 + 脚本可
|
||
编译 + 空库整链 `upgrade head` 后与模型元数据表/列/索引对齐;MySQL
|
||
专属 DDL 由迁移脚本内的方言防护跳过,真实执行仍以部署流程
|
||
`docker-entrypoint.sh` / `./deploy.sh` / `./dev.sh` 的 MySQL 为准)。
|
||
启用本地 pre-push 门禁(Ruff 格式检查 + pytest):
|
||
|
||
```bash
|
||
./scripts/install-git-hooks.sh
|
||
```
|
||
|
||
推送前自动跑全量测试,失败阻止推送。需要将 Pyright 作为推送门禁时,使用
|
||
`TYPECHECK=1 git push`;紧急绕过可使用 `git push --no-verify` 或
|
||
`SKIP_TESTS=1 git push`。
|
||
|
||
## 技术栈
|
||
|
||
- 后端:FastAPI + SQLAlchemy + SQLite + JWT
|
||
- 前端:React + Ant Design + Vite
|
||
- 核心:Python + OpenCV + pycryptodome
|
||
- 迁移:Alembic
|
||
|
||
## 许可证
|
||
|
||
MIT License
|
||
|
||
## 部署
|
||
|
||
### Docker 部署
|
||
|
||
```bash
|
||
# 一键部署(自动构建镜像 + 启动服务)
|
||
./deploy.sh
|
||
|
||
# 重置所有数据(删除数据库/Cookie/日志,需二次确认)
|
||
./deploy.sh reset
|
||
```
|
||
|
||
部署完成后访问 `http://服务器IP:8800`,默认账号 `admin / admin123`。
|
||
|
||
**数据持久化:** 数据库和日志通过 volume 挂载到宿主机 `./data` 和 `./logs` 目录,容器重建后数据不丢失。
|
||
|
||
### 代理配置说明
|
||
|
||
在 Web 界面"代理配置"页面设置:
|
||
|
||
1. **API 代理**:填入代理 API 地址(支持返回 JSON 格式),系统自动获取并验证代理
|
||
2. **白名单**:如代理需要白名单,填入 UID 和 UKEY,系统自动同步出口 IP
|
||
3. **出口 IP 漂移**:移动网络出口 IP 频繁漂移时,系统会保留多个出口 IP 在白名单中
|
||
|
||
**代理 API JSON 格式:**
|
||
|
||
```json
|
||
// 正常返回
|
||
{"code":0,"success":"true","msg":"","data":[{"IP":"1.2.3.4","Port":8080}]}
|
||
|
||
// 白名单错误
|
||
{"code":-1,"msg":"51.请先添加白名单:1.2.3.4","data":""}
|
||
```
|