关于快手wss弹幕协议详解

喵喵大侠1 2024-10-07 17:33:02 阅读 69

关于平台的 不提供源码

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

😎成果展示

📓建立连接大致过程

找到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 这里不做多介绍了 自行百度

首先是第一次建立连接要发送的数据编码 我们在send函数打断点

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

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

使用Python还原 proto文件

              SocketMessage.encode

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

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

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

解析这些乱码, 首先我们在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还是未解码状态310 解码

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

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

这里的圈起来的两行是选择对应的proto文件 并封装对应的解码对象

payloadType 是310 protoMap的310下标数据是   👇👇👇

再把这个结果传入到MESSAGE_LOOK_UP_MAP

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

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

到这里基本上 你还原的proto文件里有的 这里基本上都会有关于心跳数据

其实跟上面是一样的 

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

免责声明

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

转载声明

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

结尾

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。