获取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, 
            -
### 获取 Bilibili 直播弹幕 API 或方法 #### 使用 WebSocket 实现 WebSocket 是一种用于浏览器和服务器之间双向通信的技术,在获取实时弹幕方面具有优势。对于 Flutter/Dart 和 Java 的实现方式,可以通过连接到 B 站官方提供的 WebSocket 地址来接收直播间内的弹幕信息[^1]。 ```dart import 'package:web_socket_channel/io.dart'; void main() { var channel = IOWebSocketChannel.connect('wss://broadcastlv.chat.bilibili.com/sub'); channel.stream.listen((message) { print(message); }); } ``` 此代码展示了如何建立与 B 站直播间的 WebSocket 连接并监听传入的消息流。需要注意的是实际应用中还需要处理认证以及消息解析等问题。 #### HTTP 请求库 Requests 方法 (Python) 另一种方案是利用 `requests` 库向特定 URL 发送 GET 请求从而获得 JSON 格式的响应体,其中包含了最新的几条弹幕内容。这种方式适用于不需要持续更新场景下的简单抓取需求[^2]。 ```python import requests def get_barrage(room_id): url = f"http://api.live.bilibili.com/ajax/msg?roomid={room_id}" response = requests.get(url).json() data = response['data']['room'] for item in reversed(data): # 反转列表以按时间顺序显示最新弹幕 print(item) get_barrage("指定的房间ID") ``` 上述 Python 脚本定义了一个函数用来根据给定的房间 ID 抓取最近一段时间内发送过的所有弹幕,并将其打印出来。 #### 利用 bilibili_api 库简化操作 为了更方便快捷地访问 B 站的各项功能,包括但不限于获取视频详情、评论区留言及弹幕等资源,可以考虑安装第三方开发维护的支持多语言版本(如 Python)的 SDK —— `bilibili_api` 。它不仅封装好了必要的接口调用逻辑而且提供了详尽文档指导使用者快速上手[^3][^4]。 ```python from bilibili_api import Verify, VideoInfo verify = Verify(sessdata="个人账户对应的sessdata", csrf="bili_jct") video_info = VideoInfo(bvid="目标视频编号", verify=verify) with open(r'保存路径', 'a') as file: for danmu_item in video_info.get_danmaku(): file.write(danmu_item.text + '\n') ``` 这段脚本实现了将某部作品下所有的弹幕逐行写入本地文件的功能,便于之后做进一步的数据分析工作比如制作词云图等等。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值