獲取bilibili直播彈幕的WebSocket協議

我已經寫成了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
    }
}

自己分析吧,我只對彈幕感興趣…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章