前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BliBili直播弹幕WS协议浅析

BliBili直播弹幕WS协议浅析

作者头像
MashiroT
发布2024-01-12 09:34:22
4360
发布2024-01-12 09:34:22
举报
文章被收录于专栏:MashiroのBlog

BiliBili直播弹幕WS协议浅析

相关接口

WS

ws地址:wss://broadcastlv.chat.bilibili.com/sub

数据由两部分组成,Header和Body

在连接后5s内需要发送认证数据包(即Body为认证数据),否则会被服务器断开连接

完成认证后,进行正常的交互

Header

代码语言:javascript
复制
/**
 * @author mashirot
 */
data class DataHeader(
    val totalLength: Int,
    val headerLength: Short,
    val protocolVersion: Short,
    val dataType: Int,
    val fixed: Int,
)

给出如上类定义

totalLength: 为Header+Body的总bit数

headerLength: 固定为16,即用2个Byte存头部

protocolVersion: 协议版本

dataType: 数据类型

fixed: 固定位,无意义

代码语言:javascript
复制
/**
 * @author mashirot
 */
object DataHeaderConsts {
    const val TOTAL_LENGTH_IDX = 0
    const val HEADER_LENGTH_IDX = 4
    const val PROTOCOL_VERSION_IDX = 6
    const val DATA_TYPE_IDX = 8
    const val FIXED_IDX = 12

    const val HEADER_LENGTH: Short = 16
    const val HEADER_LENGTH_INT = 16
    const val UNCOMPRESSED_PROTOCOL: Short = 0
    const val HEARTBEAT_PROTOCOL: Short = 1
    const val COMPRESS_PROTOCOL: Short = 3
    const val FIXED_VAL = 1

    const val CLIENT_HEARTBEAT = 2
    const val SERVER_HEARTBEAT = 3
    const val SERVER_ADVICE = 5
    const val CLIENT_AUTHORIZE = 7
    const val SERVER_AUTHORIZE = 8
}

给出如上常量定义,意义不再解释,由如下几点说明

UNCOMPRESSED_PROTOCOL通常用来传递高能榜人数,直播间在线人数等数据,dataType通常为SERVER_ADVICE

HEARTBEAT_PROTOCOL指的是本数据包为心跳包,除了认证心跳包外,其余均无Body,即totalLength = headerLength = 16

COMPRESS_PROTOCOL通常就是弹幕数据,Body中包含多条弹幕

AuthorizeBody

代码语言:javascript
复制
/**
 * @author mashirot
 */
data class AuthorizeBody(
    val uid: Long?,
    val roomid: Long,
    val protover: Int,
    val buvid: String?,
    val platform: String,
    val type: Int,
    val key: String?,
)

给出如上类定义

uid: uid,用于解除风控导致的弹幕用户名不可见

roomid: 直播间号,不能为短号,请通过相关接口获取真实直播间号

protover: 协议版本,目前为3

buvid: 未知,规则为uuid+infoc,解除风控用

platform: web/android,正常使用web

type: 未知,可以是2

key: 调用https://api.live.bilibili.com/room/v1/Danmu/getConf接口返回的token值,解除风控用

如果不需要解除风控,只需要给roomid, protover, platform, type即可

HeartbeatBag

代码语言:javascript
复制
val header = DataHeader(HEADER_LENGTH_INT, HEADER_LENGTH, HEARTBEAT_PROTOCOL, CLIENT_HEARTBEAT, FIXED_VAL)

弹幕数据

从请求头可以发现gzip, deflate, br这三种压缩算法,网上很多文章都说用zlib解压,实践中确实可以解压出数据,但会有部分乱码,因为实际采用的压缩算法是Google的brotli算法(也可能是b站改了

将数据的前16位取出,解析成DataHeader,判断是否是COMPRESS_PROTOCOL

通过brotli算法解压出弹幕的json(可能为List),并拆分成独立的json对象串,解析成弹幕数据

给出我的代码实现:bilibili-live-comet-demo

参考文章:

  1. B站直播弹幕ws协议分析
  2. 使用JavaScript中的WebSocket获取b站直播间弹幕
  3. Bilibili_Danmuji
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • BiliBili直播弹幕WS协议浅析
    • 相关接口
      • WS
        • Header
        • AuthorizeBody
        • HeartbeatBag
        • 弹幕数据
    相关产品与服务
    云直播
    云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档