当前位置: 首页 > news >正文

长沙望城建设局网站深圳网络推广课程

长沙望城建设局网站,深圳网络推广课程,房产采集网站源代码,建筑网课平台教程一、Websocket获取B站直播间弹幕教程 — 哔哩哔哩直播开放平台 1、封包 我们连接上B站Websocket成功后,要做两件事情: 第一、发送鉴权包。第二、发送心跳包,每30秒一次,维持websocket连接。 这两个包不是直接发送过去&…

教程一、Websocket获取B站直播间弹幕教程 — 哔哩哔哩直播开放平台

1、封包

我们连接上B站Websocket成功后,要做两件事情:

  • 第一、发送鉴权包。
  • 第二、发送心跳包,每30秒一次,维持websocket连接。

这两个包不是直接发送过去,而是要创建byte数组,将一些数据 按B站协议格式 用大端序写入到byte数组

协议

在这里插入图片描述

  • 1、(4 byte)Packet Length:整个Packet的长度,包含Header。
  • 2、(2 byte)Header Length:Header的长度,固定为16。
  • 3、(2 byte)Version
    • 如果Version=0,Body中就是实际发送的数据。
    • 如果Version=2,Body中是经过压缩后的数据,请使用zlib解压,然后按照Proto协议去解析。
  • 4、(4 byte)Operation:消息的类型:
    • Operation == 2,客户端发送的心跳包(30秒发送一次)
    • Operation == 3 ,服务器收到心跳包的回复
    • Operation == 5 ,服务器推送的弹幕消息包
    • Operation == 7 ,客户端发送的鉴权包(客户端发送的第一个包)
    • Operation == 8 ,服务器收到鉴权包后的回复
  • 5、(4 byte)Sequence ID:保留字段,可以忽略。
  • 6、(? byte)Body:消息体
    • body为json格式字符串 --> 转Byte数组
    • 如果是心跳包body就为空

例子

这边以JAVA代码为例。
代码依赖了FastJson2,用于将Json(Map)转Json字符串。

public static byte[] pack(String jsonStr, short code){byte[] contentBytes = new byte[0];//如果是鉴权包,那一定带有jsonStrif(7 == code){contentBytes = jsonStr.getBytes();}try(ByteArrayOutputStream data = new ByteArrayOutputStream();DataOutputStream stream = new DataOutputStream(data)){stream.writeInt(contentBytes.length + 16);//封包总大小stream.writeShort(16);//头部长度 header的长度,固定为16stream.writeShort(0);//Version, 客户端一般发送的是普通数据。stream.writeInt(code);//操作码(封包类型)stream.writeInt(1);//保留字段,可以忽略。if(7 == code){stream.writeBytes(jsonStr);}return data.toByteArray();}
}

这样封包的方法就写好了,jsonStr为要发的数据,code为包的类型。

定义生成鉴权包的方法:
public byte[] generateAuthPack(String jsonStr) throws IOException {return pack(jsonStr, 7);
}

如果你是非官方开放API接口调用,那jsonStr得自己生成。

public byte[] generateAuthPack(String uid, String buvid,String token, int roomid){JSONObject jo = new JSONObject();jo.put("uid", uid);jo.put("buvid", buvid);jo.put("roomid", roomid);jo.put("protover", 0);jo.put("platform", "web");jo.put("type", 2);jo.put("key", token);return pack(jo.toString(), 7);
}
  • 参数
    • uid : 你Cookie的DedeUserID
    • buvid : 你Cookie的buvid3
    • token : 鉴于是否登录token
    • roomid : 直播间ID

如何获取Token?
----> 【JAVA版本】最新websocket获取B站直播弹幕——非官方API

定义生成心跳包的方法:
public static byte[] generateHeartBeatPack() throws IOException {return pack(null, 2);
}

2、解包

成功鉴权后,我们获取到B站数据也都是byte数组,格式跟上面一样,按上面的格式来读取就行了。
不过如果是Zip包那稍微麻烦点。
获得zip包的body后还得进行解压。请添加图片描述

先来个流程图
Created with Raphaël 2.3.0 开始解析byte数组 从 下标0 开始读取 4byte , 这是包长度(body长度+header长度)。 从 下标4 开始读取 2byte , 这是header长度。 从 下标6 开始读取 2byte , Version:0、普通数据,2、zip数据 从 下标8 开始读取 4byte , Operation:消息的类型。 从 下标12 开始读取 4byte , 这是保留字段,可以忽略。 判断Version是否为2,zip包 解压Zip数组 从下标16到读取到“body长度” (body长度 = 包长度 - header长度) 判断是否读完byte数组 结束解析 yes no yes no
代码实现

同样以JAVA代码为例
代码依赖了hutool-core,用于zip数组解压

public static void unpack(ByteBuffer byteBuffer){int packageLen = byteBuffer.getInt();short headLength = byteBuffer.getShort();short protVer = byteBuffer.getShort();int optCode = byteBuffer.getInt();int sequence = byteBuffer.getInt();if(3 == optCode){System.out.println("这是服务器心跳回复");}byte[] contentBytes = new byte[packageLen - headLength];byteBuffer.get(contentBytes);//如果是zip包就进行解包if(2 == protVer){unpack(ByteBuffer.wrap(ZipUtil.unZlib(contentBytes)));return;}String content = new String(contentBytes, StandardCharsets.UTF_8);if(8 == optCode){//返回{"code":0}表示成功System.out.println("这是鉴权回复:"+content);}//真正的弹幕消息if(5 == optCode){System.out.println("真正的弹幕消息:"+content);// todo 自定义处理}//只存在ZIP包解压时才有的情况//如果byteBuffer游标 小于 byteBuffer大小,那就证明还有数据if(byteBuffer.position() < byteBuffer.limit()){unpack(byteBuffer);}}
http://www.yayakq.cn/news/694983/

相关文章:

  • 做网站推广常识题库及答案做网站要几个部门组成
  • 医疗网站建设管理在建工程查询网站
  • 合肥做网站联系方式企业建站需要多少钱
  • 深圳做微商网站的公司公众号如何推广产品
  • 北京网站建设推荐安徽秒搜科技把网站做app
  • 优秀网站参考企业网站建设设计任务书
  • 建筑网站首页英文企业网站源码
  • 正鹏建设工程有限公司网站ps做景观有哪些素材网站
  • 网站开发工程师的要求优化专业的公司
  • 汕头网站建设做网站必需要在工商局备案吗
  • 网站抄袭我网站禹州市门户网站建设
  • 大学制作网站怎么做荣耀官方网站手机商城
  • 网站开发兼职群手机界面app界面设计分析
  • 中国制造网网站建设的优势该网站无备案
  • 网站建设的意义以及重要性广州招聘网网站开发
  • 网站怎么做出来的建设网站条件
  • 如何做淘宝联盟网站的推广设计网站横幅
  • 如何对网站建设和维护开了360网站卫士ssl如何做301
  • 网站开发研发合同杭州建设厅网站
  • 搭建一个网站的具体步骤铁道部建设监理协会网站
  • 网站建设dns解析设置一键wordpress 伪静态
  • wordpress主题 网站大全wordpress代码缩进
  • 做羞羞的事网站百度关键词查询网站
  • 平台建网站网站可以更更换空间吗
  • 在北京哪家公司建网站合适广州市数商云网络科技有限公司
  • 怎么创建子网站nas里安装wordpress
  • 建设通相似的网站英文网站建设 论文
  • 网站建设siteserver淮安网站网站建设
  • 免费制作自己的微网站吗网站建设app端
  • 专做外贸库存的网站响应网站先做电脑端