首先先讲一下机制,采用的是Java Socket ,
首先需要房间真实的room_id
怎么获取api里面有,然后用WebSocket连接bilibili的弹幕服务器,连接成功后需要认证,不然服务器会断开,然后每30s需要发送一次心跳包,告诉服务器你任然存在,具体时间也可以不是30s,反正最多50s吧,没有具体测试过。
然后客户端向服务器发送的数据,都需要经过封包处理
封包由头部和数据组成,字节序均为大端模式
头部格式:
偏移量 | 长度 | 含义 |
---|---|---|
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": "但是最好随机生成",
"roomid": "房间ID",
"protover": 1,
"platform": "web",
"clientver": "1.10.6"
}
然后就是发送心跳包最好30s发送一次
接受bilibili服务端返回的数据,返回的格式根据内容的不同而改变,但有一项是不会变的cmd
代表操作命令
已知的命令:
命令 | 含义 |
---|---|
DANMU_MSG | 收到弹幕 |
SEND_GIFT | 有人送礼 |
WELCOME | 欢迎加入房间 |
WELCOME_GUARD | 欢迎房管加入房间 |
SYS_MSG | 系统消息 |
ROOM_REAL_TIME_MESSAGE_UPDATE | 粉丝数更新 |
其实还有一些不常用就不具体说了,项目里枚举类型里面写着的有。
重点来了,这里我说本地的一个websocket,将收到的消息进行转发,来达到一个线上预览的效果,如果你有其他用途请自行更改。
websocket
请求地址: ws://localhost:8888/bilibili/房间号
连接成功后就会收到转发回来的直播间信息,目前只做了弹幕、粉丝更新、用户进入、和房间人数的一个handle
这里顺便发一个线上websocket
的一个测试工具:websocket在线测试工具