B站直播间弹幕获取 — 哔哩哔哩直播开放平台

902 阅读4分钟

首先、获取直播开放平台 秘钥

  1. 进入 哔哩哔哩直播开放平台open-live.bilibili.com/
  2. 注册申请个人开发者认证,获得access_key_id 和 access_key_secred
  3. 进入bilibili创作者服务中心 -> 创建项目 -> 获得项目ID( app_id )

官方文档open-live.bilibili.com/document/eb…

开启/关闭你项目时 需要发送的请求

注意:Post参数需要签名加密,并且设置到请求头;设置完后才能成功获得/app/start的响应,获得直接间弹幕服务器连接地址和鉴权信息;
可以在下面找到签名方法。

1. 获取直接间弹幕服务器信息
post请求 open-live.bilibili.com/v2/app/star…
post参数:

参数名类型描述
codestring主播身份码:身份码是随机生成的,会绑定自己的直播间,可以进入自己的直播中心获取
app_idinteger项目ID

响应:

{
    "code": 0,
    "message": "ok",
    "data": {
        //  场次信息
        "game_info": {
            //  场次id,心跳key(心跳保持20s-60s)调用一次,超过60s无心跳自动关闭,长连停止推送消息
            "game_id": ""
        },
        //  长连信息
        "websocket_info": {
            //  长连使用的请求json体 第三方无需关注内容,建立长连时使用即可
            "auth_body": "",
            //  wss 长连地址
            "wss_link": [...]
        },
        //  主播信息
        "anchor_info": {...}
    }
}

game_id: 为场次id, 未上线前这个返回值好像是空的
websocket_info: 获取弹幕服务器地址wss_link 和 用于鉴权的auth_body

2. 保持项目心跳,每隔20s发送一次
post请求: open-live.bilibili.com/v2/app/hear…
post参数:

参数名类型描述
game_idstring场次id

这里我发送项目心跳请求报错了,可能是没有场次ID的关系,但是并不影响连接弹幕服务器

3. 关闭项目
post请求: open-live.bilibili.com/v2/app/end
post参数:

参数名类型描述
app_idinteger项目ID
game_idstring场次id

POST请求头设置 - 请求签名

POST请求头
Accept: application/json
Content-Type: application/json
x-bili-content-md5: 0b010df38273f74f17772b286b1a8406
x-bili-timestamp: 1695448824
x-bili-signature-version: 1.0
x-bili-signature-nonce: 1b4c4604-a446-45c3-b918-8795c7419e16
x-bili-signature-method: HMAC-SHA256
x-bili-accesskeyid: xxxxxxxxxxxxxxx
Authorization: xxxxxxxxxxxxxx

请求头详细说明
Accept: application/json
Content-Type: 必须为application/json,后面加; charset=utf-8都不行
x-bili-content-md5: post参数的json字符串进行MD5后得到的32位字符串
比如/v2/app/start的post参数{"code":"SSSS8SSS88S88", "app_id":123456789101},计算后得到0b010df38273f74f17772b286b1a8406
x-bili-timestamp: 十位的时间戳
x-bili-signature-version: 目前1.0
x-bili-signature-nonce: 随机数,官方用的是uuid
x-bili-signature-method: 签名算法:目前固定HMAC-SHA256
x-bili-accesskeyid: 个人开发者的access_key_id
Authorization: sha256计算后的字符串,具体计算方法在下面

Authorization计算
声明字符串,赋值以下参数
x-bili-accesskeyid:个人开发者的access_key_id\n
x-bili-content-md5:0b010df38273f74f17772b286b1a8406\n
x-bili-signature-method:HMAC-SHA256\n
x-bili-signature-nonce:1b4c4604-a446-45c3-b918-8795c7419e16\n
x-bili-signature-version:1.0\n
x-bili-timestamp:1695448824
注意: 参数直接必须用 \n 隔开
然后用sha256工具类对该字符串进行计算,结果赋值到Authorization请求头。
下面以JAVA代码为例子

StringBuilder s = new StringBuilder();  
s.append(x-bili-accesskeyid:).append(access_key_id).append(\n);  
s.append(x-bili-content-md5:).append(contentMd5).append(\n);  
s.append(x-bili-signature-method:HMAC-SHA256).append(\n);  
s.append(x-bili-signature-nonce:).append(uuid).append(\n);  
s.append(x-bili-signature-version:1.0).append(\n);  
s.append(x-bili-timestamp:).append(1695448824);  
//SHA256计算
String macAlgorithm = "HmacSHA256";  
byte[] headerByte = s.toString().getBytes(StandardCharsets.UTF_8);  
byte[] secretByte = secret.accessSecret.getBytes(StandardCharsets.UTF_8);  
Mac mac = Mac.getInstance(macAlgorithm);  
mac.init(new SecretKeySpec(secretByte, macAlgorithm));  
byte[] bytes = mac.doFinal(headerByte);  
//byte数组转字符串,大家可以找工具类转字符串
StringBuffer stringBuffer = new StringBuffer();  
String temp = null;  
for (int i=0;i<bytes.length;i++){  
    temp = Integer.toHexString(bytes[i] & 0xFF);  
    if (temp.length()==1){  
        stringBuffer.append("0");  
    }  
    stringBuffer.append(temp);  
}  
return stringBuffer.toString();

Websocket连接弹幕服务器

如果请求签名没问题的话,那么我们发送/v2/app/start请求后就可以获得wss_link和auth_body

  1. 在wss_link选一个服务器节点地址
  2. 发送websocket请求到服务器节点地址
  3. 成功连接服务后,发送认证协议包(将auth_body根据B站封包协议转成byte数组,然后发送)
  4. 认证成功后,每30秒发送心跳包(根据B站封包协议转成byte数组,然后发送),保证不会自动断开连接
  5. 以上操作成功后,websocket的onMessage就能监听到消息,当然消息也需要根据B站协议解包


具体怎么封包解包可以看官方文档,我就不细说了。
官方文档open-live.bilibili.com/document/65…
当然有需要的话,有空我也会补上。