diff --git a/README.md b/README.md index a06848f..d32d49d 100644 --- a/README.md +++ b/README.md @@ -72,8 +72,8 @@ PS:所有http协议地址均可使用https,文档中为了统一写作`http` - 状态数 - 操作 - [视频弹幕](danmaku) - - [protobuf实时弹幕](danmaku/danmaku_proto.md)× - - protobuf云推荐弹幕 + - [protobuf实时弹幕](danmaku/danmaku_proto.md)√ + - [protobuf弹幕元数据(BAS弹幕/互动弹幕)](danmaku/danmaku_view.md)√ - [xml实时弹幕](danmaku/danmaku_xml.md)√ - [xml历史弹幕](danmaku/history.md)√ - [快照](danmaku/snapshot.md)√ @@ -81,6 +81,7 @@ PS:所有http协议地址均可使用https,文档中为了统一写作`http` - 高级弹幕 - 屏蔽管理 - 智能防挡弹幕 + - 弹幕个人配置修改 - [专栏](article) - 分区 - [基本信息](article/info.md)× diff --git a/danmaku/action.md b/danmaku/action.md index c1b51ae..a925a3c 100644 --- a/danmaku/action.md +++ b/danmaku/action.md @@ -8,12 +8,16 @@ 认证方式:Cookie(SESSDATA)或APP +此接口与漫画弹幕相同 + +`mode=6`的逆向弹幕与`mode=8`的代码弹幕不可发送 + **正文参数( application/x-www-form-urlencoded ):** | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ---------- | ---- | ------------------------ | -------------- | ------------------------------------------------------------ | | access_key | str | APP登录Token | APP方式必要 | | -| type | num | 1 | 必要 | | +| type | num | 弹幕类选择 | 必要 | 1:视频弹幕 | | oid | num | 视频CID | 必要 | | | msg | str | 弹幕内容 | 必要 | 长度小于100字符 | | bvid | str | 视频bvID | 必要(可选) | avID与bvID任选一个 | @@ -115,7 +119,7 @@ curl 'http://api.bilibili.com/x/v2/dm/post'\ | dmid | num | 修改互动弹幕的弹幕ID | 非必要 | 注:修改弹幕`plat`必须为8 | | csrf | str | CSRF Token(位于cookie) | Cookie方式必要 | | -`data`参数: +`data`参数json序列: 类型为【UP主头像弹幕】时: @@ -179,6 +183,15 @@ curl 'http://api.bilibili.com/x/v2/dm/post'\ | title | str | 关联视频的标题 | | | bvid | str | 关联视频的bvID | | +类型为【视频内嵌引导关注按钮】时: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ----------- | ---------------------------------- | +| duration | num | 持续时间 | 单位为毫秒 | +| posX | num | X坐标 | 区间:[118-549] | +| posY | num | Y坐标 | 区间:[82-293] | +| icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 | + **示例:** 为视频`av201947622`(CID为`230709860`)的5000ms位置发送一条UP主头像弹幕`test` diff --git a/danmaku/danmaku_proto.md b/danmaku/danmaku_proto.md index 6291c8d..37a1934 100644 --- a/danmaku/danmaku_proto.md +++ b/danmaku/danmaku_proto.md @@ -14,7 +14,9 @@ 此接口与漫画弹幕相同 -只能返回普通和高级弹幕,代码(BAS)弹幕请从云推荐弹幕中获取 +只能返回普通弹幕(`pool=1` `mode=1-7`)和代码弹幕(`pool=2` `mode=8`),BAS弹幕(`pool=2` `mode=9`)请从[弹幕元数据](danmaku_view_proto.md)中获取 + +互动弹幕(UP主头像弹幕、关联视频、内嵌关注按钮)也不存在这个接口,请从[弹幕元数据](danmaku_view_proto.md)中获取 **注:仅获取6min的整数倍时间内的弹幕,6min内最多弹幕数为6000条(如第一包中弹幕`progress`值域为0-360000)** @@ -22,31 +24,35 @@ | 参数名 | 类型 | 内容 | 必要性 | 备注 | | ------------- | ---- | -------- | ------ | ----------- | -| type | num | 弹幕分类 | 必要 | 1:视频弹幕 | +| type | num | 弹幕类 | 必要 | 1:视频弹幕 | | oid | num | 视频CID | 必要 | | | pid | num | 视频avID | 非必要 | | | segment_index | num | 分包 | 必要 | 6分钟一包 | -**回复:** +**proto回复:** -返回二进制数据,需要自行解析 +消息`DmSegMobileReply`: -**示例:** +| 名称 | 类型 | 含义 | 备注 | +| ----- | ---------------- | -------- | ---- | +| elems | repeated message | 弹幕条目 | | -获取视频`av810872(CID=1176840)`的实时弹幕分段`1` +消息`DanmakuElem`: -```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 | int64 | 弹幕dmID | 唯一 可用于操作参数 | +| progress | int32 | 视频内弹幕出现时间 | 毫秒 | +| mode | int32 | 弹幕类型 | 1 2 3:普通弹幕
4:底部弹幕
5:顶部弹幕
6:逆向弹幕
7:高级弹幕
8:代码弹幕
~~9:BAS弹幕~~ | +| fontsize | int32 | 弹幕字号 | 18:小
25:标准
36:大 | +| color | uint32 | 弹幕颜色 | 十进制RGB888值 | +| midHash | string | 发送者UID的HASH | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID | +| content | string | 弹幕内容 | utf-8编码 | +| ctime | int64 | 弹幕发送时间 | 时间戳 | +| weight | int32 | 权重 | 用于智能屏蔽,根据弹幕语义及长度通过AI识别得出
范围:[0-10]
值越大权重越高 | +| action | string | 动作? | 作用尚不明确 | +| pool | int32 | 弹幕池 | 0:普通池
1:字幕池
2:特殊池(代码/BAS弹幕) | +| idStr | string | 弹幕dmID | 字串形式
唯一 可用于操作参数 | protobuf结构体: @@ -65,30 +71,30 @@ message DanmakuElem { string content = 7; //弹幕内容 int64 ctime = 8; //发送时间 int32 weight = 9; //权重 - string action = 10; //动作 + string action = 10; //动作? int32 pool = 11; //弹幕池 - string idStr = 12; //弹幕dmID + string idStr = 12; //弹幕dmID(字串形式) } message DmSegMobileReply { - repeated DanmakuElem elems = 1; + repeated DanmakuElem elems = 1; //弹幕条目 } ``` -| 名称 | 含义 | 类型 | 备注 | -| -------- | -------------------- | ------ | ------------------------------------------------------------ | -| id | 弹幕dmID | int64 | 唯一 可用于操作参数 | -| progress | 视频内弹幕出现时间 | int32 | 毫秒 | -| mode | 弹幕类型 | int32 | 1 2 3:普通弹幕
4:底部弹幕
5:顶部弹幕
6:逆向弹幕
7:高级弹幕
8:代码弹幕
9:BAS弹幕 | -| fontsize | 弹幕字号 | int32 | 18:小
25:标准
36:大 | -| color | 弹幕颜色 | uint32 | 十进制RGB888值 | -| midHash | 发送者UID的HASH | string | 用于屏蔽用户和查看用户发送的所有弹幕 也可反查用户ID | -| content | 弹幕内容 | string | utf-8编码 | -| ctime | 弹幕发送时间 | int64 | 时间戳 | -| weight | 权重 | int32 | 用于智能屏蔽级别 | -| action | 动作 | string | 未知 | -| pool | 弹幕池 | int32 | 0:普通池
1:字幕池
2:特殊池(代码/BAS弹幕) | -| idStr | 弹幕dmID的字符串类型 | string | 唯一 可用于操作参数 | +**示例:** + +获取视频`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二进制数据 ## 实例 @@ -104,15 +110,21 @@ protoc --python_out=. bilidm.proto --- -以下为python测试代码 +以下为python测试代码,输出第一包的第一条弹幕 ```python import bilidm_pb2 import requests -url = 'http://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=1176840&pid=810872&segment_index=1' + +AVID = 810872 +CID = 1176840 +SEG = 1 +url = 'http://api.bilibili.com/x/v2/dm/web/seg.so?type=1&oid=' + str(CID) + '&pid=' + str(AVID) + '&segment_index=' + str(SEG) + data = requests.get(url) target = bilidm_pb2.DmSegMobileReply() target.ParseFromString(data.content) + print(target.elems[0]) print(target.elems[0].content) ``` diff --git a/danmaku/danmaku_view_proto.md b/danmaku/danmaku_view_proto.md new file mode 100644 index 0000000..964c116 --- /dev/null +++ b/danmaku/danmaku_view_proto.md @@ -0,0 +1,290 @@ +# 弹幕元数据 + +2020-09-25 B站更新了互动弹幕功能,包括UP主头像弹幕、关联视频弹幕、视频内嵌引导关注按钮三大功能 + +详情见: + +[【客户端更新】6.10版本更新!UP主支持发布关联视频弹幕]( https://www.bilibili.com/read/cv7728299 ) + + [引导关注卡片](https://www.bilibili.com/blackboard/activity-c8a0iDRQy.html ) + +## 获取弹幕个人配置与互动弹幕及BAS(代码)弹幕专包(web端) + +> http://api.bilibili.com/x/v2/dm/web/view + +*请求方式:GET* + +认证方式:仅可Cookie(SESSDATA) + +**url参数:** + +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ------ | ---- | -------- | ------ | ----------- | +| type | num | 弹幕类 | 必要 | 1:视频弹幕 | +| oid | num | 视频CID | 必要 | | +| pid | num | 视频avID | 非必要 | | + +**proto回复:** + +消息`DmWebViewReply`: + +| 名称 | 类型 | 含义 | 备注 | +| ---------- | ---------------- | ---------------------- | ---------------------------- | +| state | int32 | 弹幕开放状态 | 0:开放弹幕
1:禁止弹幕 | +| text | string | ? | | +| textSide | string | ? | | +| dmSge | message | 分段弹幕包信息? | | +| flag | message | ? | | +| specialDms | repeated message | BAS(代码)弹幕专包url | | +| checkBox | bool | ? | | +| count | int64 | 实际弹幕总数 | 具有1500-6000不等的上限 | +| commandDms | repeated message | 互动弹幕条目 | | +| dmSetting | message | 弹幕个人配置 | 仅登录后存在 | + +消息`dmSge`: + +| 名称 | 类型 | 含义 | 备注 | +| -------- | ----- | ------------ | ---------- | +| pageSize | int64 | 分段时间? | 单位为毫秒 | +| total | int64 | 最大分页数? | | + +消息`flag`: + +| 名称 | 类型 | 含义 | 备注 | +| --------- | ------ | ---- | ---- | +| recFlag | int32 | ? | | +| recText | string | ? | | +| recSwitch | int32 | ? | | + +消息`commandDms`: + +| 名称 | 类型 | 含义 | 备注 | +| -------- | ------ | ------------ | ------------------------------------------------------------ | +| id | int64 | 弹幕dmID | | +| oid | int64 | 视频CID | | +| mid | int64 | 发送者UID | | +| command | string | 弹幕指令 | `#UP#`:UP主头像弹幕
`#LINK#`:关联视频弹幕
`#ATTENTION#`:视频内嵌引导关注按钮 | +| content | string | 弹幕文字 | | +| progress | int32 | 弹幕出现时间 | 单位为毫秒 | +| ctime | string | 创建时间? | 此项为空 | +| mtime | string | 修改时间? | 此项为空 | +| extra | string | 弹幕负载数据 | json序列字串 | +| idStr | string | 弹幕dmID | 字串形式 | + +`extra`json序列: + +类型为【UP主头像弹幕】时: + +| 字段 | 类型 | 内容 | 备注 | +| ---- | ---- | ----------- | ---- | +| icon | str | UP主头像url | | + +类型为【关联视频弹幕】时:类型为【关联视频弹幕】时: + +| 字段 | 类型 | 内容 | 备注 | +| ----- | ---- | ------------------- | ---- | +| aid | num | 关联视频的avID | | +| title | str | 关联视频的标题 | | +| icon | str | 关联视频按钮图片url | | +| bvid | str | 关联视频的bvID | | + +类型为【视频内嵌引导关注按钮】时: + +| 字段 | 类型 | 内容 | 备注 | +| -------- | ---- | ----------- | ---------------------------------- | +| duration | num | 持续时间 | 单位为毫秒 | +| posX | num | X坐标 | 区间:[118-549] | +| posY | num | Y坐标 | 区间:[82-293] | +| icon | str | 按钮图片url | 不应该是关注按钮吗,但这个是圆形的 | + +消息`dmSetting`: + +| 名称 | 类型 | 含义 | 备注 | +| ------------ | ------ | ------------------------ | ------------------------------------------------------------ | +| dmSwitch | bool | 弹幕开关 | true:开启
false:关闭 | +| aiSwitch | bool | 智能云屏蔽 | 同上 | +| aiLevel | int32 | 智能云屏蔽级别 | 区间:[1-10] | +| blocktop | bool | 屏蔽类型-顶部 | true:不屏蔽
false:屏蔽 | +| blockscroll | bool | 屏蔽类型-滚动 | 同上 | +| blockbottom | bool | 屏蔽类型-底部 | 同上 | +| blockcolor | bool | 屏蔽类型-彩色 | 同上 | +| blockspecial | bool | 屏蔽类型-特殊 | 同上 | +| preventshade | bool | 防挡弹幕(底部15%) | true:开启
false:关闭 | +| dmask | bool | 智能防挡弹幕(人像蒙版) | 同上 | +| opacity | float | 弹幕不透明度 | 区间:[0-1] | +| dmarea | int32 | 弹幕显示区域 | 100:不重叠
75:3/4屏
50:半瓶
25:1/4屏
0:不限 | +| speedplus | float | 弹幕速度 | 区间:[0.4-1.6] | +| fontsize | float | 字体大小 | 区间:[0.4-1.6] | +| screensync | bool | 跟随屏幕缩放比例 | | +| speedsync | bool | 根据播放倍速调整速度 | | +| fontfamily | string | 字体类型? | 未启用 | +| bold | bool | 粗体? | 未启用 | +| fontborder | int32 | 描边类型 | 0:重墨
1:描边
2:45°投影 | +| drawType | string | 渲染类型? | 未启用 | + +protobuf结构体: + +**web_dmview.proto** + +```protobuf +syntax = "proto3"; + +//分段弹幕包信息? +message DmSegConfig { + int64 pageSize = 1; //分段时间? + int64 total = 2; //最大分页数? +} + +// +message DanmakuFlagConfig { + int32 recFlag = 1; // + string recText = 2; // + int32 recSwitch = 3; // +} + +// 互动弹幕条目 +message CommandDm { + int64 id = 1; //弹幕dmID + int64 oid = 2; //视频CID + int64 mid = 3; //发送者UID + string command = 4; //弹幕指令 + string content = 5; //弹幕文字 + int32 progress = 6; //弹幕出现时间 + string ctime = 7; // + string mtime = 8; // + string extra = 9; //弹幕负载数据 + string idStr = 10; //弹幕dmID(字串形式) +} + +//弹幕个人配置 +message DanmuWebPlayerConfig{ + bool dmSwitch=1; //弹幕开关 + bool aiSwitch=2; //智能云屏蔽 + int32 aiLevel=3; //智能云屏蔽级别 + bool blocktop=4; //屏蔽类型-顶部 + bool blockscroll=5; //屏蔽类型-滚动 + bool blockbottom=6; //屏蔽类型-底部 + bool blockcolor=7; //屏蔽类型-彩色 + bool blockspecial=8; //屏蔽类型-特殊 + bool preventshade=9; //防挡弹幕(底部15%) + bool dmask=10; //智能防挡弹幕(人像蒙版) + float opacity=11; //弹幕不透明度 + int32 dmarea=12; //弹幕显示区域 + float speedplus=13; //弹幕速度 + float fontsize=14; //字体大小 + bool screensync=15; //跟随屏幕缩放比例 + bool speedsync=16; //根据播放倍速调整速度 + string fontfamily=17; //字体类型? + bool bold=18; //粗体? + int32 fontborder=19; //描边类型 + string drawType=20; //渲染类型? +} + +message DmWebViewReply { + int32 state = 1; //弹幕开放状态 + string text = 2; // + string textSide = 3; // + DmSegConfig dmSge = 4; //分段弹幕包信息? + DanmakuFlagConfig flag = 5; // + repeated string specialDms = 6; //BAS(代码)弹幕专包url + bool checkBox = 7; // + int64 count = 8; //实际弹幕总数 + repeated CommandDm commandDms = 9; //互动弹幕条目 + DanmuWebPlayerConfig dmSetting = 10; //弹幕个人配置 +} +``` + +**示例:** + +获取视频`av797164471(CID=236871317)`的弹幕元数据 + +```shell +curl -G 'http://api.bilibili.com/x/v2/dm/web/view'\ +--data-urlencode 'type=1'\ +--data-urlencode 'oid=236871317'\ +--data-urlencode 'pid=797164471'\ +-b 'SESSDATA=xxx'\ +-o 'danmaku_view.bin' +``` + +响应正文为protubuf二进制数据 + +## 获取互动弹幕 + +获取视频`av797164471(CID=236871317)`的互动弹幕 + +```python +import web_dmview_pb2 +import requests + +CID = 236871317 +url = 'http://api.bilibili.com/x/v2/dm/web/view?type=1&oid='+str(CID) + +data = requests.get(url) +target = web_dmview_pb2.DmWebViewReply() +target.ParseFromString(data.content) + +commandDms_len=len(target.commandDms) +print('互动弹幕数=',commandDms_len) +for i in range(commandDms_len): + print('互动弹幕[',i,']:') + print('---弹幕ID=',target.commandDms[i].id) + print('---视频CID=',target.commandDms[i].oid) + print('---发送者UID=',target.commandDms[i].mid) + print('---弹幕指令=',target.commandDms[i].command) + print('---弹幕文字=',target.commandDms[i].content) + print('---弹幕出现时间=',target.commandDms[i].progress) + print('---ctime=',target.commandDms[i].ctime) + print('---mtime=',target.commandDms[i].mtime) + print('---弹幕负载数据=',target.commandDms[i].extra) + print('---弹幕ID(字串)=',target.commandDms[i].idStr) +``` + +输出为: + +``` +互动弹幕数= 1 +互动弹幕[ 0 ]: +---弹幕ID= 38469676112019463 +---视频CID= 236871317 +---发送者UID= 501183549 +---弹幕指令= #UP# +---弹幕文字= 这个视频没有恰饭!别紧张! +---弹幕出现时间= 157818 +---ctime= +---mtime= +---弹幕负载数据= {"icon":"http://i1.hdslb.com/bfs/face/559abe31f561f71f3106d8ee7b2065cac50c1235.jpg"} +---弹幕ID(字串)= 38469676112019463 +``` + +## 获取BAS(代码)弹幕专包 + +BAS弹幕(`pool=2` `mode=9`)只能从此包获取,代码弹幕(`pool=2` `mode=8`)也能从此包获取 + +获取视频`av2(CID=62131)`的BAS(代码)弹幕专包 + +```python +import web_dmview_pb2 +import requests + +CID = 62131 +url = 'http://api.bilibili.com/x/v2/dm/web/view?type=1&oid='+str(CID) + +data = requests.get(url) +target = web_dmview_pb2.DmWebViewReply() +target.ParseFromString(data.content) + +specialDms_len=len(target.specialDms) +print('特殊弹幕包数=',specialDms_len) +for i in range(specialDms_len): + print('特殊弹幕包url[',i,']=',target.specialDms[i]) +``` + +输出为: + +``` +特殊弹幕包数= 1 +特殊弹幕包url[ 0 ]= http://i0.hdslb.com/bfs/dm/b0d5f08c12be59292aa0d4e09b6dd8e54c2ba886.bin +``` + +使用[普通分段包弹幕](danmaku_proto.md)的proto结构体反序列化此bin数据 \ No newline at end of file diff --git a/user/relation.md b/user/relation.md index 693f2c9..de99ddc 100644 --- a/user/relation.md +++ b/user/relation.md @@ -183,12 +183,13 @@ curl -G 'http://api.bilibili.com/x/relation/followers'\ **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| vmid | num | 目标用户UID | 必要 | | -| ps | num | 每页项数 | 非必要 | 默认为50 | -| pn | num | 页码 | 非必要 | 默认为1
其他用户仅可查看前5页 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------ | ----------- | ------------------------------------------------------- | +| access_key | str | APP登录Token | APP方式必要 | | +| vmid | num | 目标用户UID | 必要 | | +| order_type | str | 排序方式 | 非必要 | 按照关注顺序排列:留空
按照最常访问排列:attention | +| ps | num | 每页项数 | 非必要 | 默认为50 | +| pn | num | 页码 | 非必要 | 默认为1
其他用户仅可查看前5页 | **json回复:** @@ -268,11 +269,12 @@ data 对象: **示例:** -获取用户`UID=293793435`的关注明细 +获取用户`UID=293793435`的关注明细,按照关注顺序 ```shell curl -G 'http://api.bilibili.com/x/relation/ollowings'\ --data-urlencode 'vmid=293793435'\ +--data-urlencode 'order_type='\ --data-urlencode 'ps=2'\ --data-urlencode 'pn=1'\ -b 'SESSDATA=xxx' @@ -1022,12 +1024,13 @@ curl 'http://api.bilibili.com/x/relation/tags'\ **url参数:** -| 参数名 | 类型 | 内容 | 必要性 | 备注 | -| ---------- | ---- | ------------ | ----------- | ---------------------------------- | -| access_key | str | APP登录Token | APP方式必要 | | -| tagid | num | 分组ID | 必要 | 特别关注恒为-10
默认分组恒为0 | -| ps | num | 每页项数 | 非必要 | 默认为50 | -| pn | num | 页数 | 非必要 | 默认为1 | +| 参数名 | 类型 | 内容 | 必要性 | 备注 | +| ---------- | ---- | ------------ | ----------- | ------------------------------------------------------- | +| access_key | str | APP登录Token | APP方式必要 | | +| tagid | num | 分组ID | 必要 | 特别关注恒为-10
默认分组恒为0 | +| order_type | str | 排序方式 | 非必要 | 按照关注顺序排列:留空
按照最常访问排列:attention | +| ps | num | 每页项数 | 非必要 | 默认为50 | +| pn | num | 页数 | 非必要 | 默认为1 | **json回复:** @@ -1087,11 +1090,12 @@ curl 'http://api.bilibili.com/x/relation/tags'\ **示例:** -以每页2项的方式获取了ID为`207542`分组的第1页的粉丝明细 +以每页2项的方式获取了ID为`207542`分组的第1页的粉丝明细,按照关注顺序 ```shell curl -G 'http://api.bilibili.com/x/relation/tag'\ --data-urlencode 'tagid=207542'\ +--data-urlencode 'order_type='\ --data-urlencode 'ps=2'\ --data-urlencode 'pn=1'\ -b 'SESSDATA=xxx'