歌曲封面 未知作品
  • 歌曲封面再回首Mike 曾比特

网站已运行 338 天 9 小时 9 分

Powered by Typecho & Sunny

2 online

小野博客 小野(Hirono)博客的个人网站,主要讲述关于小野的一些陈芝麻烂谷子事。网络、生活、我的主张,也是一个自留地
Title

B站-BiliBili直播弹幕WebSocket协议浅析(一)

小野

·

Article

对于广大电脑爱好者来说,B站无疑是他们每天必逛之地。这个平台汇聚了各类知识,甚至包括许多游戏攻略,真可谓是一站式的知识宝库。为了更好地利用这一资源,今天小野将向你展示如何编写一个专门用于抓取B站直播视频里面的直播弹幕,并详细解析抓包过程。

准备相关工具

  1. 浏览器-【Edge浏览器】/【Chrome浏览器】等,可以抓包就行/Fiddler抓包也可以
  2. 编程软件-【易语言】/使用自己擅长编程的即可
  3. 相关接口:

流程

获取直播房间ID

大部分是URL地址后面跟着的那一串数字,比如直播房间号是7777,那我们通过API请求房间ID是一样的。
利用之前准备好的API地址+参数【?id=】访问:https://api.live.bilibili.com/room/v1/Room/room_init?id=7777
那我们得到的返回参数为以下信息:

♾️ json 代码:
{
    "code": 0,
    "msg": "ok",
    "message": "ok",
    "data": {
        "room_id": 545068,
        "short_id": 7777,
        "uid": 8739477,
        "need_p2p": 0,
        "is_hidden": false,
        "is_locked": false,
        "is_portrait": false,
        "live_status": 0,
        "hidden_till": 0,
        "lock_till": 0,
        "encrypted": false,
        "pwd_verified": false,
        "live_time": -62170012800,
        "room_shield": 0,
        "is_sp": 0,
        "special_type": 0
    }
}

这里提供一些有用的json的说明:

参数类型说明
code0正常返回代码0
room_id545068真实直播房间号ID
short_id7777B站的自定义房间号ID
uid8739477Up主的用户ID
live_status01表示正在直播,0表示不在直播。

根据字段来参考有用信息。有些房间自定义了直播房间ID:导致无法ws链接。

如何判断真实直播间ID,看下面示意图:

拿到真实直播间ID后,我们接下来继续操作访问另一个API接口用于获取弹幕服务ws地址和token:
ps:记得加上【参数】
https://api.live.bilibili.com/room/v1/Danmu/getConf?room_id=545068&platform=pc&player=web
通过访问得到

♾️ json 代码:
{
    "code": 0,
    "msg": "ok",
    "message": "ok",
    "data": {
        "refresh_row_factor": 0.125,
        "refresh_rate": 100,
        "max_delay": 5000,
        "port": 2243,
        "host": "broadcastlv.chat.bilibili.com",
        /*...*/
    }
}

这里面有很多WS地址,我们取一个通用的地址:broadcastlv.chat.bilibili.com

初始化 WS连接

ws地址:ws://broadcastlv.chat.bilibili.com:2244/sub
数据由两部分组成,Header和Body.在连接后5s内需要发送认证数据包(即Body为认证数据),否则会被服务器断开连接
完成认证后,进行正常的交互。

连接上ws以后,第一件事情就是发认证包,截获的数据大致如下:

♾️ shell 代码:
# 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 33 39 34 37 37 2C 22
0000002x |72 6F 6F 6D 69 64 22 3A 35 34 35 30 36 38 2C 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":8739477,"roomid":545068,"protover":1,"platform":"web"}
===========================================================

封包解析

  • 0000001x |7B 22 75 69 64 22 3A 38 37 33 39 34 37 37 2C 22

这里面包含了用户id:38 37 33 39 34 37 37取出第二位数字就是8739477

  • 0000002x |72 6F 6F 6D 69 64 22 3A 35 34 35 30 36 38 2C 2C

房间ID:35 34 35 30 36 38 依旧取出第二位数字:545068

这里的uid为登录用户的id,roomid就是上一步中我们得到的真实房间ID。

第一部分解析教程就写到这里。第二部分内容点击下方链接继续阅读

B站-BiliBili直播弹幕WebSocket协议浅析(二)

现在已有 0 条评论,3 人点赞
小野
Comment
发表
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主