Files
live-hub-py/README.md
T

189 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 斗鱼批量登录 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":""}
```