修改protobuf弹幕 并勘误

This commit is contained in:
SocialSisterYi 2020-07-23 00:08:20 +08:00
parent 9091022f08
commit cc590a323a
4 changed files with 93 additions and 67 deletions

View File

@ -68,13 +68,15 @@
- 状态数
- 操作
- [视频弹幕](danmaku)
- [protobuf实时弹幕](danmaku/danmaku_proto.md)
- [protobuf实时弹幕](danmaku/danmaku_proto.md)×
- protobuf云推荐弹幕
- [xml实时弹幕](danmaku/danmaku_xml.md)√
- [xml历史弹幕](danmaku/history.md)√
- [快照](danmaku/snapshot.md)√
- [弹幕操作](danmaku/action.md)×
- 高级弹幕
- 屏蔽管理
- 智能防挡弹幕
- [专栏](article)
- 分区
- [基本信息](article/info.md)×

View File

@ -18,10 +18,10 @@
| bvid | str | 视频bvID | 必要(可选) | avID与bvID任选一个 |
| aid | num | 视频avID | 必要(可选) | avID与bvID任选一个 |
| progress | num | 弹幕出现在视频内的时间 | 非必要 | 单位为毫秒<br />默认为0 |
| color | num | 弹幕颜色设置 | 非必要 | 详见[「弹幕」中的属性 p](danmaku.md#属性 p)<br />默认为16777215#FFFFFF白色 |
| fontsize | num | 弹幕字号设置 | 非必要 | 详见[「弹幕」中的属性 p](danmaku.md#属性 p)<br />默认为25 |
| pool | num | 弹幕池选择 | 非必要 | 0普通弹幕<br />1字幕弹幕<br />2BAS弹幕<br />默认为0 |
| mode | num | 弹幕类型选择 | 必要 | 1普通<br />4底部<br />5顶部<br />7高级<br />9BAS`pool`必须为2 |
| color | num | 弹幕颜色设置 | 非必要 | 十进制RGB888值<br />默认为16777215#FFFFFF白色 |
| fontsize | num | 弹幕字号设置 | 非必要 | 默认为25 |
| pool | num | 弹幕池选择 | 非必要 | 0普通<br />1字幕池<br />2特殊池代码/BAS弹幕<br />默认为0 |
| mode | num | 弹幕类型选择 | 必要 | 1普通弹幕<br />4底部弹幕<br />5顶部弹幕<br />7高级弹幕<br />9BAS弹幕`pool`必须为2 |
| rnd | num | 16位10进制随机数 | 非必要 | **若无此项则发送弹幕冷却时间限制为90s**<br />若有此项则发送弹幕冷却时间限制为5s |
| csrf | str | CSRF Token位于cookie | 必要 | |

View File

@ -1,46 +1,54 @@
# protobuf弹幕
2020年5月23日哔哩哔哩网页端启用了新的默认弹幕api网页端弹幕显示的上限变为原弹幕池上限的两倍。
2020年5月23日哔哩哔哩网页端及移动端启用了新的默认弹幕api网页端弹幕显示的上限变为原弹幕池上限的两倍。
哔哩哔哩的视频是以6分钟为一个单位加载的新的api是以6分钟为一个单位加载即每次加载6分钟内的弹幕,如果打开右侧的弹幕列表就会一次加载完所有的弹幕。
新的api是以6分钟为一个单位加载即每次加载6分钟内的弹幕
## 获取实时弹幕
> https://api.bilibili.com/x/v2/dm/web/seg.so
> http://api.bilibili.com/x/v2/dm/web/seg.so
>
> http://api.bilibili.com/x/v2/dm/list/seg.so
*请求方式:GET*
*请求方式GET*
此接口与漫画弹幕相同
只能返回普通和高级弹幕代码BAS弹幕请从云推荐弹幕中获取
**注仅获取6min的整数倍时间内的弹幕如第一包中弹幕`progress`值域为0-360000**
**url参数**
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | ------- | ------ | --------- |
| oid | num | 视频CID | 必要 | |
| pid | num | 视频AID | 非必要 | |
| type | num | 未知 | 必要 | 一般为1 |
| segment_index | num | 分段 | 必要 | 6分钟一段 |
| 参数名 | 类型 | 内容 | 必要性 | 备注 |
| ------------- | ---- | -------- | ------ | ----------- |
| type | num | 弹幕分类 | 必要 | 1视频弹幕 |
| oid | num | 视频CID | 必要 | |
| pid | num | 视频avID | 非必要 | |
| segment_index | num | 分包 | 必要 | 6分钟一包 |
**回:**
**回**
返回二进制数据,需要自行解析
返回二进制数据,需要自行解析
只能返回普通和高级弹幕,代码弹幕请从弹幕云屏蔽中获取。
**示例:**
获取视频`av810872(CID=1176840)`的实时弹幕分段`1`
```shell
curl -G 'http://api.bilibili.com/x/v2/dm/web/seg.so'\
--data-urlencode 'type=1'\
--data-urlencode 'oid=1176840'\
--data-urlencode 'pid=810872'\
--data-urlencode 'segment_index=1'\
-o 'danmaku.bin'
```
响应正文为protubuf二进制数据
## 弹幕格式
| 名称 | 含义 | 类型 | 备注 |
| -------- | -------------------- | ------ | ------------------------------------------------------------ |
| id | 弹幕dmID | int64 | 唯一 可用于操作参数 |
| progress | 视频内弹幕出现时间 | int32 | 毫秒 |
| mode | 弹幕类型 | int32 | 1 2 3普通弹幕<br />4底部<br />5顶部<br />6逆向<br />7高级弹幕<br />8代码弹幕<br />9BAS弹幕 |
| fontsize | 弹幕字号 | int32 | 18 小<br />25 标准<br />36 大 |
| color | 弹幕颜色 | uint32 | 十进制RGB888值 |
| midHash | 编码后的用户UID | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID |
| content | 弹幕内容 | string | 字符串是编码格式为\\+三位数字数字是八进制为utf-8编码 |
| ctime | 弹幕发送时间 | int64 | 时间戳 |
| weight | 权重 | int32 | 云屏蔽等级 |
| action | 动作 | string | 未知 |
| pool | 弹幕池 | int32 | 0普通池<br />1字幕池<br />2特殊池高级弹幕 |
| idStr | 弹幕dmID的字符串类型 | string | 唯一 可用于操作参数 |
protobuf结构体
**bilidm.proto**
@ -48,44 +56,60 @@
syntax = "proto3";
message DanmakuElem {
int64 id = 1;
int32 progress = 2;
int32 mode = 3;
int32 fontsize = 4;
uint32 color = 5;
string midHash = 6;
string content = 7;
int64 ctime = 8;
int32 weight = 9;
string action = 10;
int32 pool = 11;
string idStr = 12;
int64 id = 1; //弹幕dmID
int32 progress = 2; //出现时间
int32 mode = 3; //弹幕类型
int32 fontsize = 4; //文字大小
uint32 color = 5; //弹幕颜色
string midHash = 6; //发送者UID的HASH
string content = 7; //弹幕内容
int64 ctime = 8; //发送时间
int32 weight = 9; //权重
string action = 10; //动作
int32 pool = 11; //弹幕池
string idStr = 12; //弹幕dmID
}
//弹幕接口返回的数据
message DmSegMobileReply {
repeated DanmakuElem elems = 1;
}
```
**实例:**
| 名称 | 含义 | 类型 | 备注 |
| -------- | -------------------- | ------ | ------------------------------------------------------------ |
| id | 弹幕dmID | int64 | 唯一 可用于操作参数 |
| progress | 视频内弹幕出现时间 | int32 | 毫秒 |
| mode | 弹幕类型 | int32 | 1 2 3普通弹幕<br />4底部弹幕<br />5顶部弹幕<br />6逆向弹幕<br />7高级弹幕<br />8代码弹幕<br />9BAS弹幕 |
| fontsize | 弹幕字号 | int32 | 18<br />25标准<br />36大 |
| color | 弹幕颜色 | uint32 | 十进制RGB888值 |
| midHash | 发送者UID的HASH | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID |
| content | 弹幕内容 | string | utf-8编码 |
| ctime | 弹幕发送时间 | int64 | 时间戳 |
| weight | 权重 | int32 | 用于智能屏蔽级别 |
| action | 动作 | string | 未知 |
| pool | 弹幕池 | int32 | 0普通池<br />1字幕池<br />2特殊池代码/BAS弹幕 |
| idStr | 弹幕dmID的字符串类型 | string | 唯一 可用于操作参数 |
获取炮姐弹幕https://www.bilibili.com/video/BV1Js411o76u
## 实例
编译proto文件
获取炮姐弹幕第1包[BV1Js411o76u](https://www.bilibili.com/video/BV1Js411o76u)
```powershell
protoc.exe --python_out=. .\bilidm.proto
编译proto结构文件
```shell
protoc --python_out=. bilidm.proto
```
生成文件bilidm_pb2.py
生成bilidm_pb2.py
main.py
---
以下为python测试代码
```python
import bilidm_pb2
import requests
url = 'https://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=1176840&pid=810872&segment_index=1'
url = 'http://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=1176840&pid=810872&segment_index=1'
data = requests.get(url)
target = bilidm_pb2.DmSegMobileReply()
target.ParseFromString(data.content)
@ -95,7 +119,7 @@ print(target.elems[0].content)
输出:
```shell
```
id: 682225690
progress: 44125
mode: 1

View File

@ -6,7 +6,7 @@
> http://api.bilibili.com/x/v1/dm/list.so
*请求方式:GET*
*请求方式GET*
**使用deflate压缩注意解码**
@ -28,7 +28,7 @@ curl -G 'http://api.bilibili.com/x/v1/dm/list.so'\
> http://comment.bilibili.com/{cid}.xml
*请求方式:GET*
*请求方式GET*
效果与前者相同
@ -96,18 +96,18 @@ curl 'http://comment.bilibili.com/144541892.xml'
### 属性 p
字符串内每项用`,`分隔
字符串内每项用逗号`,`分隔
| 项 | 含义 | 类型 | 备注 |
| ---- | ------------------ | ----- | ------------------------------------------------------------ |
| 0 | 视频内弹幕出现时间 | float | 秒 |
| 1 | 弹幕类型 | int | 1 2 3普通弹幕<br />4底部<br />5顶部<br />6逆向<br />7精准定位<br />8代码弹幕<br />9BAS弹幕 |
| 2 | 弹幕字号 | int | 18 小<br />25 标准<br />36 大 |
| 3 | 弹幕颜色 | int | 十进制RGB888值 |
| 4 | 弹幕发送时间 | int | 时间戳 |
| 5 | 弹幕池类型 | int | 0普通池<br />1字幕池<br />2特殊池(高级弹幕) |
| 6 | 编码后的用户UID | HEX | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID |
| 7 | 弹幕dmID | int | 唯一 可用于操作参数 |
| 项 | 含义 | 类型 | 备注 |
| ---- | ------------------ | ------ | ------------------------------------------------------------ |
| 0 | 视频内弹幕出现时间 | float | 秒 |
| 1 | 弹幕类型 | int32 | 1 2 3普通弹幕<br />4底部弹幕<br />5顶部弹幕<br />6逆向弹幕<br />7高级弹幕<br />8代码弹幕<br />9BAS弹幕`pool`必须为2 |
| 2 | 弹幕字号 | int32 | 18<br />25标准<br />36 |
| 3 | 弹幕颜色 | int32 | 十进制RGB888值 |
| 4 | 弹幕发送时间 | int32 | 时间戳 |
| 5 | 弹幕池类型 | int32 | 0普通池<br />1字幕池<br />2:特殊池(代码/BAS弹幕 |
| 6 | 发送者UID的HASH | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID |
| 7 | 弹幕dmID | int64 | 唯一 可用于操作参数 |
```xml
<d p="490.19100,1,25,16777215,1584268892,0,a16fe0dd,29950852386521095">从结尾回来看这里,更感动了!</d>