关于快手wss弹幕协议详解

关于平台的 不提供源码

难度并不大, 网上资料却是挺少

😎成果展示

📓建立连接大致过程

  • 找到new websocket 和 对应的send函数 并打断点

     这里的'wss://live-ws-group1.xxxx.com/websocket'就是wss链接
  • wss链接打开之后 会立马调用send方法 我们断点到send函数来看传入的参数

    可以看到这里的payload 就是传入的参数 经过测试kpf,kpn是固定值 我们主要看liveStreamId, token 这两个值
  • 这里不卖关子了 这里的两个参数 是由

    这个请求响应回来的, 从这里得到wss_url,  liveStreamId, token
  • 先说结论, 首先跟服务器建立连接, 建立连接成功之后, 立马发送直播间的 liveStreamId token 这样服务器才知道你要跟哪个直播间对接。 把这些数据发送给服务器之后, 服务器就开始给我们发送数据了。 而liveStreamId token 又是之前https://xxx.m.xxxx.com/rest/k/live/byUser 给我们响应回来的数据(这里不是真实的地址, 如想获取这个请求链接 请自行查找)。 连接建立成功之后, 还要每20s发一次心跳数据, 数据其实就是建立连接成功的时间戳 经过编码之后发送给服务器

💾编码与解码

        快手websocket 所有通讯的数据都是走的谷歌的protobuf协议 关于protobuf 这里不做多介绍了 自行百度
  1. 首先是第一次建立连接要发送的数据编码 我们在send函数打断点

    这里的et函数就是编码的函数  我们进入et

    很显然 这里有两层编码, 第一个是t.encode 编码传入进来的数据 并构建i对象, payloadType是固定值 200  接着下面ScoketMessage.encode 来对i对象进行编码                                      t.encode

    使用Python还原 proto文件

                  SocketMessage.encode

    (其实只看t.encode就行 经测试只发送t.encode编码后的数据也可以正常连接)

  2. 使用我们构建的protobuf对象 来编码这些数据

    这里的FristWSData_pb2.Request()是用刚刚还原出来的proto文件 生成的, 关于Python的protobuf 感兴趣可以看这个文章 Python的基本Protobuf指南(序列化数据) - DaisyLinux - 博客园 (cnblogs.com)                        二进制编码完成之后  就可以在打开wss连接之后 发送这些数据  服务端收到之后 会发送给我们数据, 但是发送过来的数据也是走protobuf协议 所以我们还是看到的一堆乱码

  3. 解析这些乱码, 首先我们在onmessage 打断点 来查看服务器发送过来的数据, 

    这里的e.data就是发送过来的数据   

    $e传入e.data之后出来的t对象就是解析的数据了

    结果显而易见 就是这个$e函数 来吧 我们进入这个函数瞅一眼

    简单说一下这个函数的流程, 首先对e进行处理之后赋值给t 然后调用SocketMessage.decode(t) 来进行 解码 解码完成之后 这个对象会有一个payloadType字段 下面的代码会根据这个字段 来分别进行处理 比如310代表 正常的弹幕消息 340代表直播间数据 等等 每个响应代码都有具体对应的解码对象(protobuf)  我们进入这个SocketMessage.decode看看

    还原这个proto文件

    payload是具体的内容, 比如弹幕内容, 礼物内容, 等等 先判断具体类型(payloadType)再进行处理  解码完成之后是这样的 👇👇👇

    可以看到, 除了compressionType 和 payloadType (这里应该是我代码里写反了大家别在意) payload还是未解码状态
  4. 310 解码

    进入这个decode 并还原这个proto文件

    其他的响应码 也是一样的流程, 

    这里的圈起来的两行是选择对应的proto文件 并封装对应的解码对象payloadType 是310 protoMap的310下标数据是   👇👇👇

    再把这个结果传入到MESSAGE_LOOK_UP_MAP

    可以看到这个对象封装了很多 解码对象 , 这里选择完对应的proto之后 返回给r

    然后再往下就看到r.decode解码了

  5. 到这里基本上 你还原的proto文件里有的 这里基本上都会有
  6. 关于心跳数据
    1. 其实跟上面是一样的 

      找到这个payload的proto还原就好了  间隔是20秒一次

免责声明

本文所述内容仅供学习和交流使用,任何人不得将本文内容用于非法或不道德的用途。作者不对因使用本文内容而产生的任何后果负责。

转载声明

欢迎转载,但请注明出处并保留本文的完整性。未经授权,不得对本文进行任何形式的修改。

结尾

        博客新人, 可能有写的不对的地方,还请大家多多关照❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值