Files
huangguo_server/短视频推荐接口.md
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

651 lines
13 KiB
Markdown
Raw Permalink 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.
# 短视频推荐接口
本文仅提供前端联调需要的接口变更。公共请求头、登录态、签名、加密及错误处理均沿用现有项目。
## 一、App/H5接口
### 1. 短视频推荐列表
修改现有接口:
```http
GET /api/app/recommend/vid/list?pageNumber=1&pageSize=20
```
请求:
| 字段 | 类型 | 说明 |
|---|---|---|
| `pageNumber` | int | 沿用现有传参 |
| `pageSize` | int | 固定传20 |
响应:
```json
{
"vInfos": [],
"totalPages": 100,
"hasNext": true,
"queueVersion": "20260724"
}
```
新增字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| `hasNext` | bool | 是否可以继续加载,以该字段为准 |
| `queueVersion` | string | 推荐队列版本,仅用于日志排查 |
前端不上传已看视频ID或offset,不再使用 `totalPages` 判断结束。
短视频分享时,现有接口补传视频ID
```http
POST /api/app/share/output
```
```json
{
"content": "分享链接",
"videoID": "短视频ID"
}
```
`videoID` 用于累计真实分享推荐分;旧客户端不传仍可正常生成分享内容,但不会累计本次分享分。
### 2. 免费观看次数
修改现有接口:
```http
GET /api/app/vid/user/count?vid={videoId}
```
响应增加:
```json
{
"isCan": true,
"watchCount": 2,
"totalWatchCount": 3
}
```
| 字段 | 类型 | 说明 |
|---|---|---|
| `watchCount` | uint64 | 当前剩余免费观看次数 |
| `totalWatchCount` | uint64 | 免费观看总次数,本次新增 |
传或不传 `vid` 时都返回 `totalWatchCount`
### 3. 模块配置
修改现有接口:
```http
GET /api/app/modules/list
```
排序项增加:
```json
{
"val": 2,
"name": "热门推荐",
"refreshMode": "RANDOM_TOP_N",
"randomCandidateN": 30
}
```
前端只根据 `refreshMode` 判断随机刷新,禁止匹配 `name` 或硬编码 `val`
枚举:
```text
DEFAULT
RANDOM_TOP_N
```
兼容说明:后台历史数据没有 `refreshMode` 时,后端会把稳定排序值
`val=2` 归一为 `RANDOM_TOP_N`;标题即使配置错误也不会影响刷新功能。
### 4. 亚模块热门随机刷新
新增接口:
```http
GET /api/app/vid/module/{subModuleId}/refresh
```
请求:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| `moduleSort` | int | 是 | 当前排序项的 `val` |
| `pageSize` | int | 否 | 最大30 |
| `refreshToken` | string | 是 | 每次刷新生成UUID |
响应:
```json
{
"allVideoInfo": [],
"candidateCount": 30,
"hasNext": true,
"refreshMode": "RANDOM_TOP_N",
"refreshToken": "uuid"
}
```
候选池未变化时,同一个 `refreshToken` 重试会得到相同顺序;用户主动再次下拉时
必须生成新的 `refreshToken``candidateCount` 是本次实际进入候选池的视频数,
可能小于30。`hasNext` 表示候选池中是否还有本次未返回的视频,即
`candidateCount > allVideoInfo.length`
### 5. 亚模块受限视频
搜索结果中的视频增加:
```json
{
"searchAccessTicket": "short-lived-ticket"
}
```
从搜索进入详情时携带:
```http
GET /api/app/vid/info?id={videoId}&searchAccessTicket={ticket}
```
从搜索进入播放时继续携带 `searchAccessTicket`。非搜索来源不传。
### 6. 首页更新红点
新增接口:
```http
GET /api/app/content/update-markers
```
响应:
```json
{
"homeLatestAt": "2026-07-24T08:00:00Z",
"todayLatestAt": "2026-07-24T08:00:00Z",
"modules": [
{
"moduleId": "moduleId",
"latestAt": "2026-07-24T08:00:00Z"
}
]
}
```
前端在本地保存最后查看时间并判断红点。
### 7. AI女友V2
入口展示继续读取:
```http
GET /api/app/ping/v
```
`data.aiGirlFriend=true` 时展示入口。点击后调用:
```http
POST /api/app/aimatev2/url
```
无需请求体,成功返回:
```json
{
"url": "https://example.com/ai"
}
```
前端打开 `data.url`。用户关闭页面或返回 App 后,调用:
```http
GET /api/app/mine/wallet
```
后端会在获取 URL 时自动上分,并在查询钱包时先尝试下分;钱包响应结构不变。新版不再调用 `/api/app/aimate/*`,也不再直接使用 `aiMateH5`
### 8. 获取付费引导
新增接口:
```http
GET /api/app/payment/guide?scene={scene}&videoId={videoId}
```
场景:
```text
HOME_NEW_USER
HOME_OLD_USER
VIDEO_PREVIEW_END
VIDEO_BACK
VIP_CENTER
VIP_CONTENT_UPDATE
```
响应:
```json
{
"show": true,
"configId": "configId",
"segment": "OLD_NEVER_PAID",
"style": "BOTTOM_SHEET",
"title": "查看完整影片",
"description": "开通会员后可观看",
"cover": "https://example.com/cover.jpg",
"videoIds": ["videoId"],
"productId": "productId",
"durationSeconds": 7200,
"action": {
"type": "VIP_PRODUCT",
"value": "productId"
}
}
```
`show=false` 时不弹。播放5分钟、试看3秒和App活跃3分钟均由前端计时。
用户分层枚举:
```text
NEW_NEVER_PAID
OLD_NEVER_PAID
PAID_UPGRADE
MAX_VIP
NORMAL
UNREGISTERED
```
未付费用户注册不足 24 小时按 `NEW_NEVER_PAID` 处理,达到 24 小时后按 `OLD_NEVER_PAID` 处理。免费观看次数不会改变该分层;次数用完时只关闭 `HOME_NEW_USER_FREE_TRIAL` 的展示。过期会员按 `OLD_NEVER_PAID` 处理;退款后会员权益已回收时同样按未付费处理。
### 9. 付费引导展示回执
新增接口:
```http
POST /api/app/payment/guide/impression
```
请求:
```json
{
"configId": "configId",
"scene": "VIP_CONTENT_UPDATE",
"videoId": "videoId",
"requestId": "uuid"
}
```
只有弹窗实际展示成功后调用。
回执成功后,同一用户、同一 `configId`、同一 `scene` 不再返回该引导。
### 10. 视频免费试看角标
所有视频列表对象增加:
```json
{
"showFreeTrialBadge": true,
"freeTrialRemaining": 2,
"canUseFreeTrial": true
}
```
前端直接根据 `showFreeTrialBadge` 展示角标,不自行组合判断条件。
### 11. 评论区Banner
新增接口:
```http
GET /api/app/banner/list?scene=COMMENT_TOP
```
响应:
```json
{
"list": [
{
"id": "bannerId",
"imageUrl": "https://example.com/banner.gif",
"mediaType": "GIF",
"linkType": "INTERNAL",
"linkValue": "video://detail?id=videoId",
"sort": 100
}
]
}
```
枚举:
```text
mediaType: IMAGE | GIF
linkType: INTERNAL | EXTERNAL | NONE
```
`COMMENT_TOP` 支持配置多条图片或 GIF,按 `sort` 从大到小返回,前端按返回顺序轮播。
未启用或不在有效时间内的配置不会返回;没有有效配置时返回空数组。
### 12. VIP套餐及A/B
修改现有接口:
```http
GET /api/app/vip/product
```
现有套餐字段保持不变,响应增加实验信息;每个套餐对象增加 `badgeType``badgeText`
```json
{
"experimentId": "vip-card-202607-v1",
"variant": "A",
"defaultProductId": "productId",
"list": [
{
"showType": 2,
"position": "vip",
"list": [
{
"productID": "productId",
"productName": "全尊新人卡",
"badgeType": "MOST_POPULAR",
"badgeText": "最受欢迎"
}
]
}
],
"integralList": [],
"daichong": {},
"isNewUser": true
}
```
角标枚举:
```text
MOST_POPULAR 最受欢迎
NEW_USER_OFFER 新人特惠
空值或未知值 不展示
```
前端只按套餐对象的 `badgeType` 判断是否展示角标,显示内容使用 `badgeText`;不得通过套餐名称、`sort`、数组位置或默认套餐判断。基础配置与 A/B 配置的合并由后端完成,前端不处理配置优先级。前端下单时原样回传 `experimentId``variant`。实际价格以该接口和下单结果为准。
### 13. VIP卡片统计事件
新增接口:
```http
POST /api/app/analytics/events
```
请求:
```json
{
"events": [
{
"eventId": "uuid",
"eventName": "VIP_PRODUCT_IMPRESSION",
"sessionId": "uuid",
"occurredAt": "2026-07-24T08:00:00Z",
"experimentId": "vip-card-202607-v1",
"variant": "A",
"productId": "productId"
}
]
}
```
事件:
```text
VIP_CARD_PAGE_VIEW
VIP_PRODUCT_IMPRESSION
VIP_CARD_CLOSE_WITHOUT_PURCHASE
```
曝光必须在UI实际展示后上报。
### 14. 创建订单
修改现有接口:
```http
POST /api/app/mine/topay
```
新增非必填字段:
```json
{
"sourcePage": "VIDEO_BOTTOM_SHEET",
"sourceRef": "videoId",
"videoId": "videoId",
"activityId": "activityId",
"experimentId": "vip-card-202607-v1",
"experimentVariant": "A",
"sessionId": "uuid"
}
```
来源枚举:
```text
HOME_USER_SEGMENT
VIDEO_BOTTOM_BANNER
VIDEO_BOTTOM_SHEET
VIP_CENTER
H5_ACTIVITY
UNKNOWN
```
### 15. 动漫漫画最新列表
修改现有接口:
```http
GET /api/app/media/list?pageNumber=1&pageSize=20
```
媒体对象增加:
```json
{
"updateTime": "2026-07-24T08:00:00Z",
"latestPublishedAt": "2026-07-24T08:00:00Z"
}
```
前端按后端返回顺序展示,不自行排序。
## 二、管理后台接口
### 1. 亚模块配置
修改现有:
```text
POST /api/web/admin/module/conf/add
POST /api/web/admin/module/conf/edit
```
增加:
```json
{
"onlineAt": "2026-07-24T00:00:00Z",
"offlineAt": "2026-08-24T00:00:00Z",
"excludeLatest": true,
"excludeRecommend": false,
"searchOnlyWhenInactive": true,
"haiJiaoStyle": {
"sortRules": [
{
"val": 2,
"name": "热门推荐",
"refreshMode": "RANDOM_TOP_N",
"randomCandidateN": 30
}
]
}
}
```
### 2. 付费引导配置
```text
GET /api/web/admin/payment-guide/list
POST /api/web/admin/payment-guide/add
POST /api/web/admin/payment-guide/edit
DELETE /api/web/admin/payment-guide/delete?id={id}
```
新增/编辑使用完整配置对象,编辑时必须带 `id`
```json
{
"id": "编辑时必传,新增不传",
"scene": "VIDEO_PREVIEW_END",
"segments": ["OLD_NEVER_PAID"],
"style": "BOTTOM_SHEET",
"title": "查看完整影片",
"description": "开通会员后可观看",
"cover": "https://example.com/cover.jpg",
"videoIds": ["videoId"],
"productId": "productId",
"durationSeconds": 7200,
"action": {
"type": "VIP_PRODUCT",
"value": "productId"
},
"enable": true,
"sort": 100,
"startAt": "2026-07-24T00:00:00Z",
"endAt": "2026-08-24T00:00:00Z"
}
```
`startAt/endAt` 可不传;编辑时不传表示清空时间限制。
`segments` 传空数组表示所有用户分层。已展示过的配置如果要重新触达用户,应新增
配置生成新的 `configId`,不要直接复用原配置。
### 3. 评论Banner配置
```text
GET /api/web/admin/banner/list?scene=COMMENT_TOP
POST /api/web/admin/banner/add
POST /api/web/admin/banner/edit
DELETE /api/web/admin/banner/delete?id={id}
```
新增/编辑使用完整配置对象,编辑时必须带 `id`
```json
{
"id": "编辑时必传,新增不传",
"scene": "COMMENT_TOP",
"imageUrl": "https://example.com/banner.gif",
"mediaType": "GIF",
"linkType": "INTERNAL",
"linkValue": "video://detail?id=videoId",
"sort": 100,
"enable": true,
"startAt": "2026-07-24T00:00:00Z",
"endAt": "2026-08-24T00:00:00Z"
}
```
`COMMENT_TOP` 支持新增多条配置。每条配置独立设置图片/GIF、内外链、排序、启用状态及
上下架时间;前端按 App 接口返回顺序轮播。
### 4. VIP卡片实验
```text
GET /api/web/admin/vip-card-experiment/current
POST /api/web/admin/vip-card-experiment/publish
POST /api/web/admin/vip-card-experiment/disable
GET /api/web/admin/vip-card-experiment/statistics?experimentId={id}
```
发布请求中的每个变体增加套餐角标配置:
```json
{
"variantA": {
"defaultProductId": "productId",
"productIds": {
"1": "第1张卡片的productId",
"2": "第2张卡片的productId"
},
"productBadges": [
{
"productId": "productId",
"badgeType": "MOST_POPULAR",
"badgeText": "最受欢迎"
}
]
}
}
```
`productIds` 的 key 是从 `1` 开始且连续的卡片顺序,value 是商品ID;发布和查询接口均使用该结构。
同一变体内排序号和商品ID都不能重复。App/H5 套餐接口保持旧版本的独立 `position` 分组和外层顺序:
会员卡、预售卡仍分别返回;同一分组内严格按该数字顺序排列,不支持跨 `position` 穿插排序。
同一变体最多配置一个 `MOST_POPULAR``productId` 必须属于该变体的 `productIds`
### 5. 免费试看角标开关
复用现有系统配置接口,配置项:
```text
freeTrialBadgeEnabled = true | false
```
### 6. 动漫漫画更新
复用现有接口:
```text
POST /api/web/admin/media/update
POST /api/web/admin/media_content/create
POST /api/web/admin/media_content/update
```
列表响应增加:
```json
{
"contentUpdateTime": "2026-07-24T08:00:00Z",
"latestPublishedAt": "2026-07-24T08:00:00Z"
}
```
### 7. 视频置顶排序
复用现有视频编辑接口。`sort` 放开0~99限制,并允许多个视频填写相同值。前端不需要交换或修改其他视频的排序号。
## 三、无需新增后端接口
- 金币支付半屏:复用现有支付接口。
- 播放页Banner放大:纯UI。
- 删除支付温馨提示:纯UI。
- iOS搜索回车:纯客户端事件。