rank_backend/docs/API接口文档.md
Qyir be44334960 解决封面图片过期情况,存入TOS中media/rank/目录中
热播总榜选择日期之后永久显示图片。
2025-10-20 18:47:49 +08:00

960 lines
19 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.

# 抖音播放量数据API接口文档
## 概述
本API服务提供抖音播放量数据和文章内容的查询、搜索、统计等功能专为小程序优化设计。
**基础信息**
- 服务地址:`http://localhost:5001`
- 数据源MongoDB数据库
- 数据更新每晚24:00自动更新
- 响应格式JSON
## 通用响应格式
所有API接口都遵循以下响应格式
```json
{
"success": true,
"data": {},
"message": "操作成功",
"update_time": "2025-10-17 15:30:00"
}
```
**字段说明**
- `success`: 请求是否成功
- `data`: 返回的数据内容
- `message`: 操作结果描述
- `update_time`: 数据更新时间
## 数据模型
### 合集数据项
```json
{
"_id": "674f1234567890abcdef",
"batch_time": "2025-10-17 15:30:00",
"mix_name": "合集名称",
"video_url": "https://www.douyin.com/video/xxx",
"playcount": "1.2亿",
"play_vv": 120000000,
"request_id": "request_xxx",
"rank": 1,
"cover_image_url": "https://p3.douyinpic.com/xxx"
}
```
### 文章数据项
```json
{
"_id": "68f3ad112ba085e5d676537e",
"title": "文章标题",
"author_id": "test_user_1",
"cover_image": "封面图片URL",
"status": "draft",
"summary": "文章摘要",
"created_at": "2025-10-18 15:06:57",
"likes": [],
"likes_count": 0
}
```
### 文章详情数据项
```json
{
"_id": "68f3ad112ba085e5d676537e",
"title": "文章标题",
"content": "文章完整内容",
"author_id": "test_user_1",
"cover_image": "封面图片URL",
"status": "draft",
"summary": "文章摘要",
"created_at": "2025-10-18 15:06:57",
"likes": [],
"likes_count": 0
}
```
### 分页信息
```json
{
"pagination": {
"page": 1,
"limit": 20,
"total": 100,
"pages": 5,
"has_next": true,
"has_prev": false
}
}
```
## API接口列表
### 1. 首页信息
**接口地址**
```
GET /
```
**功能描述**
获取API服务的基本信息和所有可用接口列表
**请求参数**
**响应示例**
```json
{
"success": true,
"data": {
"name": "抖音播放量数据API服务",
"version": "2.0",
"description": "主程序服务 - 整合小程序API功能",
"endpoints": {
"/api/rank/videos": "获取视频列表 (支持分页和排序)",
"/api/rank/top": "获取热门视频榜单",
"/api/rank/search": "搜索视频",
"/api/rank/detail": "获取视频详情",
"/api/rank/stats": "获取统计信息",
"/api/rank/health": "健康检查",
"/api/rank/rankings": "获取榜单列表",
"/api/rank/rankings/dates": "获取可用榜单日期",
"/api/rank/rankings/types": "获取榜单类型",
"/api/rank/rankings/latest": "获取最新榜单",
"/api/rank/rankings/stats": "获取榜单统计",
"/api/article/list": "获取文章列表 (支持分页和排序)",
"/api/article/search": "搜索文章",
"/api/article/detail": "获取文章详情",
"/api/article/stats": "获取文章统计信息",
"/api/article/health": "文章服务健康检查"
},
"features": [
"分页支持",
"多种排序方式",
"搜索功能",
"详情查看",
"统计分析",
"榜单查询",
"动态排序",
"小程序优化",
"文章管理",
"内容搜索"
]
}
}
```
### 2. 获取视频列表
**接口地址**
```
GET /api/rank/videos
```
**功能描述**
获取分页的视频合集列表,支持多种排序方式
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| page | int | 否 | 1 | 页码 |
| limit | int | 否 | 20 | 每页数量 |
| sort | string | 否 | playcount | 排序方式playcount(播放量) / growth(增长量) |
| start_date | string | 否 | 昨天 | 增长计算开始日期(格式: YYYY-MM-DD)仅在sort=growth时有效 |
| end_date | string | 否 | 今天 | 增长计算结束日期(格式: YYYY-MM-DD)仅在sort=growth时有效 |
**数据源说明**
- `sort=playcount`从Rankings_list集合动态查询当日播放量数据
- `sort=growth`从Ranking_storage集合读取预计算的增长排名数据由定时任务生成
**使用示例**
```
# 按播放量排序
GET /api/rank/videos?page=1&limit=20&sort=playcount
# 按增长量排序(默认昨天到今天的增长)
GET /api/rank/videos?page=1&limit=20&sort=growth
# 按自定义日期范围的增长排序
GET /api/rank/videos?page=1&limit=20&sort=growth&start_date=2025-10-16&end_date=2025-10-17
```
**响应示例**
```json
{
"success": true,
"data": [
{
"_id": "674f1234567890abcdef",
"batch_time": "2025-10-17 15:30:00",
"mix_name": "热门合集1",
"video_url": "https://www.douyin.com/video/xxx",
"playcount": "1.2亿",
"play_vv": 120000000,
"request_id": "request_xxx",
"rank": 1,
"cover_image_url": "https://p3.douyinpic.com/xxx",
"growth": 5000000,
"growth_rate": 4.35
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 100,
"pages": 5,
"has_next": true,
"has_prev": false
},
"sort_by": "growth",
"data_source": "ranking_storage",
"update_time": "2025-10-17 15:30:00"
}
```
### 3. 获取热门榜单
**接口地址**
```
GET /api/rank/top
```
**功能描述**
获取热门视频榜单(按播放量排序)
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| limit | int | 否 | 10 | 返回数量 |
**使用示例**
```
GET /api/rank/top?limit=10
```
**响应示例**
```json
{
"success": true,
"data": [
{
"_id": "674f1234567890abcdef",
"batch_time": "2025-10-17 15:30:00",
"mix_name": "热门合集1",
"video_url": "https://www.douyin.com/video/xxx",
"playcount": "1.2亿",
"play_vv": 120000000,
"request_id": "request_xxx",
"rank": 1,
"cover_image_url": "https://p3.douyinpic.com/xxx"
}
],
"total": 10,
"update_time": "2025-10-17 15:30:00"
}
```
### 4. 搜索视频
**接口地址**
```
GET /api/rank/search
```
**功能描述**
根据关键词搜索视频合集
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| q | string | 是 | - | 搜索关键词 |
| page | int | 否 | 1 | 页码 |
| limit | int | 否 | 10 | 每页数量 |
**使用示例**
```
GET /api/rank/search?q=关键词&page=1&limit=10
```
**响应示例**
```json
{
"success": true,
"data": [
{
"_id": "674f1234567890abcdef",
"batch_time": "2025-10-17 15:30:00",
"mix_name": "包含关键词的合集",
"video_url": "https://www.douyin.com/video/xxx",
"playcount": "1.2亿",
"play_vv": 120000000,
"request_id": "request_xxx",
"rank": 1,
"cover_image_url": "https://p3.douyinpic.com/xxx"
}
],
"keyword": "关键词",
"pagination": {
"page": 1,
"limit": 10,
"total": 15,
"pages": 2,
"has_next": true,
"has_prev": false
},
"update_time": "2025-10-17 15:30:00"
}
```
### 5. 获取视频详情
**接口地址**
```
GET /api/rank/detail
```
**功能描述**
获取指定合集的详细信息
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| id | string | 是 | - | 合集ID支持ObjectId、合集名称、request_id |
**使用示例**
```
GET /api/rank/detail?id=674f1234567890abcdef
```
**响应示例**
```json
{
"success": true,
"data": {
"_id": "674f1234567890abcdef",
"batch_time": "2025-10-17 15:30:00",
"mix_name": "合集名称",
"video_url": "https://www.douyin.com/video/xxx",
"playcount": "1.2亿",
"play_vv": 120000000,
"request_id": "request_xxx",
"rank": 1,
"cover_image_url": "https://p3.douyinpic.com/xxx"
},
"update_time": "2025-10-17 15:30:00"
}
```
### 6. 获取统计信息
**接口地址**
```
GET /api/rank/stats
```
**功能描述**
获取系统统计信息
**请求参数**
**响应示例**
```json
{
"success": true,
"data": {
"total_mixes": 1000,
"total_playcount": 5000000000,
"avg_playcount": 5000000,
"max_playcount": 200000000,
"min_playcount": 1000,
"categories": [
{
"name": "超热门",
"min": 100000000,
"count": 5
},
{
"name": "热门",
"min": 50000000,
"max": 99999999,
"count": 20
},
{
"name": "中等",
"min": 10000000,
"max": 49999999,
"count": 150
},
{
"name": "一般",
"min": 0,
"max": 9999999,
"count": 825
}
],
"latest_update": "2025-10-17 15:30:00"
},
"update_time": "2025-10-17 15:30:00"
}
```
### 7. 健康检查
**接口地址**
```
GET /api/rank/health
```
**功能描述**
检查服务状态和数据库连接
**请求参数**
**响应示例**
```json
{
"success": true,
"message": "服务正常",
"data": {
"database": "连接正常",
"total_records": 1000,
"timestamp": "2025-10-17 15:30:00"
}
}
```
### 8. 获取榜单列表
**接口地址**
```
GET /api/rank/rankings
```
**功能描述**
获取榜单列表,支持按日期和类型查询,支持动态排序
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| date | string | 否 | 最新日期 | 日期格式YYYY-MM-DD |
| type | string | 否 | - | 榜单类型playcount(播放量榜) / growth(增长榜) / newcomer(新晋榜) |
| sort_by | string | 否 | default | 排序方式default / play_vv_change / play_vv_change_rate / play_vv |
| sort_order | string | 否 | desc | 排序顺序asc / desc |
| page | int | 否 | 1 | 页码 |
| limit | int | 否 | 50 | 每页数量 |
**使用示例**
```
# 获取最新日期的所有榜单
GET /api/rank/rankings
# 获取指定日期的播放量榜
GET /api/rank/rankings?date=2025-01-17&type=playcount
# 按播放量变化排序
GET /api/rank/rankings?sort_by=play_vv_change&sort_order=desc
# 分页获取增长榜
GET /api/rank/rankings?type=growth&page=1&limit=20
```
**响应示例**
```json
{
"success": true,
"message": "获取榜单成功",
"data": {
"rankings": [
{
"date": "2025-01-17",
"ranking_type": "playcount",
"ranking_name": "播放量榜",
"description": "按播放量排序的榜单",
"data": [
{
"_id": "674f1234567890abcdef",
"mix_name": "热门合集1",
"play_vv": 120000000,
"rank": 1,
"timeline_data": {
"play_vv_change": 5000000,
"play_vv_change_rate": 4.35
}
}
],
"total_count": 100,
"current_page_count": 20,
"generated_at": "2025-01-17 15:30:00",
"version": "1.0",
"sort_info": {
"sort_by": "default",
"sort_order": "desc"
}
}
],
"total": 1,
"page": 1,
"limit": 50,
"sort_by": "default",
"sort_order": "desc"
}
}
```
### 9. 获取可用榜单日期
**接口地址**
```
GET /api/rank/rankings/dates
```
**功能描述**
获取所有可用的榜单日期列表
**请求参数**
**响应示例**
```json
{
"success": true,
"message": "获取日期列表成功",
"data": {
"dates": [
"2025-01-17",
"2025-01-16",
"2025-01-15"
],
"total": 3
}
}
```
### 10. 获取榜单类型
**接口地址**
```
GET /api/rank/rankings/types
```
**功能描述**
获取支持的榜单类型及其说明
**请求参数**
**响应示例**
```json
{
"success": true,
"message": "获取榜单类型成功",
"data": {
"types": [
{
"type": "playcount",
"description": "播放量榜 - 按播放量排序"
},
{
"type": "growth",
"description": "增长榜 - 播放量增长最快"
},
{
"type": "newcomer",
"description": "新晋榜 - 新上榜内容"
}
],
"total": 3
}
}
```
### 11. 获取最新榜单
**接口地址**
```
GET /api/rank/rankings/latest
```
**功能描述**
获取最新日期的所有类型榜单每个榜单只返回前20条数据
**请求参数**
**响应示例**
```json
{
"success": true,
"message": "获取最新榜单成功",
"data": {
"date": "2025-01-17",
"rankings": [
{
"ranking_type": "playcount",
"ranking_name": "播放量榜",
"description": "按播放量排序的榜单",
"data": [
{
"_id": "674f1234567890abcdef",
"mix_name": "热门合集1",
"play_vv": 120000000,
"rank": 1
}
],
"total_count": 100,
"preview_count": 20
}
],
"total_types": 3
}
}
```
### 12. 获取榜单统计
**接口地址**
```
GET /api/rank/rankings/stats
```
**功能描述**
获取榜单系统的统计信息
**请求参数**
**响应示例**
```json
{
"success": true,
"message": "获取榜单统计成功",
"data": {
"total_rankings": 150,
"total_dates": 30,
"total_types": 3,
"latest_date": "2025-01-17",
"earliest_date": "2024-12-18",
"date_range": "2024-12-18 至 2025-01-17"
}
}
```
## 错误处理
### 通用错误格式
```json
{
"success": false,
"message": "错误描述",
"update_time": "2025-10-17 15:30:00"
}
```
### 常见错误
- `数据库连接失败`MongoDB连接异常
- `未找到合集信息`:查询的合集不存在
- `未找到文章信息`:查询的文章不存在
- `请提供搜索关键词`:搜索接口缺少关键词参数
- `获取数据失败`:数据查询异常
## 文章管理接口
### 1. 获取文章列表
**接口地址**
```
GET /api/article/list
```
**功能描述**
获取文章列表,支持分页和排序
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| page | int | 否 | 1 | 页码 |
| limit | int | 否 | 10 | 每页数量 |
| sort | string | 否 | created_at | 排序字段 |
| order | string | 否 | desc | 排序方向 (asc/desc) |
**响应示例**
```json
{
"success": true,
"data": [
{
"_id": "68f3ad112ba085e5d676537e",
"title": "对于ai影视化的思考",
"author_id": "test_user_1",
"cover_image": "",
"status": "draft",
"summary": "AI影视化的发展趋势和思考",
"created_at": "2025-10-18 15:06:57",
"likes": [],
"likes_count": 0
}
],
"pagination": {
"current_page": 1,
"total_pages": 1,
"total_items": 1,
"has_next": false,
"has_prev": false
},
"message": "获取文章列表成功",
"update_time": "2025-10-18 15:06:57"
}
```
### 2. 搜索文章
**接口地址**
```
GET /api/article/search
```
**功能描述**
根据关键词搜索文章
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| q | string | 是 | - | 搜索关键词 |
| page | int | 否 | 1 | 页码 |
| limit | int | 否 | 10 | 每页数量 |
**响应示例**
```json
{
"success": true,
"data": [
{
"_id": "68f3ad112ba085e5d676537e",
"title": "对于ai影视化的思考",
"author_id": "test_user_1",
"cover_image": "",
"status": "draft",
"summary": "AI影视化的发展趋势和思考",
"created_at": "2025-10-18 15:06:57",
"likes": [],
"likes_count": 0
}
],
"pagination": {
"current_page": 1,
"total_pages": 1,
"total_items": 1,
"has_next": false,
"has_prev": false
},
"message": "搜索文章成功",
"update_time": "2025-10-18 15:06:57"
}
```
### 3. 获取文章详情
**接口地址**
```
GET /api/article/detail
```
**功能描述**
根据文章ID获取文章详细信息
**请求参数**
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|--------|------|------|--------|------|
| id | string | 是 | - | 文章ID |
**响应示例**
```json
{
"success": true,
"data": {
"_id": "68f3ad112ba085e5d676537e",
"title": "对于ai影视化的思考",
"content": "# AI影视化的思考\n\n在2025年AI技术在影视行业的应用...",
"author_id": "test_user_1",
"cover_image": "",
"status": "draft",
"summary": "AI影视化的发展趋势和思考",
"created_at": "2025-10-18 15:06:57",
"likes": [],
"likes_count": 0
},
"message": "获取文章详情成功",
"update_time": "2025-10-18 15:06:57"
}
```
### 4. 获取文章统计信息
**接口地址**
```
GET /api/article/stats
```
**功能描述**
获取文章相关的统计信息
**请求参数**
**响应示例**
```json
{
"success": true,
"data": {
"total_articles": 1,
"latest_update": "2025-10-18 15:06:57",
"status_count": {
"draft": 1,
"published": 0,
"archived": 0
}
},
"message": "获取文章统计成功",
"update_time": "2025-10-18 15:06:57"
}
```
### 5. 文章服务健康检查
**接口地址**
```
GET /api/article/health
```
**功能描述**
检查文章服务和数据库连接状态
**请求参数**
**响应示例**
```json
{
"success": true,
"data": {
"status": "服务正常",
"database": "连接正常",
"article_count": 1
},
"message": "文章服务健康检查通过",
"update_time": "2025-10-18 15:06:57"
}
```
## 小程序使用建议
### 1. 分页加载
推荐使用分页加载,避免一次性加载过多数据:
```javascript
// 小程序端示例
wx.request({
url: 'http://localhost:5000/api/rank/videos',
data: {
page: 1,
limit: 20,
sort: 'playcount'
},
success: (res) => {
if (res.data.success) {
this.setData({
videos: res.data.data,
hasNext: res.data.pagination.has_next
})
}
}
})
```
### 2. 搜索优化
- 使用防抖处理搜索请求
- 显示搜索进度和结果数量
- 提供搜索建议
### 3. 图片加载
- 使用 `cover_image_url` 作为封面图片
- 添加图片加载失败处理
### 4. 数据更新
- 注意 `update_time` 字段,判断数据新鲜度
- 合理使用缓存策略
- 定期检查服务健康状态
### 5. 文章管理
推荐的文章列表加载方式:
```javascript
// 小程序端示例 - 文章列表
wx.request({
url: 'http://localhost:5001/api/article/list',
data: {
page: 1,
limit: 10,
sort: 'created_at',
order: 'desc'
},
success: (res) => {
if (res.data.success) {
this.setData({
articles: res.data.data,
hasNext: res.data.pagination.has_next
})
}
}
})
```
文章搜索示例:
```javascript
// 小程序端示例 - 文章搜索
wx.request({
url: 'http://localhost:5001/api/article/search',
data: {
q: 'AI',
page: 1,
limit: 5
},
success: (res) => {
if (res.data.success) {
this.setData({
searchResults: res.data.data
})
}
}
})
```
## 部署说明
### 启动服务
```bash
cd /Users/binghuixiong/剧变AI/rank_backend
python3 app.py
```
### 服务信息
- 端口5001
- 数据库MongoDB (localhost:27017)
- 数据库名kemeng_media
- 数据更新每晚24:00自动执行
### 注意事项
- 确保MongoDB服务已启动
- 确保网络连接正常
- 小程序端需要配置合法域名(生产环境)
---
**文档版本**v4.1
**最后更新**2025-01-18
**维护者**:系统自动生成
**更新内容**优化增长排名接口数据源策略现在专门使用Ranking_storage预计算数据提升查询性能和数据一致性