文章目录[隐藏]
- 协议头
- 请求
- 进入房间、心跳包
- 响应
- 弹幕、送礼、进入提示、开始直播、准备直播
- 直播人数
2017/2/10: 截止目前的文章版本已经回退到最初版本,不一定会继续填坑。相关协议将会于未来开源的biliapi(python)中实现。
最近因为一些原因,所以在研究B站直播间相关的内容。结合逆向的Android客户端源码,我得以更深的了解B站直播间的协议。早些时候有dalao就解析过这个协议(链接),但是dalao是分析弹幕姬的,所以有很多疏漏或不清楚的地方。
目前,本文的内容尚未补全。
协议头
一般的,一个B站的直播间数据包的协议头为16字节。协议头的大致结构如下:
代码语言:javascript复制00000000: 00 00 00 35 00 10 00 01 00 00 00 07 00 00 00 01
- 1-4个字节:整数,数据包大小
- 5-6个字节:短整数,固定值16(推测是协议头长度)
- 7-8个字节:短整数,推测是使用设备(安卓端写死为0,dalao文章中固定为1)
- 9-12个字节:整数,数据包类型
- 13-16个字节:整数,推测是使用设备(和7-8个字节相同)
无论是发送数据还是返回数据,一般来说都是需要附上数据头。数据包类型已知的有以下几种:
- 请求:2(心跳包)、7(用户进入房间)
- 响应:1,2,3(人数包,1、2是dalao文章中提到的,实际并未发现)、5(弹幕、礼物等等数据)
对于响应包,客户端显示4、6、7都是无效的数据包类型(参见com.bilibili.cfu)。而com.bilibili.cfw显示0、2-7似乎都是有效的值。
请求
进入房间、心跳包
这两个数据包的正文相同,都是json格式的:
代码语言:javascript复制{"roomid ":0,"uid":0}
心跳包30s左右发送一次。
响应
弹幕、送礼、进入提示、开始直播、准备直播
这些数据包的数据包类型是相同的(都是5),而返回格式大体相同:
代码语言:javascript复制{"cmd":"...","info":xxx}
其中,cmd允许的值有:
- LIVE – 开始直播
- PREPARING – 准备直播
- DANMU_MSG – 弹幕信息
- SEND_GIFT – 送礼信息
- WELCOME – 进入房间信息(如姥爷进入房间有提示)
具体数据格式有待更新。
直播人数
直播人数包的数据类型为3。这个包一般在客户端发送心跳包以后返回。正文部分只有一个整数,就是直播间当前人数。