对于广大电脑爱好者来说,B站无疑是他们每天必逛之地。这个平台汇聚了各类知识,甚至包括许多游戏攻略,真可谓是一站式的知识宝库。为了更好地利用这一资源,今天小野将向你展示如何编写一个专门用于抓取B站直播视频里面的直播弹幕,并详细解析抓包过程。
准备相关工具
- 浏览器-【Edge浏览器】/【Chrome浏览器】等,可以抓包就行/Fiddler抓包也可以
- 编程软件-【易语言】/使用自己擅长编程的即可
相关接口:
- ???用于获取短号直播间的真实直播间号,以及主播uid???
- https://api.live.bilibili.com/room/v1/Room/room_init
- 参数:id
- 访问方式:GET
- ???用于获取弹幕服务ws地址和token???
- https://api.live.bilibili.com/room/v1/Danmu/getConf
- 参数:room_id 直播间号 platform=pc 观看平台 player=web 播放方式
- 访问方式:GET
流程
获取直播房间ID
大部分是URL地址后面跟着的那一串数字,比如直播房间号是7777,那我们通过API请求房间ID是一样的。
利用之前准备好的API地址+参数【?id=】访问:https://api.live.bilibili.com/room/v1/Room/room_init?id=7777
那我们得到的返回参数为以下信息:
{
"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的说明:
参数 | 类型 | 说明 |
---|---|---|
code | 0 | 正常返回代码0 |
room_id | 545068 | 真实直播房间号ID |
short_id | 7777 | B站的自定义房间号ID |
uid | 8739477 | Up主的用户ID |
live_status | 0 | 1表示正在直播,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
通过访问得到
{
"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。