封包由头部和数据组成,字节序均为大端模式头部格式:
示意图:
H5播放器使用的弹幕连接是wss://broadcastlv.chat.bilibili.com/sub,桌面版的会使用CDN的连接,每次都不一样,没有测试过是否每次连接都可用。我使用桌面版的时候就出现过:wss://tx-live-dmcmt-sel-01.chat.bilibili.com/subwss://tx-tokyo-live-comet-01.chat.bilibili.com/subplayer.js中定义的默认服务器则是ws://broadcastlv.chat.bilibili.com:2244/sub
连接上ws以后,第一件事情就是发认证包,截获的数据大致如下:
#Server.2|Binaryx0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF===========================================================0000000x|00000010001000010000000800000001-----------------------------------------------------------操作码为08,服务器发来的心跳包,表示服务器在线。
每隔30s需要向服务器发送心跳包保持在线状态。从浏览器中截获的心跳包如下:
#Client.3|Binaryx0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF===========================================================0000000x|0000001F0010000100000002000000010000001x|5B6F626A656374204F626A6563745D-----------------------------------------------------------[objectObject]===========================================================MASK:26-E1-EC-F2NOTES:很奇怪为什么心跳包的主体是[objectObject]文本,感觉似乎是调用了什么的toString,准备尝试一下使用无主体的心跳包试试,日后更新这个部分。UPDATE1:player.js中有一行vart=this.convertToArrayBuffer({},r.a.WS_OP_HEARTBEAT);用于生成心跳包,貌似传入的是一个空的对象。服务器通常会返回一个带有人气值的数据包
#Server.4|Binaryx0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF===========================================================0000000x|000000140010000100000003000000010000001x|00000001---------------------------------------------------------操作码为3,人气值数据,主体部分是一个四字节的整数。
这个部分可能涉及到的内容比较多,也是比较核心的部分。大概包括以下部分:
这些数据包的操作码都是恒定为5。很奇怪的是,这些数据包的版本位定义是0,sequence常数也是0。
#Server.7|Binaryx0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF===========================================================0000000x|0000002F0010000000000005000000000000001x|7B22636D64223A224C495645222C22720000002x|6F6F6D6964223A343536383739367D---------------------------------------------------------{"cmd":"LIVE","roomid":4568796}=========================================================操作码为5,主体的cmd定义为LIVE,roomid表示对应直播间的id。
#Server.23|Binaryx0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF===========================================================0000000x|000000360010000000000005000000000000001x|7B22636D64223A22505245504152494E0000002x|47222C22726F6F6D6964223A223435360000003x|38373936227D---------------------------------------------------------{"cmd":"PREPARING","roomid":"4568796"}=========================================================操作码为5,主体的cmd定义为PREPARING,roomid表示对应直播间的id。
#Server.19|Binaryx0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF===========================================================0000000x|000000C70010000000000005000000000000001x|7B22696E666F223A5B5B302C312C32350000002x|2C31363737373231352C3135343430380000003x|313737312C3933363537353932392C300000004x|2C223832636161343139222C302C305D0000005x|2C22E596B5222C5B32373332323435360000006x|2C22E586B0E59D9754694F32222C302C0000007x|302C302C31303030302C312C22225D2C0000008x|5B5D2C5B312C302C393836383935302C0000009x|223E3530303030225D2C5B5D2C302C30000000Ax|2C7B22756E616D655F636F6C6F72223A000000Bx|22227D5D2C22636D64223A2244414E4D000000Cx|555F4D5347227D---------------------------------------------------------{"info":[[0,1,25,16777215,1544081771,936575929,0,"82caa419",0,0],"喵",[27322456,"冰块TiO2",0,0,0,10000,1,""],[],[1,0,9868950,">50000"],[],0,0,{"uname_color":""}],"cmd":"DANMU_MSG"}=========================================================cmd定义为DANMU_MSG,另一个字段为info,是一个很杂的数组,我们来分析一下他: