谢谢大家继续阅读,小野带着你继续来分析
没有看过第一章内容的朋友可以点击文章末的链接访问阅读。?
封包
上一章我们不仅抓包获取到了用户id跟房间id。其实服务器还给我们返回了一个心跳包
先给大家列出一份已知的参数:
参数 | 说明 |
---|---|
2 | 客户端发送的心跳包 |
3 | 人气值,数据不是JSON,是4字节整数 |
5 | 命令,数据中['cmd']表示具体命令 |
7 | 认证并加入房间 |
8 | 服务器发送的心跳包 |
这是服务器返回的一个数据包,如下:
♾️ shell 代码: x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 10 00 10 00 01 00 00 00 08 00 00 00 01
-----------------------------------------------------------
数据包介绍:
- 00 00 00 10 :封包长度
- 00 10:头部长度
- 00 01:协议版本
- 00 00 00 08:操作码
- 00 00 00 01:常数
上面数显示操作码为08,这是服务器发来的心跳包,表示服务器在线。
心跳包
每隔30秒需要向服务器发送心跳包保持在线状态。从截获的心跳包如下:
♾️ shell 代码: x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 1F 00 10 00 01 00 00 00 02 00 00 00 01
0000001x |5B 6F 62 6A 65 63 74 20 4F 62 6A 65 63 74 5D
-----------------------------------------------------------
[object Object]
===========================================================
心跳包的主体是[object Object]文本. 不知道为什么,暂时没有找到参考答案
接下来我们要分析重点了弹幕数据包
数据包
这个部分可能涉及到的内容比较多,也是比较核心的部分,小野就拿其中的弹幕数据包来分析。
弹幕数据包
这些数据包的操作码都是恒定为5。很奇怪的是,这些数据包的版本位定义是0,sequence常数也是**0。
♾️ shell 代码: x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 C7 00 10 00 00 00 00 00 05 00 00 00 00
0000001x |7B 22 69 6E 66 6F 22 3A 5B 5B 30 2C 31 2C 32 35
0000002x |2C 31 36 37 37 37 32 31 35 2C 31 35 34 34 30 38
0000003x |31 37 37 31 2C 39 33 36 35 37 35 39 32 39 2C 30
0000004x |2C 22 38 32 63 61 61 34 31 39 22 2C 30 2C 30 5D
0000005x |2C 22 E5 96 B5 22 2C 5B 32 37 33 32 32 34 35 36
0000006x |2C 22 E5 86 B0 E5 9D 97 54 69 4F 32 22 2C 30 2C
0000007x |30 2C 30 2C 31 30 30 30 30 2C 31 2C 22 22 5D 2C
0000008x |5B 5D 2C 5B 31 2C 30 2C 39 38 36 38 39 35 30 2C
0000009x |22 3E 35 30 30 30 30 22 5D 2C 5B 5D 2C 30 2C 30
000000Ax |2C 7B 22 75 6E 61 6D 65 5F 63 6F 6C 6F 72 22 3A
000000Bx |22 22 7D 5D 2C 22 63 6D 64 22 3A 22 44 41 4E 4D
000000Cx |55 5F 4D 53 47 22 7D
---------------------------------------------------------
{"info":[[0,1,25,1444215,1706835129,9999329,0,"81caa2",0,0],"加油",[27123256,"徐安条",0,0,0,10000,1,""],[],[1,0,986120,">50000"],[],0,0,{"uname_color":""}],"cmd":"DANMU_MSG"}
=========================================================
解释:cmd参数定义为DANMU_MSG,另一个字段为info,是一个数组,我们来分析一下:
建议格式化一下json
info:
[0]: [0,1,25,1444215,1706835129,9999329,0,"81caa2",0,0]
[1]: "加油"
[2]: [27123256,"徐安条",0,0,0,10000,1,""]
[3]: []
[4]: [1,0,9868950,">50000"]
[5]: []
[6]: 0
[7]: 0
[8]: {"uname_color":""}
解析:
[0]时间戳
[1]弹幕文本内容
[2]用户基本信息
仔细观察可以看出[0]中的1706835129是一个时间戳,转换成北京时间是2024-02-02 08:52:09,
这与弹幕送出来的时间是吻合的,所以[0]应该是一些弹幕元信息。
这是我从别的地方拷贝过来的参数说明:
参数 | 说明 |
---|---|
0 | Array 弹幕元信息。[0]一个为pool的值,感觉一直都是0。[1]为弹幕模式,1是普通弹幕,2是顶部弹幕,3是底部弹幕。[2]是字号,[3]为颜色,[4]为弹幕发送时间(Unix时间戳) |
1 | String 弹幕内容 |
2 | Array 发言人信息。[0]为用户ID,[1]为用户名称,[2]是舰长或者是房管的标志位,[3]是老爷标志位,[4]是年费老爷标志位。(这三个标志位是猜测) |
3 | Array 粉丝勋章相关的讯息。[0]是粉丝勋章等级,[1]是粉丝勋章名称。[2]粉丝勋章来源播主,[3]来源播主的房间号,[4]一个叫rnd的东西,具体rnd是干什么的不知道,是一个随机数,桌面版页面中可以通过window.BilibiliLive.RND查看到。 |
4 | Array 用户等级相关讯息。[0]是用户等级,[3]是排名。 |
5 | Array 活动头衔相关。 |
目前只分析到这里?。待续。。。。。
B站-BiliBili直播弹幕WebSocket协议浅析(一)
如何编写一个专门用于抓取B站直播视频里面的直播弹幕的WebSocket协议