我已经写成了Python版弹幕客户端
连接
首先URL中的ID和真正的房间ID不一样,要先请求https://api.live.bilibili.com/room/v1/Room/room_init?id=URL中的ID
获取房间ID。返回的是JSON数据,['data']['room_id']
就是真正的房间ID
然后用WebSocket连接wss://broadcastlv.chat.bilibili.com:2245/sub
封包格式
封包由头部和数据组成,字节序均为大端模式
头部格式:
偏移量 | 长度 | 含义 |
---|---|---|
0 | 4 | 封包总大小 |
4 | 2 | 头部长度 |
6 | 2 | 协议版本,目前是1 |
8 | 4 | 操作码(封包类型) |
12 | 4 | sequence,可以取常数1 |
已知的操作码:
操作码 | 含义 |
---|---|
2 | 客户端发送的心跳包 |
3 | 人气值,数据不是JSON,是4字节整数 |
5 | 命令,数据中['cmd'] 表示具体命令 |
7 | 认证并加入房间 |
8 | 服务器发送的心跳包 |
数据格式:一般为JSON字符串UTF-8编码
认证并加入房间
连接后客户端先发认证包
{
"uid": 0表示未登录,否则为用户ID,
"roomid": 房间ID,
"protover": 1,
"platform": "web",
"clientver": "1.4.0"
}
心跳包
客户端要每30s发一次
命令包
根据前端代码,数据也可能是多条命令的数组,不过我只收到过单条命令。每条命令中['cmd']
表示具体命令
已知的命令:
命令 | 含义 |
---|---|
DANMU_MSG | 收到弹幕 |
SEND_GIFT | 有人送礼 |
WELCOME | 欢迎加入房间 |
WELCOME_GUARD | 欢迎房管加入房间 |
SYS_MSG | 系统消息 |
PREPARING | 主播准备中 |
LIVE | 直播开始 |
WISH_BOTTLE | 许愿瓶? |
收到弹幕
数据示例:
{
"info": [
[
0,
1,
25,
16777215,
1526267394,
-