B站直播數據包分析連載(2018-12-11更新)

TODO: 這篇文章是我分析B站直播的數據包的過程,可能會有一些待補充的內容,若是有什麼建議能夠私信我或者跟評。感謝一下下面的各位作出的卓越貢獻~
CREDITS:
冰塊TiO2 - 提供樣本數據(十個辣條呢~!)
炒雞嗨客協管徐 - 參考文章: 獲取bilibili直播彈幕的WebSocket協議(這篇文章寫的很全了www)
王遠 - 參考文章: b站直播彈幕系統逆向工程筆記 (後來發現這篇文章,參考了這篇文章補全數據包定義。數據包定義寫的很詳細,能夠參考這篇文章~)

我此次分析是經過移動端的h5網頁進行的,好比個人直播間是4568796,而後打開的網頁是http://live.bilibili.com/h5/4568796,若是被跳轉到了通常網頁,能夠試一下改爲iPhone的UA。javascript

主流程(點擊前往)

1.獲取房間ID / 2.封包結構 / 3.初始化鏈接 / 4.心跳包 / 5.數據包java

獲取房間ID

大部分跟直播間ID是同樣的,也就是URL路由後面跟着的那一串數字,好比個人就是4568796,經過API請求房間ID是同樣的。
API地址https://api.live.bilibili.com/room/v1/Room/room_init?id=4568796web

{
    "code": 0,
    "msg": "ok",
    "message": "ok",
    "data": {
        "uid": 8759339,
        "room_id": 4568796,
        "short_id": 0,
        "attention": 65,
        "online": 15,
        "is_portrait": false,
        "description": "<p>主要直播FFXIV,渣渣水平,不要吐槽啊~</p>\n<p> 歡迎你們一塊兒來討論 一塊兒來玩FF呀 ~</p>\n<p>偶爾也會直播一些PS4遊玩過程~</p>",
        "live_status": 0,
        "area_id": 102,
        "parent_area_id": 2,
        "parent_area_name": "遊戲",
        "old_area_id": 3,
        "background": "https://static.hdslb.com/live-static/images/bg/6.jpg",
        "title": "光之赤石 國際服鹹魚+平常",
        "user_cover": "https://i0.hdslb.com/bfs/live/ddc99aeab675f33b0f84afcd41ced570bd9c2d9c.jpg",
        "keyframe": "https://i0.hdslb.com/bfs/live/4568796.jpg?12050340",
        "is_strict_room": false,
        "live_time": "0000-00-00 00:00:00",
        "tags": "stormblood,ff14,最終幻想,最終幻想14",
        "is_anchor": 1,
        "room_silent_type": "",
        "room_silent_level": 0,
        "room_silent_second": 0,
        "area_name": "最終幻想14",
        "pendants": "",
        "area_pendants": "",
        "hot_words": ["2333333", "喂,妖妖零嗎", "紅紅火火恍恍惚惚", "FFFFFFFFFF", "Yooooooo", "啪啪啪啪啪", "666666666", "老司機帶帶我", "你爲何這麼熟練啊", "gg", "prprpr", "向大佬低頭", "請你們注意彈幕禮儀哦!", "還有這種操做!", "囍", "打call", "你氣不氣?", "隊友呢?"],
        "hot_words_status": 0,
        "verify": "",
        "new_pendants": {
            "frame": null,
            "badge": null,
            "mobile_frame": null,
            "mobile_badge": null
        },
        "up_session": "",
        "pk_status": 0,
        "pk_id": 0,
        "allow_change_area_time": 0,
        "allow_upload_cover_time": 0
    }
}

固然也會有不同的,好比URL後面的數字是419,可是經過API訪問拿到的房間ID是3151254。貌似前者在B站的定義是short_id,後者是真實的房間ID,咱們請求數據要用的是後面的那個ID。json

{
    "code": 0,
    "msg": "ok",
    "message": "ok",
    "data": {
        "uid": 37164813,
        "room_id": 3151254,
        "short_id": 419
        /*...*/
    }
}

JSON 部分感受有用的字段

FIELD EXAMPLE DESCRIPTION
code 0 應該是正常返回代碼0,若是出現錯誤,可能不是這個數值。
data.uid 8759339 UP主用戶ID,能夠經過https://space.bilibili.com/8759339訪問B站空間。
data.room_id 4568796 這是咱們要用來鏈接websocket的ID。
data.short_id 0 若是不是0的話,能夠拼接爲進入直播間的URL。相似於靚號的存在麼?
data.attention 65 粉絲數
data.online 15 舊版的在線人數,如今的人氣值。
data.description HTML 直播間下方的描述,是一段HTML。
data.live_status 0 1表示正在直播,0表示不在直播。
data.description HTML 直播間下方的描述,是一段HTML。
data.parent_area_name
data.area_name
遊戲
最終幻想14
直播的一級分類跟二級分類。
data.live_time 0000-00-00 00:00:00 直播開始的時間,若是全零就是表示不在直播。
data.background URL 一個URL指向直播間(桌面版)的背景。
data.user_cover URL 一個URL指向直播間的封面。
data.keyframe URL 一個URL指向直播間的直播截圖。
data.title 光之赤石 國際服鹹魚+平常 直播的標題。
data.tags stormblood,ff14,最終幻想,最終幻想14 用半角空格分隔的標籤列表。
data.verify UP主認證類型,若是是簽約的會有bilibili直播簽約主播

封包結構

引用自:獲取bilibili直播彈幕的WebSocket協議api

封包由頭部和數據組成,字節序均爲大端模式
頭部格式:數組

偏移量 長度 含義
0 4 封包總大小
4 2 頭部長度
6 2 協議版本,目前是1
8 4 操做碼(封包類型)
12 4 sequence,能夠取常數1
已知的操做碼:
操做碼 含義
2 客戶端發送的心跳包
3 人氣值,數據不是JSON,是4字節整數
5 命令,數據中['cmd']表示具體命令
7 認證並加入房間
8 服務器發送的心跳包

示意圖:瀏覽器

數據包格式

初始化鏈接

H5播放器使用的彈幕鏈接是wss://broadcastlv.chat.bilibili.com/sub,桌面版的會使用CDN的鏈接,每次都不同,沒有測試過是否每次鏈接均可用。我使用桌面版的時候就出現過:
wss://tx-live-dmcmt-sel-01.chat.bilibili.com/sub
wss://tx-tokyo-live-comet-01.chat.bilibili.com/sub
player.js中定義的默認服務器則是ws://broadcastlv.chat.bilibili.com:2244/sub服務器

鏈接上ws之後,第一件事情就是發認證包,截獲的數據大體以下:websocket

# Client.1 | Binary

          x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 65 00 10 00 01 00 00 00 07 00 00 00 01
0000001x |7B 22 75 69 64 22 3A 38 37 35 39 33 33 39 2C 22
0000002x |72 6F 6F 6D 69 64 22 3A 34 35 36 38 37 39 36 2C
0000003x |22 70 72 6F 74 6F 76 65 72 22 3A 31 2C 22 70 6C
0000004x |61 74 66 6F 72 6D 22 3A 22 77 65 62 22 2C 22 63
0000005x |6C 69 65 6E 74 76 65 72 22 3A 22 31 2E 35 2E 31
0000006x |30 2E 31 22 7D
-----------------------------------------------------------
{"uid":8759339,"roomid":4568796,"protover":1,"platform":"web","clientver":"1.5.10.1"}
===========================================================
MASK: D6-CD-12-0E

這裏的uid爲登陸用戶的id,roomid就是上一步中咱們獲得的真實房間ID。
服務器會返回一個數據包,以下:session

# Server.2 | Binary
          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
-----------------------------------------------------------

操做碼爲08,服務器發來的心跳包,表示服務器在線。

心跳包

每隔30s須要向服務器發送心跳包保持在線狀態。從瀏覽器中截獲的心跳包以下:

# Client.3 | Binary
          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]
===========================================================
MASK: 26-E1-EC-F2
NOTES: 很奇怪爲何心跳包的主體是 [object Object]文本,感受彷佛是調用了什麼的 toString,準備嘗試一下使用無主體的心跳包試試,往後更新這個部分。
UPDATE1: player.js中有一行 var t = this.convertToArrayBuffer({}, r.a.WS_OP_HEARTBEAT);用於生成心跳包,貌似傳入的是一個空的對象。

服務器一般會返回一個帶有人氣值的數據包

# Server.4 | Binary
          x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 14 00 10 00 01 00 00 00 03 00 00 00 01
0000001x |00 00 00 01
---------------------------------------------------------

操做碼爲3,人氣值數據,主體部分是一個四字節的整數。

數據包

這個部分可能涉及到的內容比較多,也是比較核心的部分。大概包括如下部分:

開始直播 / 結束直播 / 收到彈幕 / 收到禮物 / 歡迎進入 / 廣播消息

這些數據包的操做碼都是恆定爲5。很奇怪的是,這些數據包的版本位定義是0,sequence常數也是0

開始直播

# Server.7 | Binary
          x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 2F 00 10 00 00 00 00 00 05 00 00 00 00
0000001x |7B 22 63 6D 64 22 3A 22 4C 49 56 45 22 2C 22 72
0000002x |6F 6F 6D 69 64 22 3A 34 35 36 38 37 39 36 7D
---------------------------------------------------------
{"cmd":"LIVE","roomid":4568796}
=========================================================

操做碼爲5,主體的cmd定義爲LIVEroomid表示對應直播間的id。

結束直播

# Server.23 | Binary
          x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 36 00 10 00 00 00 00 00 05 00 00 00 00
0000001x |7B 22 63 6D 64 22 3A 22 50 52 45 50 41 52 49 4E
0000002x |47 22 2C 22 72 6F 6F 6D 69 64 22 3A 22 34 35 36
0000003x |38 37 39 36 22 7D
---------------------------------------------------------
{"cmd":"PREPARING","roomid":"4568796"}
=========================================================

操做碼爲5,主體的cmd定義爲PREPARINGroomid表示對應直播間的id。

收到彈幕

# Server.19 | Binary
          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,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,是一個很雜的數組,咱們來分析一下他:

info:
    [0]:  [0,1,25,16777215,1544081771,936575929,0,"82caa419",0,0]
    [1]:  "喵"
    [2]:  [27322456,"冰塊TiO2",0,0,0,10000,1,""]
    [3]:  []
    [4]:  [1,0,9868950,">50000"]
    [5]:  []
    [6]:  0
    [7]:  0
    [8]:  {"uname_color":""}

不難看出[1]是彈幕文本內容,[2]定義了一些用戶基本信息。仔細觀察能夠看出[0]中的1544081771是一個Linux時間戳,轉換成北京時間是December 6, 2018 3:36:11 PM GMT+08:00,這與彈幕送出來的時間是吻合的,因此[0]應該是一些彈幕元信息。

UPDATE1: [0][19]應該是一個表明顏色的數值, [0][20]rnd,彷佛是播放器用於校驗使用的數值??。

再看看另兩個數據包

clipboard.png

[0]: [0, 1, 25, 16772431, 1544172160, 950512928, 0, "4b1a8da4", 0, 0],
    [1]: "這頭豬這輩子值了",
    [2]: [1*7, "永*幡", 0, 1, 0, 10000, 1, ""],
    [3]: [12, "桿菌", "桿菌無敵", 246, 10512625, ""],
    [4]: [49, 0, 16746162, 3071],
    [5]: ["title-174-1", "title-174-1"],
    [6]: 0,
    [7]: 0,
    [8]: {"uname_color": ""}
    
    [0]: [0, 1, 25, 16777215, 1544172161, 522412774, 0, "b8415757", 0, 0],
    [1]: "送豬肉的豬肉工",
    [2]: [1*9, "七*公", 0, 0, 0, 10000, 1, ""],
    [3]: [12, "桿菌", "桿菌無敵", 246, 10512625, ""],
    [4]: [23, 0, 5805790, ">50000"],
    [5]: ["ice-dust", "title-48-1"],
    [6]: 0,
    [7]: 0,
    [8]: {"uname_color": ""}

[3]的數值是粉絲勳章相關的訊息,[3][0]是粉絲勳章等級,[3][21]是粉絲勳章名稱。
[4]是用戶等級相關訊息,[4][0]是用戶等級,[4][22]是排名。
[5]是活動頭銜相關。
[2][2][23],[2][24],[2][25]之中,三個標誌位,有多是房管,老爺,艦長之類的特殊身份標誌位?(猜想)

Index Description
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 活動頭銜相關。
6 Number 未知。
7 Number 未知。
8 Object 未知。

收到禮物

# Server.5 | Binary
          x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 02 DE 00 10 00 00 00 00 00 05 00 00 00 00
0000001x |7B 22 63 6D 64 22 3A 22 53 45 4E 44 5F 47 49 46
0000002x |54 22 2C 22 64 61 74 61 22 3A 7B 22 67 69 66 74
0000003x |4E 61 6D 65 22 3A 22 5C 75 38 66 61 33 5C 75 36
0000004x |37 36 31 22 2C 22 6E 75 6D 22 3A 31 2C 22 75 6E
0000005x |61 6D 65 22 3A 22 5C 75 35 36 64 62 5C 75 37 63
0000006x |66 38 5C 75 34 65 34 33 5C 75 37 30 36 63 5C 75
0000007x |35 33 36 31 5C 75 35 34 63 37 5C 75 34 66 30 61
0000008x |22 2C 22 66 61 63 65 22 3A 22 68 74 74 70 3A 5C
0000009x |2F 5C 2F 69 30 2E 68 64 73 6C 62 2E 63 6F 6D 5C
000000Ax |2F 62 66 73 5C 2F 66 61 63 65 5C 2F 62 30 36 39
000000Bx |34 31 34 63 34 34 33 38 65 32 66 61 36 66 64 34
000000Cx |34 30 36 66 65 35 33 61 30 30 32 32 62 37 65 30
000000Dx |63 38 61 62 2E 6A 70 67 22 2C 22 67 75 61 72 64
000000Ex |5F 6C 65 76 65 6C 22 3A 30 2C 22 72 63 6F 73 74
000000Fx |22 3A 31 36 39 30 32 33 34 32 36 2C 22 75 69 64
0000010x |22 3A 31 39 32 32 30 33 36 31 34 2C 22 74 6F 70
0000011x |5F 6C 69 73 74 22 3A 5B 5D 2C 22 74 69 6D 65 73
0000012x |74 61 6D 70 22 3A 31 35 34 34 31 37 32 31 34 33
0000013x |2C 22 67 69 66 74 49 64 22 3A 31 2C 22 67 69 66
0000014x |74 54 79 70 65 22 3A 30 2C 22 61 63 74 69 6F 6E
0000015x |22 3A 22 5C 75 35 35 38 32 5C 75 39 38 64 66 22
0000016x |2C 22 73 75 70 65 72 22 3A 30 2C 22 73 75 70 65
0000017x |72 5F 67 69 66 74 5F 6E 75 6D 22 3A 30 2C 22 70
0000018x |72 69 63 65 22 3A 31 30 30 2C 22 72 6E 64 22 3A
0000019x |22 31 35 34 34 31 37 32 31 32 36 22 2C 22 6E 65
000001Ax |77 4D 65 64 61 6C 22 3A 30 2C 22 6E 65 77 54 69
000001Bx |74 6C 65 22 3A 30 2C 22 6D 65 64 61 6C 22 3A 5B
000001Cx |5D 2C 22 74 69 74 6C 65 22 3A 22 22 2C 22 62 65
000001Dx |61 74 49 64 22 3A 22 30 22 2C 22 62 69 7A 5F 73
000001Ex |6F 75 72 63 65 22 3A 22 6C 69 76 65 22 2C 22 6D
000001Fx |65 74 61 64 61 74 61 22 3A 22 22 2C 22 72 65 6D
0000020x |61 69 6E 22 3A 30 2C 22 67 6F 6C 64 22 3A 30 2C
0000021x |22 73 69 6C 76 65 72 22 3A 30 2C 22 65 76 65 6E
0000022x |74 53 63 6F 72 65 22 3A 30 2C 22 65 76 65 6E 74
0000023x |4E 75 6D 22 3A 30 2C 22 73 6D 61 6C 6C 74 76 5F
0000024x |6D 73 67 22 3A 5B 5D 2C 22 73 70 65 63 69 61 6C
0000025x |47 69 66 74 22 3A 6E 75 6C 6C 2C 22 6E 6F 74 69
0000026x |63 65 5F 6D 73 67 22 3A 5B 5D 2C 22 63 61 70 73
0000027x |75 6C 65 22 3A 6E 75 6C 6C 2C 22 61 64 64 46 6F
0000028x |6C 6C 6F 77 22 3A 30 2C 22 65 66 66 65 63 74 5F
0000029x |62 6C 6F 63 6B 22 3A 31 2C 22 63 6F 69 6E 5F 74
000002Ax |79 70 65 22 3A 22 73 69 6C 76 65 72 22 2C 22 74
000002Bx |6F 74 61 6C 5F 63 6F 69 6E 22 3A 31 30 30 2C 22
000002Cx |74 61 67 5F 69 6D 61 67 65 22 3A 22 22 2C 22 75
000002Dx |73 65 72 5F 63 6F 75 6E 74 22 3A 30 7D 7D
---------------------------------------------------------
{"cmd":"SEND_GIFT","data":{"giftName":"\u8fa3\u6761","num":1,"uname":"\u56db\u7cf8\u4e43\u706c\u5361\u54c7\u4f0a","face":"http:\/\/i0.hdslb.com\/bfs\/face\/b069414c4438e2fa6fd4406fe53a0022b7e0c8ab.jpg","guard_level":0,"rcost":169023426,"uid":192203614,"top_list":[],"timestamp":1544172143,"giftId":1,"giftType":0,"action":"\u5582\u98df","super":0,"super_gift_num":0,"price":100,"rnd":"1544172126","newMedal":0,"newTitle":0,"medal":[],"title":"","beatId":"0","biz_source":"live","metadata":"","remain":0,"gold":0,"silver":0,"eventScore":0,"eventNum":0,"smalltv_msg":[],"specialGift":null,"notice_msg":[],"capsule":null,"addFollow":0,"effect_block":1,"coin_type":"silver","total_coin":100,"tag_image":"","user_count":0}}
=========================================================

此次的json格式要清晰不少了,咱們格式化一下來看。

{
    "cmd": "SEND_GIFT",
    "data": {
        "giftName": "\u8fa3\u6761",
        "num": 10,
        "uname": "\u51b0\u5757TiO2",
        "face": "http:\/\/i0.hdslb.com\/bfs\/face\/880b7078006c262009674a77e3ca9a23c10cfd21.jpg",
        "guard_level": 0,
        "rcost": 29423,
        "uid": 27322456,
        "top_list": [],
        "timestamp": 1544081779,
        "giftId": 1,
        "giftType": 0,
        "action": "\u5582\u98df",
        "super": 0,
        "super_gift_num": 0,
        "price": 100,
        "rnd": "1799741030",
        "newMedal": 0,
        "newTitle": 0,
        "medal": [],
        "title": "",
        "beatId": "",
        "biz_source": "live",
        "metadata": "",
        "remain": 0,
        "gold": 0,
        "silver": 10910,
        "eventScore": 0,
        "eventNum": 0,
        "smalltv_msg": [],
        "specialGift": null,
        "notice_msg": [],
        "capsule": null,
        "addFollow": 0,
        "effect_block": 1,
        "coin_type": "silver",
        "total_coin": 1000,
        "tag_image": "",
        "user_count": 0
    }
}

JSON 部分感受有用的字段

FIELD EXAMPLE DESCRIPTION
data.giftName \u8fa3\u6761 將數據unescape一下,就是漢字辣條,明顯是禮物名稱。
data.num 10 數量。
data.face URL 用戶的頭像。
data.timestampe 1544081779 送禮時間,Unix時間戳。
data.price 100 價值,好像是單價。
data.gold
data.silver
0
10910
好像是用戶持有的金瓜子和銀瓜子數量,不像是禮物價值。
data.coin_type
data.total_coin
silver
1000
禮物總價值。

歡迎進入

# Server.19 | Binary
          x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF
===========================================================
0000000x |00 00 00 65 00 10 00 00 00 00 00 05 00 00 00 00
0000001x |7B 22 63 6D 64 22 3A 22 57 45 4C 43 4F 4D 45 5F
0000002x |47 55 41 52 44 22 2C 22 64 61 74 61 22 3A 7B 22
0000003x |75 69 64 22 3A 32 30 35 39 38 32 33 38 2C 22 75
0000004x |73 65 72 6E 61 6D 65 22 3A 22 E9 99 8C 2D 2D E8
0000005x |90 BD 22 2C 22 67 75 61 72 64 5F 6C 65 76 65 6C
0000006x |22 3A 33 7D 7D 00 00 01 AA 00 10 00 00 00 00 00
0000007x |05 00 00 00 00 7B 22 63 6D 64 22 3A 22 45 4E 54
0000008x |52 59 5F 45 46 46 45 43 54 22 2C 22 64 61 74 61
0000009x |22 3A 7B 22 69 64 22 3A 34 2C 22 75 69 64 22 3A
000000Ax |32 30 35 39 38 32 33 38 2C 22 74 61 72 67 65 74
000000Bx |5F 69 64 22 3A 31 38 33 34 33 30 2C 22 73 68 6F
000000Cx |77 5F 61 76 61 74 61 72 22 3A 31 2C 22 63 6F 70
000000Dx |79 5F 77 72 69 74 69 6E 67 22 3A 22 E6 AC A2 E8
000000Ex |BF 8E E8 88 B0 E9 95 BF 20 3C 25 E9 99 8C 2D 2D
000000Fx |E8 90 BD 25 3E 20 E8 BF 9B E5 85 A5 E7 9B B4 E6
0000010x |92 AD E9 97 B4 22 2C 22 68 69 67 68 6C 69 67 68
0000011x |74 5F 63 6F 6C 6F 72 22 3A 22 23 45 36 46 46 30
0000012x |30 22 2C 22 62 61 73 65 6D 61 70 5F 75 72 6C 22
0000013x |3A 22 68 74 74 70 3A 5C 2F 5C 2F 69 30 2E 68 64
0000014x |73 6C 62 2E 63 6F 6D 5C 2F 62 66 73 5C 2F 6C 69
0000015x |76 65 5C 2F 31 66 61 33 63 63 30 36 32 35 38 65
0000016x |31 36 63 30 61 63 34 63 32 30 39 65 32 36 34 35
0000017x |66 64 61 33 63 32 37 39 31 38 39 34 2E 70 6E 67
0000018x |22 2C 22 65 66 66 65 63 74 69 76 65 5F 74 69 6D
0000019x |65 22 3A 32 2C 22 70 72 69 6F 72 69 74 79 22 3A
000001Ax |37 30 2C 22 70 72 69 76 69 6C 65 67 65 5F 74 79
000001Bx |70 65 22 3A 33 2C 22 66 61 63 65 22 3A 22 68 74
000001Cx |74 70 3A 5C 2F 5C 2F 69 31 2E 68 64 73 6C 62 2E
000001Dx |63 6F 6D 5C 2F 62 66 73 5C 2F 66 61 63 65 5C 2F
000001Ex |37 38 39 36 32 32 38 64 31 31 65 35 63 31 37 36
000001Fx |34 63 61 36 37 34 62 66 64 39 36 33 30 61 37 63
0000020x |30 31 35 62 37 66 66 39 2E 6A 70 67 22 7D 7D 00
0000021x |00 00 66 00 10 00 00 00 00 00 05 00 00 00 00 7B
0000022x |22 63 6D 64 22 3A 22 57 45 4C 43 4F 4D 45 22 2C
0000023x |22 64 61 74 61 22 3A 7B 22 75 69 64 22 3A 33 39
0000024x |32 31 36 32 34 35 2C 22 75 6E 61 6D 65 22 3A 22
0000025x |E6 BA 90 E7 A8 9A E7 82 8E 22 2C 22 69 73 5F 61
0000026x |64 6D 69 6E 22 3A 66 61 6C 73 65 2C 22 76 69 70
0000027x |22 3A 31 7D 7D 00 00 00 66 00 10 00 00 00 00 00
0000028x |05 00 00 00 00 7B 22 63 6D 64 22 3A 22 57 45 4C
0000029x |43 4F 4D 45 22 2C 22 64 61 74 61 22 3A 7B 22 75
000002Ax |69 64 22 3A 32 30 35 39 38 32 33 38 2C 22 75 6E
000002Bx |61 6D 65 22 3A 22 E9 99 8C 2D 2D E8 90 BD 22 2C
000002Cx |22 69 73 5F 61 64 6D 69 6E 22 3A 66 61 6C 73 65
000002Dx |2C 22 73 76 69 70 22 3A 31 7D 7D
---------------------------------------------------------
{"cmd":"WELCOME_GUARD","data":{"uid":2*8,"username":"陌*落","guard_level":3}}
{"cmd":"ENTRY_EFFECT","data":{"id":4,"uid":2*8,"target_id":183430,"show_avatar":1,"copy_writing":"歡迎艦長 <%陌*落%> 進入直播間","highlight_color":"#E6FF00","basemap_url":"http:\/\/i0.hdslb.com\/bfs\/live\/1fa3cc06258e16c0ac4c209e2645fda3c2791894.png","effective_time":2,"priority":70,"privilege_type":3,"face":"http:\/\/i1.hdslb.com\/bfs\/face\/7896228d11e5c1764ca674bfd9630a7c015b7ff9.jpg"}}
{"cmd":"WELCOME","data":{"uid":3*5,"uname":"源*炎","is_admin":false,"vip":1}}
{"cmd":"WELCOME","data":{"uid":2*8,"uname":"陌*落","is_admin":false,"svip":1}}

四個包黏在一塊兒 ( —_— |||。
能夠看到,艦長的消息是WELCOME_GUARD並且會有一個ENTRY_EFFECT消息,老爺進入只有WELCOME消息。
WELCOME_GUARD消息中,data.uid爲用戶ID,data.username爲用戶名稱,data.guard_level表示艦長等級。
welcome消息中,data.uid爲用戶ID,data.uname爲用戶名稱,(乃們命名不能統一一點嗎……)is_admin表示是不是房管,vip1的時候表示是老爺,svip1的時候表示是年費老爺。

(待續。。。

相關文章
相關標籤/搜索