官方文档:https://open-live.bilibili.com/document/eba8e2e1-847d-e908-2e5c-7a1ec7d9266f
注意:Post参数需要签名加密,并且设置到请求头;设置完后才能成功获得/app/start的响应,获得直接间弹幕服务器连接地址和鉴权信息;
可以在下面找到签名方法。
1. 获取直接间弹幕服务器信息
post请求 https://open-live.bilibili.com/v2/app/start
post参数:
参数名 | 类型 | 描述 |
---|---|---|
code | string | 主播身份码:身份码是随机生成的,会绑定自己的直播间,可以进入自己的直播中心获取 |
app_id | integer | 项目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请求: https://open-live.bilibili.com/v2/app/heartbeat
post参数:
参数名 | 类型 | 描述 |
---|---|---|
game_id | string | 场次id |
这里我发送项目心跳请求报错了,可能是没有场次ID的关系,但是并不影响连接弹幕服务器
3. 关闭项目
post请求: https://open-live.bilibili.com/v2/app/end
post参数:
参数名 | 类型 | 描述 |
---|---|---|
app_id | integer | 项目ID |
game_id | string | 场次id |
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},md5计算后得到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计算
声明字符串,赋值以下参数
String preAuthorization = "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();
如果请求签名没问题的话,那么我们发送 /v2/app/start 请求后就可以获得 wss_link 和 auth_body
Websocket获取B站直播间弹幕教程——第二篇、解包/拆包
假如用的是js/ts,那不用考虑这个问题,官方有现成的js。
官方文档:https://open-live.bilibili.com/document/657d8e34-f926-a133-16c0-300c1afc6e6b
【flutter / dart 版本】websocket获取B站直播弹幕——基于直播开放平台
【JAVA版本】websocket获取B站直播弹幕——基于直播开放平台
【JAVA版本】最新websocket获取B站直播弹幕——非官方开放API