# protobuf弹幕2020年5月23日,哔哩哔哩网页端及移动端启用了新的默认弹幕 API,网页端弹幕显示的上限变为原弹幕池上限的两倍。
新的 API 是以 6min 为一个单位加载,即每次加载 6min 内的弹幕
# 获取实时弹幕https://api.bilibili.com/x/v2/dm/web/seg.so (web端)
https://api.bilibili.com/x/v2/dm/wbi/web/seg.so (web 端新接口,需要 wbi 认证)
https://api.bilibili.com/x/v2/dm/list/seg.so (APP端)
https://i0.hdslb.com/bfs/dm/{data}.bin (BAS/代码弹幕专包)
请求方式:GET认证方式:半匿名(部分视频在无 Cookie: SESSDATA 时只返回部分弹幕)
此接口与漫画弹幕相同
只能返回普通弹幕(pool=1 mode=1-7)和代码弹幕(pool=2 mode=8),BAS弹幕(pool=2 mode=9)请从弹幕元数据中获取
互动弹幕(UP 主头像弹幕、关联视频、内嵌关注按钮)也不存在这个接口,请从弹幕元数据中获取
注:仅获取 6min 的整数倍时间内的弹幕,6min 内最多弹幕数为 6000 条(如第一包中弹幕progress值域为0-360000)
url参数:
参数名类型内容必要性备注typenum弹幕类必要1:视频弹幕2:漫画弹幕oidnum视频 cid必要pidnum稿件 avid非必要segment_indexnum分包必要6min 一包pull_modenum(?)非必要psnum(?)非必要penum(?)非必要proto回复:
proto定义见:bilibili.community.service.dm.v1.DmSegMobileReply
protogen.marcgravellopen in new window: 在线编译 protogen 工具, 无需再安装本地编译器(生成文件需加后缀_pb2.py才可使用)
protobuf pipopen in new window: 可一键安装的 Python 的 protogen 解析库
消息DmSegMobileReply:
名称类型含义备注elemsrepeated DanmakuElem弹幕条目消息DanmakuElem:
名称类型含义备注idint64弹幕 dmid唯一 可用于操作参数progressint32视频内弹幕出现时间毫秒modeint32弹幕类型1 2 3:普通弹幕4:底部弹幕5:顶部弹幕6:逆向弹幕7:高级弹幕8:代码弹幕9:BAS 弹幕(仅限于特殊弹幕专包)fontsizeint32弹幕字号18:小25:标准36:大coloruint32弹幕颜色十进制 RGB888 值midHashstring发送者 mid 的 HASH用于屏蔽用户和查看用户发送的所有弹幕,也可反查用户idcontentstring弹幕内容utf-8编码ctimeint64弹幕发送时间时间戳weightint32权重用于智能屏蔽,根据弹幕语义及长度通过AI识别得出范围:[0-10]值越大权重越高actionstring动作?poolint32弹幕池0:普通池1:字幕池2:特殊池(代码/BAS弹幕)idStrstring弹幕 dmid字串形式唯一 可用于操作参数attrint32弹幕属性位bit0:保护bit1:直播bit2:高赞animationstring动画?示例:
获取视频av810872(cid=1176840)(炮姐)的实时弹幕分包 1
注:以下proto定义需要编译,bilibili.community.service.dm.v1.dm_pb2并非通过 pypi 安装
import requests
import google.protobuf.text_format as text_format
import bilibili.community.service.dm.v1.dm_pb2 as Danmaku
url = 'https://api.bilibili.com/x/v2/dm/web/seg.so'
params = {
'type': 1, # 弹幕类型
'oid': 1176840, # cid
'pid': 810872, # avid
'segment_index': 1 # 弹幕分段
}
resp = requests.get(url, params)
data = resp.content
danmaku_seg = Danmaku.DmSegMobileReply()
danmaku_seg.ParseFromString(data)
print(text_format.MessageToString(danmaku_seg.elems[0], as_utf8=True))
输出:
id: 711923911
progress: 47880
mode: 1
fontsize: 18
color: 10092288
midHash: "59417e95"
content: "世界第一电击公主殿下,遇到你是我一生最美好的风景!吾炮赛高,永生不离!唯我超电磁炮永世长存! "
ctime: 1418799826
weight: 6
idStr: "711923911"
attr: 1