添加视频实时广播相关

This commit is contained in:
SocialSisterYi 2020-05-02 23:59:38 +08:00
parent 7e499eb9cd
commit f18eeabd19
4 changed files with 569 additions and 0 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ live/info_flow.md
bangumi/info.md
bangumi/ststus_number.md
live/live_manage.md
danmaku/action.md

167
broadcast/general.md Normal file
View File

@ -0,0 +1,167 @@
# 全站广播
## 获取广播服务器地址
> http://api.bilibili.com/x/web-interface/broadcast/servers
*方式GET*
**参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| -------- | ---- | -------- | ------ | --------------------------------- |
| platform | url | 平台选择 | 必要 | 为web时输出域名<br />其他时输出ip |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------------- | ------ | ------------------ | ---- |
| domain | str | 广播服务器url | |
| tcp_port | num | tcp端口 | |
| ws_port | num | websocket端口 | |
| wss_port | num | websocket ssl端口 | |
| heartbeat | num | 最大心跳包间隔时间 | |
| nodes | arrary | 服务节点地址列表 | |
| backoff | obj | | |
| heartbeat_max | num | | |
`data`中的`nodes`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------- | ---- |
| 0 | str | 服务节点1 | |
| n | str | 服务节点(n+1) | |
| …… | str | …… | |
`data`中的`backoff`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---------- | ---- | ------ | ---- |
| max_delay | num | | |
| base_delay | num | | |
| factor | num | | |
| jitter | num | | |
示例:
当`platform`=`web`时不显示节点ip
http://api.bilibili.com/x/web-interface/broadcast/servers?platform=web
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"domain": "broadcast.chat.bilibili.com",
"tcp_port": 7821,
"ws_port": 7822,
"wss_port": 7823,
"heartbeat": 30,
"nodes": ["broadcast.chat.bilibili.com"],
"backoff": {
"max_delay": 300,
"base_delay": 3,
"factor": 1.8,
"jitter": 0.3
},
"heartbeat_max": 3
}
}
```
当`platform`=其他时显示节点ip
http://api.bilibili.com/x/web-interface/broadcast/servers?platform=1
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"domain": "broadcast.chat.bilibili.com",
"tcp_port": 7821,
"ws_port": 7822,
"wss_port": 7823,
"heartbeat": 30,
"nodes": ["134.175.207.130", "120.92.150.90", "120.92.150.212", "192.144.173.136", "154.8.217.108"],
"backoff": {
"max_delay": 300,
"base_delay": 3,
"factor": 1.8,
"jitter": 0.3
},
"heartbeat_max": 3
}
}
```
## 服务器数据包
连接服务器分为三种方式分别是ws wss tcp数据包分为上行和下行
单个数据包分为头部和正文
其中上行的有认证包 心跳包,下行的有认证包回复 心跳包回复 普通包
建立连接后超过30s内未发送认证包或握手后30s内未发送心跳包或发送了错误的认证包都会被强制断开连接
操作流程:
1.发送认证包,等待接收认证回复
2.确认握手成功后每30s内发送心跳包并立即接收心跳包回复
3.空闲时间接收普通包
### 数据包结构
头部通用于上行和下行数据包
头部格式:
| 偏移量 | 长度(字节) | 类型 | 含义 |
| ------ | ------------ | ------ | ---------------------------------------------------- |
| 0x00 | 4 | uint32 | 封包总大小(头部大小+正文大小) |
| 0x04 | 2 | uint16 | 头部大小一般为0x001218字节 |
| 0x06 | 2 | uint16 | 协议版本可取常数1 |
| 0x08 | 4 | uint32 | 操作码(包类型)<br />**见下表** |
| 0x0C | 4 | uint32 | sequence请求次数可取常数1<br />对于普通包恒为0 |
| 0x10 | 2 | uint16 | 保留一般为0 |
操作码:
| 代码 | 含义 |
| ---------- | ---------- |
| 0x00000002 | 心跳包 |
| 0x00000003 | 心跳包回复 |
| 0x000003E8 | 普通包 |
| 0x00000007 | 认证包 |
| 0x00000008 | 认证包回复 |
**示例:**
以下为一个认证包示例,正文为文本`test`
```
00000000 00 00 00 16 00 12 00 01 00 00 00 07 00 00 00 01 |................|
00000010 00 00 74 65 73 74 |..test|
```

152
broadcast/video_room.md Normal file
View File

@ -0,0 +1,152 @@
# 视频实时信息
## 认证包(上行)
**正文内容json**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| -------- | ------ | -------- | ------------------------------ |
| room_id | str | 目标视频 | `video://{视频avID}/{视频CID}` |
| platform | str | 平台标识 | 默认为`web` |
| accepts | arrary | 操作标识 | |
`arrary`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ---- | ---- |
| 0 | num | 1000 | |
**示例:**
发送视频`av706`1P的CID为` 3724723 `)的认证包
```
00000000 00 00 00 55 00 12 00 01 00 00 00 07 00 00 00 01 |...U............|
00000010 00 00 7b 22 72 6f 6f 6d 5f 69 64 22 3a 22 76 69 |..{"room_id":"vi|
00000020 64 65 6f 3a 2f 2f 37 30 36 2f 33 37 32 34 37 32 |deo://706/372472|
00000030 33 22 2c 22 70 6c 61 74 66 72 6f 6d 22 3a 22 77 |3","platfrom":"w|
00000040 65 62 22 2c 22 61 63 63 65 70 74 73 22 3a 5b 31 |eb","accepts":[1|
00000050 30 30 30 5d 7d |000]}|
```
## 认证包回复(下行)
**正文内容json**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为OK |
| version | num | 版本号 | |
示例:
```
00000000 00 00 00 37 00 12 00 01 00 00 00 08 00 00 00 01 |...7............|
00000010 00 00 7b 22 63 6f 64 65 22 3a 30 2c 22 6d 65 73 |..{"code":0,"mes|
00000020 73 61 67 65 22 3a 22 4f 4b 22 2c 22 76 65 72 73 |sage":"OK","vers|
00000030 69 6f 6e 22 3a 31 7d |ion":1}|
```
## 心跳包(上行)
正文可为任意内容或为空
**示例:**
正文为空的示例
```
00000000 00 00 00 12 00 12 00 01 00 00 00 02 00 00 00 01 |................|
00000010 00 00 |..|
```
正文为`[object Object]`的示例
```
00000000 00 00 00 21 00 12 00 01 00 00 00 02 00 00 00 01 |...!............|
00000010 00 00 5b 6f 62 6a 65 63 74 20 4f 62 6a 65 63 74 |..[object Object|
00000020 5d |]|
```
## 心跳包回复(实时观看数)(下行)
**正文内容json**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | -------- | -------- |
| code | num | 返回值 | 0成功 |
| message | str | 错误信息 | 默认为OK |
| data | obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------------- | ---- |
| room | obj | 视频实时观看信息 | |
`data`中的`room`对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ---- | ------------ | ------------------------------ |
| online | num | 实时观看人数 | |
| room_id | str | 目标视频 | `video://{视频avID}/{视频CID}` |
**示例:**
当前视频`av706`实时观看人数为13
```
00000000 00 00 00 68 00 12 00 01 00 00 00 03 00 00 00 01 |...h............|
00000010 00 00 7b 22 63 6f 64 65 22 3a 30 2c 22 6d 65 73 |..{"code":0,"mes|
00000020 73 61 67 65 22 3a 22 30 22 2c 22 64 61 74 61 22 |sage":"0","data"|
00000030 3a 7b 22 72 6f 6f 6d 22 3a 7b 22 6f 6e 6c 69 6e |:{"room":{"onlin|
00000040 65 22 3a 31 33 2c 22 72 6f 6f 6d 5f 69 64 22 3a |e":13,"room_id":|
00000050 22 76 69 64 65 6f 3a 2f 2f 37 30 36 2f 33 37 32 |"video://706/372|
00000060 34 37 32 33 22 7d 7d 7d |4723"}}}|
```
## 普通包(实时弹幕)(下行)
**正文内容json**
根数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ------------ | ------------------------------------------------------------ |
| 0 | str | 弹幕属性信息 | 详见[「弹幕」中的属性 p](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/danmaku/danmaku.md) |
| 1 | str | 弹幕内容 | |
**示例:**
弹幕属性为`0.25,1,25,16777215,1588433046,1588431486568150,0,33ad5d91,32134068443807747`
弹幕内容为`此生无悔入东方,来世愿生幻想乡`
```
00000000 00 00 00 91 00 12 00 01 00 00 03 e8 00 00 00 00 |................|
00000010 00 00 5b 22 30 2e 32 35 2c 31 2c 32 35 2c 31 36 |..["0.25,1,25,16|
00000020 37 37 37 32 31 35 2c 31 35 38 38 34 33 33 30 34 |777215,158843304|
00000030 36 2c 31 35 38 38 34 33 31 34 38 36 35 36 38 31 |6,15884314865681|
00000040 35 30 2c 30 2c 33 33 61 64 35 64 39 31 2c 33 32 |50,0,33ad5d91,32|
00000050 31 33 34 30 36 38 34 34 33 38 30 37 37 34 37 22 |134068443807747"|
00000060 2c 22 e6 ad a4 e7 94 9f e6 97 a0 e6 82 94 e5 85 |,"此 生 无 悔|
00000070 a5 e4 b8 9c e6 96 b9 ef bc 8c e6 9d a5 e4 b8 96 |入 东 方 ,来 世 |
00000080 e6 84 bf e7 94 9f e5 b9 bb e6 83 b3 e4 b9 a1 22 |愿 生 幻 想 乡"|
00000090 5d |]|
```

View File

@ -1729,6 +1729,255 @@ http://api.bilibili.com/x/space/acc/tags?mid=53456
}
```
### 查询用户创建的视频收藏夹列表
> http://api.bilibili.com/x/v3/fav/folder/created/list-all
*方式GET*
查看私有收藏夹时需要登录(SESSDATA)
**参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | ---- |
| up_mid | url | 目标用户UID | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | --------------------------- |
| code | num | 返回值 | 0成功<br />-400请求错误 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | 隐藏时null<br />公开时obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---------------------------------------- | -------------- | ---- |
| count | num | 创建的收藏夹数 | |
| list | 无收藏夹时null<br />有收藏夹时arrary | 收藏夹列表 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | --------------------- |
| 0 | obj | 收藏夹1 | |
| n | obj | 收藏夹(n+1) | 项数取决于`count`的值 |
| …… | obj | …… | |
`data`中的`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ---------------- | ----------------------------------------- |
| id | num | 收藏夹mlID | |
| fid | num | 原始收藏夹ID | 去除两位UID尾号 |
| mid | num | 创建用户UID | |
| attr | num | 收藏夹属性 | 转换成8-bit二进制处理<br />详细说明见下表 |
| title | str | 收藏夹标题 | |
| fav_state | num | 0 | 作用尚不明确 |
| media_count | num | 收藏夹总计视频数 | |
`attr`属性二进制值表:
| 其他有待补充... | 1默认收藏夹 | 0公开性 |
| --------------- | -------------------------------- | -------------------- |
| | 0默认收藏夹<br />1其他收藏夹 | 0公开<br />1私有 |
**示例:**
查询用户`UID=7792521`的收藏夹列表
http://api.bilibili.com/x/v3/fav/folder/created/list-all?up_mid=7792521
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"count": 5,
"list": [{
"id": 44233921,
"fid": 442339,
"mid": 7792521,
"attr": 0,
"title": "默认收藏夹",
"fav_state": 0,
"media_count": 85
}, {
"id": 936347621,
"fid": 9363476,
"mid": 7792521,
"attr": 22,
"title": "放假君的鬼畜私房歌",
"fav_state": 0,
"media_count": 2
}, {
"id": 845218621,
"fid": 8452186,
"mid": 7792521,
"attr": 22,
"title": "♪一言不合就开唱♪",
"fav_state": 0,
"media_count": 4
}, {
"id": 844998121,
"fid": 8449981,
"mid": 7792521,
"attr": 22,
"title": "个人作品精选",
"fav_state": 0,
"media_count": 25
}, {
"id": 381779121,
"fid": 3817791,
"mid": 7792521,
"attr": 22,
"title": "鬼畜小课堂",
"fav_state": 0,
"media_count": 25
}]
}
}
```
### 查询用户收藏的收藏夹
> http://api.bilibili.com/x/v3/fav/folder/collected/list
*方式GET*
**参数:**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------ | ---- | ----------- | ------ | ---- |
| ps | url | 每页项数 | 必要 | |
| pn | url | 页码 | 必要 | |
| up_mid | url | 目标用户UID | 必要 | |
**json回复**
根对象:
| 字段 | 类型 | 内容 | 备注 |
| ------- | ----------------------------- | -------- | ------------------------------------------------------------ |
| code | num | 返回值 | 0成功<br />-101账号未登录<br />-111csrf校验失败<br />40022签名过长 |
| message | str | 错误信息 | 默认为0 |
| ttl | num | 1 | 作用尚不明确 |
| data | 隐藏时null<br />公开时obj | 信息本体 | |
`data`对象:
| 字段 | 类型 | 内容 | 备注 |
| ----- | ---------------------------------------- | -------------- | ---- |
| count | num | 创建的收藏夹数 | |
| list | 无收藏夹时null<br />有收藏夹时arrary | 收藏夹列表 | |
`data`中的`list`数组:
| 项 | 类型 | 内容 | 备注 |
| ---- | ---- | ----------- | --------------------- |
| 0 | obj | 收藏夹1 | |
| n | obj | 收藏夹(n+1) | 项数取决于`count`的值 |
| …… | obj | …… | |
`data`中的`list`数组中的对象:
| 字段 | 类型 | 内容 | 备注 |
| ----------- | ---- | ------------------ | ----------------------------------------- |
| id | num | 收藏夹mlID | |
| fid | num | 原始收藏夹ID | 去除两位UID尾号 |
| mid | num | 创建用户UID | |
| attr | num | 收藏夹属性 | 转换成8-bit二进制处理<br />详细说明见下表 |
| title | str | 收藏夹标题 | |
| cover | str | 收藏夹封面图片url | |
| upper | obj | 收藏夹创建用户信息 | |
| cover_type | num | 2 | 作用尚不明确 |
| intro | str | 空 | 作用尚不明确 |
| ctime | num | 创建时间 | 时间戳 |
| mtime | num | 审核时间 | 时间戳 |
| state | num | 0 | 作用尚不明确 |
| fav_state | num | 0 | 作用尚不明确 |
| media_count | num | 收藏夹总计视频数 | |
`attr`属性二进制值表:
| 其他有待补充... | 1默认收藏夹 | 0公开性 |
| --------------- | -------------------------------- | -------------------- |
| | 0默认收藏夹<br />1其他收藏夹 | 0公开<br />1私有 |
`data`中的`list`数组中的对象中的`upper`对象:
| 字段 | 类型 | 内容 | 备注 |
| ---- | ---- | ---------- | ------------ |
| mid | num | 创建人UID | |
| name | str | 创建人昵称 | |
| face | str | 空 | 作用尚不明确 |
**示例:**
查询用户`UID=293793435`的收藏夹收藏列表
http://api.bilibili.com/x/v3/fav/folder/collected/list?pn=1&ps=20&up_mid=293793435
```json
{
"code": 0,
"message": "0",
"ttl": 1,
"data": {
"count": 2,
"list": [{
"id": 496307088,
"fid": 4963070,
"mid": 412466388,
"attr": 22,
"title": "入站必刷",
"cover": "http://i0.hdslb.com/bfs/archive/baae2b4050363c0ab45465b7cf696b8304fdaca8.jpg",
"upper": {
"mid": 412466388,
"name": "热门菌",
"face": ""
},
"cover_type": 2,
"intro": "",
"ctime": 1563394571,
"mtime": 1563394571,
"state": 0,
"fav_state": 0,
"media_count": 55
}, {
"id": 381779121,
"fid": 3817791,
"mid": 7792521,
"attr": 22,
"title": "鬼畜小课堂",
"cover": "http://i2.hdslb.com/bfs/archive/09a668cfdb38fb3a85f905c10f48a2947e36a695.jpg",
"upper": {
"mid": 7792521,
"name": "还有一天就放假了",
"face": ""
},
"cover_type": 2,
"intro": "",
"ctime": 1553700224,
"mtime": 1557291666,
"state": 0,
"fav_state": 0,
"media_count": 25
}]
}
}
```
## 设置相关