B站服务器数据协议,B站直播间协议指南

2017/2/10: 截止目前的文章版本已经回退到最初版本,不一定会继续填坑。相关协议将会于未来开源的biliapi(python)中实现。

最近因为一些原因,所以在研究B站直播间相关的内容。结合逆向的Android客户端源码,我得以更深的了解B站直播间的协议。早些时候有dalao就解析过这个协议(链接),但是dalao是分析弹幕姬的,所以有很多疏漏或不清楚的地方。

目前,本文的内容尚未补全。

协议头

一般的,一个B站的直播间数据包的协议头为16字节。协议头的大致结构如下: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格式的:{"roomid ":0,"uid":0}

心跳包30s左右发送一次。

响应

弹幕、送礼、进入提示、开始直播、准备直播

这些数据包的数据包类型是相同的(都是5),而返回格式大体相同:{"cmd":"...","info":xxx}

其中,cmd允许的值有:

LIVE                             – 开始直播

PREPARING            – 准备直播

DANMU_MSG        – 弹幕信息

SEND_GIFT             – 送礼信息

WELCOME               – 进入房间信息(如姥爷进入房间有提示)

具体数据格式有待更新。

直播人数

直播人数包的数据类型为3。这个包一般在客户端发送心跳包以后返回。正文部分只有一个整数,就是直播间当前人数。

分享到

2725f9e45e98a5527d3d6cb13d364273.png

喜欢二次元的程序员,喜欢发发教程,或者偶尔开坑。(←然而并不打算填)