Merge pull request #1374 from pskdje/patch-live-beta1

更新直播回放接口和直播信息流,添加直播投票和直播数据文档
This commit is contained in:
z0z0r4 2025-09-19 11:32:36 +08:00 committed by GitHub
commit a9586685f8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 2837 additions and 182 deletions

View File

@ -268,6 +268,8 @@ B站 API 采用 C/S 结构,大多数接口为 REST API 和 gRPC少部分接
- [ ] [礼物相关](docs/live/gift.md)
- [ ] [大航海/粉丝团](docs/live/guard.md)
- [ ] [直播回放](docs/live/live_replay.md)
- [ ] [直播数据](docs/live/live_data.md)
- [ ] [直播投票](docs/live/live_vote.md)
- [ ] [活动](docs/activity)
- [ ] [活动列表](docs/activity/list.md)
- [ ] [活动主题信息](docs/activity/info.md)

183
docs/live/live_data.md Normal file
View File

@ -0,0 +1,183 @@
# 直播数据
## 获取直播场次的直播数据
> https://api.live.bilibili.com/xlive/app-blink/v1/live/StopLiveData
*请求方法: GET*
认证方式: Cookie (SESSDATA)
只能获取自己的直播数据。最好在直播结束时立即请求,否则直播时长可能不准确。
**URL参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| live_key | str | 标记直播场次的key | 必要 | 若不提供将会获得无效数据 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | 0成功<br />-101未登录 |
| message | str | 提示信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| LiveTime | num | 该直播场次的直播时长 | 单位:秒,直播结束后还会增长 |
| AddFans | num | 该直播场次的新增粉丝 | |
| HamsterRmb | num | 该直播场次的收益 | |
| NewFansClub | num | 该直播场次新获得粉丝勋章数量 | |
| DanmuNum | num | 该直播场次的弹幕条数 | |
| MaxOnline | num | 该直播场次的最大在线? | [需要验证] |
| WatchedCount | num | 该直播场次的看过人数 | |
**示例:**
获取自己的直播数据
```shell
curl 'https://api.live.bilibili.com/xlive/app-blink/v1/live/StopLiveData?live_key=634808443264569139' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"LiveTime": 77603,
"AddFans": 0,
"HamsterRmb": 0,
"NewFansClub": 0,
"DanmuNum": 3,
"MaxOnline": 13,
"WatchedCount": 2
}
}
```
</details>
## 获取直播表现
> https://api.live.bilibili.com/xlive/app-blink/v1/date/Overview
*请求方法: GET*
认证方式: Cookie (SESSDATA)
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | 0成功<br />-101未登录 |
| message | str | 提示信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| graph | arr | 图表数据 | 在界面显示为雷达图 |
| propose | null | (?) | |
`data.graph` 数组:
| 索引 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| 0 | obj | 数据类别 | |
| … | obj | 数据类别 | |
`data.graph` 数组中对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| name | str | 显示的名称 | |
| index | str | 类别标识 | |
| me | num | 自己在这个类别的数值 | |
| max | num | 这个类别最外侧那条线的数值 | |
| aver | num | 同水平主播在这个类别的数值 | |
**示例:**
获取自己的直播表现
```shell
curl 'https://api.live.bilibili.com/xlive/app-blink/v1/date/Overview' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"graph": [
{
"name": "收益",
"index": "income",
"me": 0,
"max": 9.27,
"aver": 8.04
},
{
"name": "累计观看",
"index": "watchedCount",
"me": 5.13,
"max": 7.01,
"aver": 6.17
},
{
"name": "新增粉丝",
"index": "fans",
"me": 0,
"max": 2.58,
"aver": 0
},
{
"name": "用户平均观看时长",
"index": "watchTime",
"me": 9.31,
"max": 11.82,
"aver": 10.88
},
{
"name": "开播时长",
"index": "broadcast",
"me": 17.57,
"max": 17.42,
"aver": 16.6
},
{
"name": "弹幕数量",
"index": "barrage",
"me": 7.37,
"max": 8.02,
"aver": 6.91
}
],
"propose": null
}
}
```
</details>

View File

@ -40,6 +40,8 @@
| pagination | obj | 分页信息 | |
| archive_flag | bool | (?) | 作用尚不明确 |
| can\_edit | num | (?) | 作用尚不明确 |
| can_upload | bool | (?) | 作用尚不明确 |
| has_third_platform_live| bool | (?) | 作用尚不明确 |
`data.replay_info` 数组中的对象:
@ -62,6 +64,7 @@
| cover | str | 直播封面 | |
| live_time | num | 直播时间 | 同`data.replay_info[i].start_time` |
| live_type | num | 直播类型? | 作用尚不明确 |
| platform | str | 直播平台 | |
`data.replay_info[i].video_info` 对象:
@ -111,65 +114,69 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorGetRepl
"data": {
"replay_info": [
{
"replay_id": 10707737,
"replay_id": 13517082,
"live_info": {
"title": "",
"title": "随缘摸鱼",
"cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png",
"live_time": 1747509268,
"live_type": 1
"live_time": 1756479520,
"live_type": 1,
"platform": "android_link"
},
"video_info": {
"replay_status": 2,
"replay_status": -8,
"estimated_time": "1970-01-01 08:00:00",
"duration": 1820,
"duration": 9350,
"alert_code": 2,
"alert_message": "录像时长远小于开播时长,请关注直播时网络状况"
},
"alarm_info": {
"code": 2,
"message": "录像生成失败,请稍后再试",
"cur_time": 1747557808,
"code": -8,
"message": "直播内容存在违规片段",
"cur_time": 1756496581,
"is_ban_publish": false
},
"room_id": 18992371,
"live_key": "609043243693510451",
"start_time": 1747509268,
"end_time": 1747511088
"room_id": 1899237171,
"live_key": "637117671085969203",
"start_time": 1756479520,
"end_time": 1756488870
},
{
"replay_id": 10707664,
"replay_id": 13487274,
"live_info": {
"title": "",
"title": "随缘摸鱼",
"cover": "https://i0.hdslb.com/bfs/live/59fc254c1f51a962dbf69ae85e4920f2f6fb8dcd.png",
"live_time": 1747508293,
"live_type": 1
"live_time": 1756385910,
"live_type": 1,
"platform": "android_link"
},
"video_info": {
"replay_status": 2,
"estimated_time": "1970-01-01 08:00:00",
"duration": 206,
"duration": 14985,
"alert_code": 2,
"alert_message": "录像时长远小于开播时长,请关注直播时网络状况"
},
"alarm_info": {
"code": 2,
"message": "录像生成失败,请稍后再试",
"cur_time": 1747557808,
"cur_time": 1756496581,
"is_ban_publish": false
},
"room_id": 18992371,
"live_key": "609041817764368179",
"start_time": 1747508293,
"end_time": 1747508499
"room_id": 1899237171,
"live_key": "636823272552664883",
"start_time": 1756385910,
"end_time": 1756400895
}
],
"pagination": {
"page": 1,
"page_size": 2,
"total": 29
"total": 16
},
"archive_flag": false,
"can_edit": 1
"can_edit": 1,
"can_upload": false,
"has_third_platform_live": false
}
}
```
@ -469,7 +476,7 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/DeleteSliceDr
鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同
未生成整场直播回放时将进行生成。
是否生成回放取决于回放状态,处于可生成回放状态且未生成整场直播回放时将进行生成。
**正文参数( application/x-www-form-urlencoded **
@ -486,7 +493,7 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/DeleteSliceDr
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -101未登录<br />-111csrf校验失败<br />0成功<br />100非法参数<br />210回放id或场次key无效 |
| code | num | 返回值 | -101未登录<br />-111csrf校验失败<br />0成功<br />100非法参数<br />210回放id或场次key无效<br />217未找到直播录像 |
| message | str | 错误信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | |
@ -634,7 +641,7 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVide
</details>
## 轮询回放合成状态
## 轮询回放状态
> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVideoUidRecord
@ -769,7 +776,8 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVide
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| list | arr | 直播回放视频列表 | 如果该场回放没有视频流将为`null` |
| list | arr 或 null | 直播回放视频列表 | 如果该场回放没有视频流将为`null` |
| ban_list | null 或 arr | 不可发布的回放时间 | 如果该场回放没有不可发布的时间将为`null` |
`data.list` 数组中的对象:
@ -780,12 +788,19 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVide
| stream | str | 直播回放视频流 | |
| type | num | 类型? | 2一般回放? |
`data.ban_list` 数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| start_time | num | 不可发布片段的开始时间戳 | Unix秒时间戳 |
| end_time | num | 不可发布片段的结束时间戳 | Unix秒时间戳 |
**示例:**
获取某个场次的视频流
```shell
curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStream?live_key=607113721045847859&start_time=1746863101&end_time=1746879299' \
curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStream?live_key=637117671085969203&start_time=1756479520&end_time=1756488870' \
-b 'SESSDATA=xxx'
```
@ -800,22 +815,16 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStrea
"data": {
"list": [
{
"start_time": 1746863103,
"end_time": 1746879246,
"stream": "https://bvc-live.bilivideo.com/hls-record-gateway/videoPlay?biz_id=live2vod-clip&end_time=1746879246&header_name=1746863103.m4s&host_id=edge-hls-bvc-self-cn-jsyz-ct-03-59-6d854b4bd8-gnlb7&no_end=0&schema=https&sign=12f649dd540096672745d60b84f18eda&start_time=1746863103&stream_name=live_438160221_32373699&ts=1752930893&version=2",
"start_time": 1756479528,
"end_time": 1756488870,
"stream": "https://bvc-live.bilivideo.com/hls-record-gateway/videoPlay?none=为了防止信息泄露,不提供完整链接。目前该视频流可以获取违规片段的视频。",
"type": 2
},
}
],
"ban_list": [
{
"start_time": 1746879267,
"end_time": 1746879269,
"stream": "https://bvc-live.bilivideo.com/hls-record-gateway/videoPlay?biz_id=live2vod-clip&end_time=1746879269&header_name=1746863104.m4s&host_id=edge-hls-bvc-self-cn-jsyz-ct-03-59-6d854b4bd8-gnlb7&no_end=0&schema=https&sign=5c63605f1fa88561a6257b6812725b4f&start_time=1746879267&stream_name=live_438160221_32373699&ts=1752930893&version=2",
"type": 2
},
{
"start_time": 1746879269,
"end_time": 1746879298,
"stream": "https://bvc-live.bilivideo.com/hls-record-gateway/videoPlay?biz_id=live2vod-clip&end_time=1746879298&header_name=1746863105.m4s&host_id=edge-hls-bvc-self-cn-jsyz-ct-03-59-6d854b4bd8-gnlb7&no_end=0&schema=https&sign=70929627354f4380b54b97fcdb69c8a2&start_time=1746879269&stream_name=live_438160221_32373699&ts=1752930893&version=2",
"type": 2
"start_time": 1756487070,
"end_time": 1756488870
}
]
}
@ -837,8 +846,8 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStrea
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| live_key | str | 标记直播场次的key | 必要 | |
| start_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd+HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 |
| end_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd+HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 |
| start_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 |
| end_tm | str | 开始时间 | 必要 | 格式为`yyyy-mm-dd HH:MM:SS`,时区为`UTC+08:00`(中国标准时间);取值对实际无影响 |
| web_location | str | (?) | |
**json回复**
@ -862,6 +871,7 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStrea
| max_value | num | (?) | 效果未知 |
| high_light_data | arr | 高光时刻数据 | |
| ass_url | str | ASS字幕链接 | 用作弹幕显示 |
| high_light_stat | obj | 高亮状态信息 | |
`data.session_data` 数组中的对象:
@ -882,6 +892,15 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetSliceStrea
| cover | str | (?) | 目前为`""` |
| extra | str | (?) | 目前为`""` |
`data.high_light_stat` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| original_hl | num | “高光时刻”数量 | 有“高光时刻”时存在 |
| manual_hl | num | “已保存”数量 | 有“已保存”时存在,调用[手动保存高亮片段](#手动保存高亮片段)进行保存 |
注: 可能还存在一个“回溯录制”的字段。
**示例:**
获取场次key为`607113721045847859`的会话数据
@ -902,144 +921,241 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetLiveSessio
"data": {
"session_data": [
{
"ts": 1746863100,
"ts": 1752927300,
"value": 0
},
{
"ts": 1746863160,
"ts": 1752927360,
"value": 0
},
{
"ts": 1746863220,
"ts": 1752927420,
"value": 0
},
// 省略掉大部分重复内容
{
"ts": 1752946620,
"value": 0
},
{
"ts": 1746863280,
"ts": 1752946680,
"value": 0
},
{
"ts": 1746863340,
"value": 0
},
{
"ts": 1746863400,
"value": 0
},
{
"ts": 1746863460,
"value": 0
},
{
"ts": 1746863520,
"value": 0
},
{
"ts": 1746863580,
"value": 0
},
{
"ts": 1746863640,
"value": 0
},
{
"ts": 1746863700,
"value": 0
},
{
"ts": 1746863760,
"value": 0
},
{
"ts": 1746863820,
"value": 0
},
// 省略100多条数据
{
"ts": 1746878520,
"value": 0
},
{
"ts": 1746878580,
"value": 0
},
{
"ts": 1746878640,
"value": 0
},
{
"ts": 1746878700,
"value": 0
},
{
"ts": 1746878760,
"value": 0
},
{
"ts": 1746878820,
"value": 0
},
{
"ts": 1746878880,
"value": 0
},
{
"ts": 1746878940,
"value": 0
},
{
"ts": 1746879000,
"value": 0
},
{
"ts": 1746879060,
"value": 0
},
{
"ts": 1746879120,
"value": 0
},
{
"ts": 1746879180,
"value": 0
},
{
"ts": 1746879240,
"ts": 1752946740,
"value": 0
}
],
"max_danmaku": 1746864660,
"max_pcu": 1746864660,
"max_danmaku": 1752928860,
"max_pcu": 1752928200,
"max_value": 0,
"high_light_data": [
{
"id": 6226272,
"id": 9628113,
"type": 1,
"start_time": 1746873300,
"end_time": 1746873480,
"start_time": 1752928860,
"end_time": 1752929040,
"title": "弹幕高光 Top 1",
"cover": "",
"extra": ""
},
{
"id": 6226274,
"id": 9628114,
"type": 1,
"start_time": 1746873120,
"end_time": 1746873420,
"start_time": 1752938460,
"end_time": 1752938640,
"title": "弹幕高光 Top 2",
"cover": "",
"extra": ""
},
{
"id": 6226271,
"id": 9628115,
"type": 1,
"start_time": 1752938040,
"end_time": 1752938220,
"title": "弹幕高光 Top 3",
"cover": "",
"extra": ""
},
{
"id": 9628112,
"type": 2,
"start_time": 1746864600,
"end_time": 1746864780,
"start_time": 1752928140,
"end_time": 1752928320,
"title": "进房高光时刻",
"cover": "",
"extra": ""
}
],
"ass_url": "https://jssz-boss.hdslb.com/live2arc_anchor_video/dmass_1899237171_607113721045847859.ass?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250520%2Fjssz%2Fs3%2Faws4_request&X-Amz-Date=20250520T130358Z&X-Amz-Expires=7200&X-Amz-SignedHeaders=host&X-Amz-Signature=5e3ddfbcb8893dc6e76deea7981165e18e5df9a7579f4e6e97c7a32abec53d84"
"ass_url": "https://jssz-boss.hdslb.com/live2arc_anchor_video/dmass_1899237171_625727121464233779.ass?X-Amz-Algorithm=AWS4-HMAC-SHA256\u0026X-Amz-Credential=y4zI4XTQzlOkmSKg%2F20250802%2Fjssz%2Fs3%2Faws4_request\u0026X-Amz-Date=20250802T072504Z\u0026X-Amz-Expires=7200\u0026X-Amz-SignedHeaders=host\u0026X-Amz-Signature=384b42382469059a1f4c6b04c7bd2290a0c74c01375df1681eedb3ba8aca5c3c",
"high_light_stat": {
"original_hl": 4,
"manual_hl": 6
}
}
}
```
</details>
## 获取用户高光列表
> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserGetManualHighlightList
*请求方法: GET*
认证方式: Cookie (SESSDATA)
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| live_key | str | 标记直播场次的key | 必要 | |
| manual_type | num | 查询类型 | 必要 | 1回溯录制<br />2已保存片段 |
| web_location | str | (?) | 非必要 | 作用尚不明确 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -400请求错误<br />-101未登录<br />0成功 |
| message | str | 错误信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| high_light_stat | obj | 高亮状态信息 | |
| manual_highlight_list | arr | 高光列表 | 有内容时存在 |
`data.manual_highlight_list` 数组:
| 索引 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| 0 | obj | 第一条高光信息 | 最少存在1条目前没有高光内容将看不到这个数组 |
| … | obj | 某一条高光信息 | |
| i | obj | 最后一条高光信息 | |
`data.manual_highlight_list` 数组中对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| manual_id | num | 片段id | |
| highlight_title | str | 片段标题 | |
| start_ts | num | 开始时间戳 | Unix 秒时间戳 |
| end_ts | num | 结束时间戳 | Unix 秒时间戳 |
| uid | num | 保存者uid? | |
| ruid | num | 主播uid | |
| live_key | str | 标记直播场次的key | |
`data.high_light_stat` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| original_hl | num | “高光时刻”数量 | 有“高光时刻”时存在 |
| manual_hl | num | “已保存”数量 | 有“已保存”时存在,调用[手动保存高亮片段](#手动保存高亮片段)进行保存 |
注: 可能还存在一个“回溯录制”的字段。
**示例:**
获取用户保存列表
```shell
curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserGetManualHighlightList?live_key=625727121464233779&manual_type=2' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
只有高光时刻的示例:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"high_light_stat": {
"original_hl": 4
}
}
}
```
有保存片段的示例:
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"manual_highlight_list": [
{
"manual_id": 14434,
"highlight_title": "手动保存片段【6】",
"start_ts": 1752935402,
"end_ts": 1752935402,
"uid": 438160221,
"ruid": 438160221,
"live_key": "625727121464233779"
},
{
"manual_id": 14428,
"highlight_title": "手动保存片段【5】",
"start_ts": 1752935402,
"end_ts": 1752935204,
"uid": 438160221,
"ruid": 438160221,
"live_key": "625727121464233779"
},
{
"manual_id": 14426,
"highlight_title": "手动保存片段【4】",
"start_ts": 1752935402,
"end_ts": 1752935404,
"uid": 438160221,
"ruid": 438160221,
"live_key": "625727121464233779"
},
{
"manual_id": 14425,
"highlight_title": "手动保存片段【3】",
"start_ts": 1752935402,
"end_ts": 1752935404,
"uid": 438160221,
"ruid": 438160221,
"live_key": "625727121464233779"
},
{
"manual_id": 14424,
"highlight_title": "手动保存片段【2】",
"start_ts": 1752927342,
"end_ts": 1752935404,
"uid": 438160221,
"ruid": 438160221,
"live_key": "625727121464233779"
},
{
"manual_id": 14423,
"highlight_title": "手动保存片段【1】",
"start_ts": 1752927336,
"end_ts": 1752946748,
"uid": 438160221,
"ruid": 438160221,
"live_key": "625727121464233779"
}
],
"high_light_stat": {
"original_hl": 4,
"manual_hl": 6
}
}
}
```
@ -1134,6 +1250,72 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVide
</details>
## 手动保存高亮片段
> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserManualSaveHighlight
*请求方法: POST*
认证方式: Cookie (SESSDATA)
鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| live_key | str | 标记直播场次的key | 必要 | 必须为自己的live_key |
| start_ts | num | 开始时间戳 | 必要 | Unix 秒时间戳 |
| end_ts | num | 结束时间戳 | 必要 | Unix 秒时间戳 |
| csrf | str | CSRF Token位于cookie | 必要 | |
注: 开始时间减结束时间的结果小于1可能导致[直播回放片段发布页面](#直播回放片段发布页面)无法处理这个片段。
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -400请求错误<br />-111csrf校验失败<br />-101未登录<br />0成功<br /> |
| message | str | 错误信息 | |
| ttl | num | `1` | |
| data | obj | 信息本体 | 成功时为空对象 |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | `-1` | |
| message | str | 错误提示 | `主播没有对应场次` , `保存时间点未开播` |
**示例:**
手动保存一个片段
```shell
curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/UserManualSaveHighlight' \
--data-urlencode 'live_key=625727121464233779' \
--data-urlencode 'start_ts=1752935402' \
--data-urlencode 'end_ts=1752935404' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;bili_jct=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {}
}
```
</details>
## 投稿直播回放片段
> https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorPublishVideoSlice
@ -1156,7 +1338,8 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVide
| av_highlight | num | 高光绑定? | 非必要 | |
| with_subtitle | num | 是否自动生成字幕? | 非必要 | 效果不明确 |
| with_danmaku | num | 是否带弹幕? | 非必要 | 传递`1`时可能导致处于“发布中”状态时不在[获取已发布片段的信息](#获取已发布片段的信息)中显示 |
| with_reserve | num | (?) | 非必要 | 作用尚不明确 |
| with_reserve | num | 投稿携带下场直播提醒 | 非必要 | 0不携带1携带 |
| av_speed | str | 倍速投稿 | 非必要 | 格式为 `倍速值 + "x"` 使用非1x倍速时可能导致处于“发布中”状态时不在[获取已发布片段的信息](#获取已发布片段的信息)中显示<br />允许值: `0.5x` , `0.75x` , `1.0x` , `1.25x` , `1.5x` , `2.0x` |
| csrf | str | CSRF Token位于cookie | 必要 | |
**json回复**
@ -1165,7 +1348,7 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/GetAnchorVide
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -111csrf校验失败<br />-101未登录<br />0成功<br />4000时长过长<br />4001操作太快<br />4002片段已投稿<br />4003请选择精彩片段再投稿哦<br />4006标题已使用 |
| code | num | 返回值 | -111csrf校验失败<br />-101未登录<br />0成功<br />4000时长过长<br />4001操作太快<br />4002片段已投稿<br />4003请选择精彩片段再投稿哦<br />4006标题已使用<br />4008不被允许的视频倍速<br />4009该片段存在违规内容不允许投稿 |
| message | str | 错误信息 | |
| ttl | num | `1` | |
| data | obj | 信息本体 | 成功时有效 |
@ -1220,7 +1403,7 @@ curl 'https://api.live.bilibili.com/xlive/app-blink/v1/anchorVideo/AnchorPublish
2. (可选)请求[获取回放的信息](#获取回放的信息)接口,生成合成进度页面;
3. [轮询回放合成状态](#轮询回放合成状态),当状态变为`30`转到流程4变为`-30`转到流程5
3. [轮询回放合成状态](#轮询回放状态),当状态变为`30`转到流程4变为`-30`转到流程5
4. 再次[请求整场直播回放下载链接](#请求整场直播回放下载链接),获取下载链接并下载。

470
docs/live/live_vote.md Normal file
View File

@ -0,0 +1,470 @@
# 直播投票
## 查询投票信息
> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/votePanel
*请求方法: GET*
认证方式: Cookie (SESSDATA)
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -400请求错误<br />-101未登录<br />0成功 |
| message | str | 错误信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | 不是登录信息对应的直播间时将为 `null` |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| vote_info | obj | 当前活动的投票信息 | 若当前没有活动的投票将为空对象 |
| templates | arr | 投票模板 | |
`data.vote_info` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| status | num | 投票状态 | 见[投票状态](#投票状态)枚举 |
| question | str | 投票问题 | |
| options | arr | 投票选项 | |
| duration | num | 投票持续时间 | 单位:毫秒 |
| result | num | 投票结果偏向哪一方状态 | |
| result_text | str | 投票结果偏向哪一方 | |
| etime_str | str | 投票结束时间 | |
| left_duration | num | 投票剩余时间 | 单位:毫秒,投票结束后不存在 |
| interaction_id | num | 投票互动id | |
| template_id | num | 投票模板id | 使用模板时存在 |
`data.vote_info.options` 数组:
| 索引 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| 0 | obj | 投票选项1 | |
| 1 | obj | 投票选项2 | |
`data.vote_info.options` 数组中对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| idx | num | 选项id | |
| desc | str | 投票选项描述 | |
| percent | num | 投票选项占比显示 | |
`data.templates` 数组:
| 索引 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| 0 | obj | 投票模板信息 | |
| … | obj | 投票模板信息 | |
`data.templates` 数组中对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| template_id | num | 模板id | |
| question | str | 投票问题 | |
| option_a | str | 投票选项A | |
| option_b | str | 投票选项B | |
**示例:**
查询投票信息
```shell
curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/votePanel?room_id=1'
```
<details>
<summary>查看响应示例:</summary>
```jsonc
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"vote_info": {
"status": 4,
"question": "醒醒",
"options": [
{
"idx": 1,
"desc": "醒",
"percent": 0.5
},
{
"idx": 2,
"desc": "睡",
"percent": 0.5
}
],
"duration": 600000,
"result": 1,
"result_text": "平局",
"etime_str": "08-31 15:44",
"left_duration": 549660,
"interaction_id": 120122595433984
},
"templates": [
{
"template_id": 54339003518976,
"question": "哪边赢",
"option_a": "左",
"option_b": "右"
},
{
"template_id": 48570973661696,
"question": "只因你太美唱的好吗?",
"option_a": "你干嘛",
"option_b": "哎哟"
},
// 省略了大部分内容
{
"template_id": 46203444257280,
"question": "№!",
"option_a": "虾头",
"option_b": "抽象"
},
{
"template_id": 96177095781888,
"question": "相信奇迹吗",
"option_a": "相信",
"option_b": "必须相信"
},
{
"template_id": 103827382481920,
"question": "1",
"option_a": "1",
"option_b": "1"
}
]
}
}
```
</details>
## 查询投票历史
> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/voteHistory
*请求方法: GET*
认证方式: Cookie (SESSDATA)
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -400请求错误<br />-101未登录<br />0成功 |
| message | str | 错误信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | 不是登录信息对应的直播间时将为空对象 |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| history | arr | 投票历史列表 | |
`data.history` 数组:
| 索引 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| 0 | obj | 投票历史 | 与[查询投票信息](#查询投票信息)`data.vote_info`相同 |
| … | obj | 投票历史 | 与[查询投票信息](#查询投票信息)`data.vote_info`相同 |
| 9 | obj | 投票历史 | 与[查询投票信息](#查询投票信息)`data.vote_info`相同 |
`data.history` 数组中对象:
与 [查询投票信息](#查询投票信息) json回复的 `data.vote_info` 相同。
**示例:**
```shell
curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/voteHistory?room_id=1' \
-b 'SESSDATA=xxx'
```
<details>
<summary>查看响应示例:</summary>
```jsonc
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"history": [
{
"status": 5,
"question": "醒醒",
"options": [
{
"idx": 1,
"desc": "醒",
"percent": 0.5
},
{
"idx": 2,
"desc": "睡",
"percent": 0.5
}
],
"duration": 600000,
"result": 1,
"result_text": "平局",
"etime_str": "08-31 15:44",
"interaction_id": 120122595433984
},
{
"status": 5,
"question": "会不会睡死?",
"options": [
{
"idx": 1,
"desc": "包会的",
"percent": 0.5
},
{
"idx": 2,
"desc": "不会的",
"percent": 0.5
}
],
"duration": 60000,
"result": 1,
"result_text": "平局",
"etime_str": "08-31 14:57",
"interaction_id": 120117830648832
},
{
"status": 5,
"question": "会不会睡着?",
"options": [
{
"idx": 1,
"desc": "包会的",
"percent": 0.5
},
{
"idx": 2,
"desc": "不会的",
"percent": 0.5
}
],
"duration": 180000,
"result": 1,
"result_text": "平局",
"etime_str": "08-31 14:53",
"interaction_id": 120117121798656
},
{
"status": 5,
"question": "能不能一把过",
"options": [
{
"idx": 1,
"desc": "能",
"percent": 0.5
},
{
"idx": 2,
"desc": "不能",
"percent": 0.5
}
],
"duration": 60000,
"result": 1,
"result_text": "平局",
"etime_str": "08-31 14:41",
"interaction_id": 120115796409344,
"template_id": 3109187328000
}
// 省略其余6项
]
}
}
```
</details>
## 投票状态
此处列出已发现的投票状态,在投票信息和直播信息流 `DM_INTERACTION` 的类型 `101` 等地方使用。
当前状态信息来自混淆代码寻找而来。
| 值 | 含义 | 备注 |
| -- | ---- | ---- |
| 0 | | 键名 `NONE` |
| 1 | 等待审核 | 键名 `WAITING_AUDIT` |
| 2 | 审核失败 | 键名 `AUDIT_FAILED` |
| 4 | 投票进行中 | 键名 `DURING` |
| 5 | 投票结束 | 键名 `END` |
| 6 | | 键名 `STOP` |
## 创建直播投票
> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/createVote
*请求方法: POST*
认证方式: Cookie (SESSDATA)
鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同
投票创建完成后,投票信息和审核结果将以直播信息流 `DM_INTERACTION` 的类型 `101` 下发。
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 |
| duration | num | 持续时间 | 必要 | 必须为整数,目前范围`0<d<10` |
| question | str | 投票问题 | 必要 | |
| option_a | str | 选项A | 必要 | |
| option_b | str | 选项B | 必要 | |
| template_id | num | 投票模板id | 非必要 | |
| live_key | str | 直播场次key | 非必要 | 需要更多信息 |
| sub_session_key | str | (?) | 非必要 | 需要更多信息 |
| csrf_token | str | CSRF Token位于cookie | 非必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
| visit_id | str | (?) | 非必要 | 作用尚不明确 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -404不是自己的直播间<br />-400参数错误<br />-101未登录<br />-111csrf校验失败<br />0成功 |
| message | str | 错误信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | obj | 信息本体 | |
`data` 对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| interaction_id | num | 投票互动id | |
**示例:**
创建一个投票
```shell
curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/createVote' \
--data-urlencode 'room_id=3' \
--data-urlencode 'duration=1' \
--data-urlencode 'question=abcdef' \
--data-urlencode 'option_a=A' \
--data-urlencode 'option_b=B' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;bili_jct=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data":{
"interaction_id":120008099262976
}
}
```
</details>
## 中断直播投票
> https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/terminateVote
*请求方法: POST*
认证方式: Cookie (SESSDATA)
鉴权方式: Cookie中`bili_jct`的值正确并与`csrf`相同
**正文参数( application/x-www-form-urlencoded **
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| interaction_id | num | 投票互动id | 必要 | 必须为该登录信息创建的投票 |
| room_id | num | 直播间id | 必要 | 必须为登录信息对应的直播间 |
| csrf_token | str | CSRF Token位于cookie | 非必要 | |
| csrf | str | CSRF Token位于cookie | 必要 | |
| visit_id | str | (?) | 非必要 | 作用尚不明确 |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| --- | --- | --- | --- |
| code | num | 返回值 | -400参数错误<br />-101未登录<br />-111csrf校验失败<br />0成功<br />1003402修改投票状态失败 |
| message | str | 错误信息 | 成功时为`"0"` |
| ttl | num | `1` | |
| data | null | 无 | |
**示例:**
中断某个投票
```shell
curl 'https://api.live.bilibili.com/xlive/app-room/v1/dm/interaction/terminateVote' \
--data-urlencode 'interaction_id=120122595433984' \
--data-urlencode 'room_id=1' \
--data-urlencode 'csrf=xxx' \
-b 'SESSDATA=xxx;bili_jct=xxx'
```
<details>
<summary>查看响应示例:</summary>
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": null
}
```
</details>
## 弹幕投票主播侧界面
> https://live.bilibili.com/p/html/live-app-guessing-game/anchor_vote.html
直接访问此页面存在部分功能不可用的情况。
**URL查询参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ----- | --- | ---- | ----- | --- |
| room_id | num | 直播间id | 必要 | 必须为自己的直播间 |

File diff suppressed because it is too large Load Diff