2023-06-27


星期二 晴

昨天晚上电脑更新了好久好久, 等的不耐烦了直接放在那让他自己更新去了。

早上了护士又来给我抽血了, 但是这次只抽了3管, 上次抽了五管。

一觉醒来发现昨天插的耳棒掉了, 所以又让我妈给我重新弄了一根。

这个随身wifi的流量已经用了30g了, 还剩10g希望可以坚持一下吧 (虽然说流量还可以买, 6块钱买10g)

rtast.toprtast.cn 这两个域名是主要的域名, 其他的域名可以不用续费😊。

现在 https://diary.rtast.cn 也可以打开笔记本了😋。主要还是 https://diary.rtast.cn 这个域名每天可以更新一百次, 那个.top域名每个月只能更新300次, 所以更新次数多了, 就只有cn域名可以看到日记了。

这个日记本的源代码仓库现在只有我可以编辑~。

早上又对日记本改造了一下, 感觉更好看了~。

刚才医生过来问我的情况了, 竟然就问了一句就走了。呃呃。

呃安卓软件开发现在还没学会,先写个库消磨点时间吧👀。还是用kotlin写👀。 好久没打开 idea了, 也好久没用kt了, 语法快忘干净了。。。

呃呃, 太麻烦了, 先放一放吧。。。。


再记录一下通过Websocket 连接到b站直播服务器来获取实时的弹幕数据的解析。

封包头部16个字节用于标识数据包的长度及类型,数据包格式详见下表.

偏移长度类型含义
04int数据包长度
42int数据包头部长度,固定为 16
62int数据包协议版本(见下文)
84int数据包类型 (见下文)
124int固定为 1
16byte[]数据主体
数据包协议版本含义
0数据包有效负载为未压缩的JSON格式数据
1客户端心跳包,或服务器心跳回应(带有人气值)
2数据包有效负载为通过zlib压缩后的JSON格式数据
数据包类型发送方名称含义
2客户端心跳不发送心跳包,50-60秒后服务器会强制断开连接
3服务器心跳回应有效负载为直播间人气值
5服务器通知有效负载为礼物、弹幕、公告等内容数据
7客户端认证(加入房间)客户端成功建立连接后发送的第一个数据包(见下文)
8服务器认证成功回应服务器接受认证包后回应的第一个数据包

客户端建立连接后,需要在5秒内发出加入房间(认证)的数据包,否则会被服务器强制断开连接。其中有效负载的key字段内容可以从之前的 https://api.live.bilibili.com/room/v1/Danmu/getConf?room_id=房间号&platform=pc&player=web 获取。如发送的认证包格式错误,服务器会立刻强制断开连接,JSON字段的详细说明见下表。

d7b12b682bff4ee14d8b1

字段类型必选含义
uidnumber×用户UID
roomidnumber房间号
protovernumber×协议版本,目前为 2
platformstring×平台,可以是 web
clientverstring×客户端版本,可以是 “1.8.5”
typenumber×未知,可以是 2
keystring×用户标识,通过之前提到的接口获取

心跳

心跳包建议每30秒发一次,头部16字节遵守上文规则,负载内容随意。(b站通过传入一个空对象来生成心跳包,然后就有了我之前无法理解的心跳包内容)

93022fcad39d374379926

通知(弹幕、公告、礼物等)

有新的弹幕、礼物或其他公告时,服务器会发送类似下图的数据包,首先需要使用 zlib.inflate 解压数据主体部分(除头部16字节外)。解压后的数据头部十六字节与原数据头相同,去除头部后即为JSON格式数据

这里我们以一个弹幕数据包为例子

4edce9e0efdd95069f5a9

原始弹幕数据包

fabd00cda3ab422b8c179

解压后

可以看到解压后的数据依然带有头部(16字节),去除头部后即为JSON格式数据,其中的cmd字段更为详细地描述了数据包类型。其中比较明显的是,['info'][1] 代表弹幕内容, ['info'][2][1] 为发送者,['info'][9]['ts'] 为发送时间戳,cmd的已知格式参考下表

cmd字段含义
DANMU_MSG收到弹幕
SEND_GIFT有人送礼
WELCOME欢迎加入房间
WELCOME_GUARD欢迎房管加入房间
SYS_MSG系统消息
PREPARING主播准备中
LIVE直播开始

字节,偏移值,长度在java中的关系如下。

long 8 位 int 4 位 short 2 位 byte 1 位

表示一个 0 或者 1

偏移值是实际位置减1 因为Java中索引是从0开始的