我已經寫成了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,
-1189421307,
0,
"46bc1d5e",
0
],
"空投!",
[
10078392,
"白の駒",
0,
0,
0,
10000,
1,
""
],
[
11,
"狗雨",
"宮本狗雨",
102,
10512625,
""
],
[
23,
0,
5805790,
">50000"
],
[
"title-111-1",
"title-111-1"
],
0,
0,
{
"uname_color": ""
}
],
"cmd": "DANMU_MSG"
}
可以看出['info'][1]
是彈幕內容,['info'][2][1]
是彈幕作者
有人送禮
數據示例:
{
"cmd": "SEND_GIFT",
"data": {
"giftName": "辣條",
"num": 7,
"uname": "夏目玲子swd",
"face": "http://i2.hdslb.com/bfs/face/9524d7af30933b5b1775cad35c84c7088973ee82.jpg",
"guard_level": 0,
"rcost": 334559138,
"uid": 37050641,
"top_list": [
{
"uid": 6179862,
"uname": "MiKu爬呀爬",
"face": "http://i0.hdslb.com/bfs/face/63f6017b9ebc90da8190b79dd43f73b5fe3a80fa.jpg",
"rank": 1,
"score": 694800,
"guard_level": 0,
"isSelf": 0
},
{
"uid": 889098,
"uname": "CI0rHJpguwHIMZZ9",
"face": "http://i1.hdslb.com/bfs/face/d0c40aa0fdfe1e79603d98869875fc173c1aeebb.jpg",
"rank": 2,
"score": 618600,
"guard_level": 3,
"isSelf": 0
},
{
"uid": 6573945,
"uname": "愛奇藝視頻",
"face": "http://i0.hdslb.com/bfs/face/e1f0940fd35c33fbdf2f159fc520778030973287.jpg",
"rank": 3,
"score": 478000,
"guard_level": 0,
"isSelf": 0
}
],
"timestamp": 1526267395,
"giftId": 1,
"giftType": 0,
"action": "餵食",
"super": 0,
"super_gift_num": 0,
"price": 100,
"rnd": "77030604",
"newMedal": 0,
"newTitle": 0,
"medal": [ ],
"title": "",
"beatId": "",
"biz_source": "live",
"metadata": "",
"remain": 0,
"gold": 0,
"silver": 0,
"eventScore": 0,
"eventNum": 0,
"smalltv_msg": [ ],
"specialGift": null,
"notice_msg": [ ],
"capsule": {
"colorful": {
"coin": 0,
"change": 0,
"progress": {
"now": 0,
"max": 5000
}
},
"normal": {
"coin": 0,
"change": 0,
"progress": {
"now": 0,
"max": 10000
}
},
"move": 1
},
"addFollow": 0,
"effect_block": 1,
"coin_type": "silver",
"total_coin": 700
}
}
自己分析吧,我只對彈幕感興趣…