This commit is contained in:
2025-11-28 21:20:40 +08:00
commit f940b95b67
73 changed files with 15721 additions and 0 deletions

191
CLAUDE.md Normal file
View File

@@ -0,0 +1,191 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## 项目概述
这是一个短视频解析平台聚合多家短视频解析接口抖音、TikTok、哔哩哔哩提供用户系统、限流控制、队列管理和管理后台。
技术栈Python + Flask + MySQL + Redis
## 常用命令
### 开发环境设置
```bash
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 然后编辑 .env 文件配置数据库和Redis连接
# 创建数据库
mysql -u root -p
CREATE DATABASE video_parser CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# 导入数据库表结构
mysql -u root -p video_parser < database/schema.sql
# 初始化管理员账号(用户名: shihao, 密码: 80012029Lz
python init_admin.py
# 初始化解析接口数据
python init_data.py
```
### 运行应用
```bash
# 开发模式
python app.py
# 生产模式使用Gunicorn
gunicorn -w 4 -b 0.0.0.0:5000 app:app
```
### 测试和调试
```bash
# 测试数据库连接
python test_db.py
# 检查环境配置
python check_env.py
# 测试邮件发送功能
python test_email.py
# 单独运行定时任务(健康检查)
python scheduler.py
```
### Redis 服务
```bash
# Windows下启动Redis项目包含Redis-x64-5.0.14.1
cd Redis-x64-5.0.14.1
redis-server.exe redis.windows.conf
```
## 核心架构
### 解析器工厂模式parsers/factory.py
- `ParserFactory.create_parser(api_config)` - 根据API配置创建对应平台的解析器实例
- `ParserFactory.get_parser_for_platform(platform)` - 获取指定平台的解析器,支持负载均衡(哔哩哔哩使用加权随机选择)
- `ParserFactory.detect_platform(video_url)` - 自动检测视频链接所属平台
所有解析器继承自 `BaseParser`parsers/base.py必须实现 `parse(video_url)` 方法,返回统一格式:
```python
{
"cover": "封面URL",
"video_url": "视频URL",
"title": "标题",
"description": "简介"
}
```
**添加新平台解析器**
1.`parsers/` 目录创建新的解析器文件(如 `kuaishou.py`
2. 继承 `BaseParser` 并实现 `parse()` 方法
3.`parsers/factory.py``create_parser()` 中添加平台映射
4. 在数据库 `parser_apis` 表中添加新接口配置
5.`ParserFactory.detect_platform()` 中添加 URL 检测规则
### 队列与并发控制utils/queue.py
- `ParseQueue` - 解析任务队列管理器支持Redis和内存队列双模式
- `add_task()` - 添加任务到队列
- `get_task()` - 从队列获取任务
- `complete_task()` - 完成任务并存储结果
- `get_result()` - 获取任务结果
- **降级机制**Redis 连接失败时自动降级到内存队列(重启后数据丢失)
- `ConcurrencyController` - 并发控制器
- `can_process()` - 检查是否可以处理新任务(基于 `max_concurrent` 配置)
- `wait_for_slot()` - 等待可用槽位
### 健康检查与定时任务scheduler.py
使用 APScheduler 定时检查各平台解析接口的健康状态:
- 根据 `health_check_config` 表配置的间隔执行检查
- 检查结果记录到 `health_check_logs`
- 更新 `parser_apis` 表的 `health_status``fail_count`
### 路由结构
- `routes/main.py` - 主页路由
- `routes/auth.py` - 用户认证(注册、登录、验证码、重置密码)
- `routes/parser.py` - 解析API`/api/parse`, `/api/task/<task_id>`, `/api/queue-status`
- `routes/admin.py` - 管理后台(用户管理、接口管理、配置管理、统计数据)
### 数据模型models/__init__.py
核心模型:
- `User` / `UserGroup` - 用户和分组(支持不同限流策略)
- `Admin` - 管理员支持2FA
- `ParserAPI` - 解析接口配置(支持权重、健康状态、统计数据)
- `SMTPConfig` - SMTP配置支持多配置负载均衡
- `ParseLog` / `DailyParseStat` - 解析日志和统计
- `HealthCheckConfig` / `HealthCheckLog` - 健康检查配置和日志
### 限流机制
基于用户分组的每日限流:
- 游客group_id=15次/天
- 普通用户group_id=210次/天
- VIP用户group_id=350次/天
- SVIP用户group_id=4200次/天
限流数据存储在 `daily_parse_stats` 表,按 user_id 或 ip_address 统计。
## 应用初始化流程app.py
1. 创建Flask应用并加载配置config.py
2. 初始化数据库Flask-SQLAlchemy
3. 初始化登录管理器Flask-Login
4. 初始化Redis连接支持降级到内存队列
5. 注册蓝图auth, parser, admin, main
6. 启动定时任务调度器(非调试模式或主进程)
## 环境变量配置(.env
必需配置:
- `SECRET_KEY` - Flask密钥
- `DB_HOST`, `DB_PORT`, `DB_USER`, `DB_PASSWORD`, `DB_NAME` - MySQL配置
- `REDIS_HOST`, `REDIS_PORT`, `REDIS_DB`, `REDIS_PASSWORD` - Redis配置可选失败时降级到内存队列
- `MAX_CONCURRENT` - 最大并发解析数默认3
- `SESSION_LIFETIME` - 会话过期时间默认7200
**注意**
- SMTP 配置存储在数据库 `smtp_configs` 表中,通过管理后台管理
- 站点配置Logo、标题、公告等存储在 `site_configs` 表中
- 首次运行前必须执行 `init_admin.py``init_data.py` 初始化数据
## 访问地址
- 前台首页:`http://localhost:5000`
- 管理后台:`http://localhost:5000/admin/login`默认账号shihao / 80012029Lz
- API文档参考 `API文档.md`
## 常见问题
### 数据库相关
- 修改数据库表结构后,需手动执行 SQL 更新语句(项目未使用迁移工具)
- 确保数据库字符集为 `utf8mb4`,避免 emoji 等特殊字符存储问题
### Redis 相关
- Windows 环境已包含 Redis 服务端(`Redis-x64-5.0.14.1/`
- Redis 不可用时系统会自动降级到内存队列,但重启后队列数据会丢失
- 生产环境建议使用独立的 Redis 服务
### 邮件发送
- 首次部署需在管理后台配置 SMTP或使用 `开发文档/默认SMPT.md` 中的默认配置)
- 使用 `python test_email.py` 测试邮件发送功能
- 支持多 SMTP 配置负载均衡,提高邮件发送成功率
### 解析接口
- 哔哩哔哩平台支持 3 个接口负载均衡,通过权重分配流量
- 健康检查失败会发送邮件告警给管理员
- 接口配置在 `parser_apis` 表中,可通过管理后台动态启用/禁用