接上篇

下面开始分析弹幕信息:

当我们在完成和服务器的握手之后,b站的弹幕服务器就会开始不停的开始给我们推送相关房间的弹幕消息了。老规矩前面16个字节是这个包的相关信息,我们先来看下这条消息的前面16字节在说什么。

00 00 01 38 头部四字节表达数据大小这可以看到是312字节。

00 10 这两个字节还是magic_number。这里是16。

00 00 版本号0.

00 00 00 05 上篇我们介绍了07是进入房间信息,这里05代表弹幕消息。

00 00 00 00 包类型正常消息包。

然后后面的就是我们需要解析的数据了,这里使用utf-8 encode之后传输的,所以我们拿到之后需要utf-8 decode一下,然后在json decode一下。拿到的数据如下

{
"info": [
[
0,
1,
25,
16777215,
1508919436,
"",
0,
"58736ea5",
0
],
"(_`)",
[
2424710,
"",
1,
1,
1,
10000,
1
],
[
17,
"",
"yao",
1320,
16752445,
""
],
[
50,
0,
16746162,
313
],
[
"title-112-1",
"title-112-1"
],
0,
0
],
"cmd": "DANMU_MSG"
}

这是一条弹幕消息,所以cmd这里是弹幕消息。另外还有gift和welcome两个cmd消息,分别代表的是观众老爷送的礼物和欢迎开通了vip的观众老爷而广播的特殊弹幕消息。由于info里面包含了太多奇奇怪怪的信息,所以挑我们需要的重点来说,我们最关注的说了什么在info[1]。在wireshark数据界面的右侧,通常我们可以看到ascii的直接显示,但是如果我们发的是中文数据,这里就不会显示了。我们需要拿到回传回来的数据decode成utf-8才可以正确显示他们,这里要注意。

其实在看16进制数据的时候。。根据规则用肉眼就能大致分辨一下数据是不是utf-8处理过的。例如我们来看这个数据:

根据我刚才说的这里没有办法正确显示出utf-8编码的数据。那么我们如何判断他是否是utf-8的数据或者解析出他到底说的些什么呢。

让我们看下hex那边从0080 那行e6开始首先e6用二进制是1110 0110这里我们假设他是utf-8编码,那么他就是3个字节的编码我们需要再继续查看后面两个字节。分别是88和91 用二进制是1000 1000 1001 0001没问题符合三个字节的条件我们把它打印出来看下是个什么字。

到此我们就知道怎么愉快的拿到弹幕数据了。

如此其他数据其实差不多的,再让我们来看一个礼物的数据,这里直接用了unicode所以在wireshark里面我们能直接看到\u开头的字符串:

{
"cmd": "SEND_GIFT",
"data": {
"giftName": "辣条",
"num": 4,
"uname": "帅帅的空白",
"rcost": 2497905,
"uid": 10068441,
"top_list": [
{
"uid": 10068441,
"uname": "帅帅的空白",
"coin": 741500,
"face": "http://i2.hdslb.com/bfs/face/60455d5390f51615d5cf36da2e04abcad96712e2.jpg",
"guard_level": 3,
"rank": 1,
"score": 741500
},
{
"uid": 6672222,
"uname": "勿讠勿語",
"coin": 352800,
"face": "http://i0.hdslb.com/bfs/face/d5af1e8def69e419e347e825b6504009e725eeab.jpg",
"guard_level": 0,
"rank": 2,
"score": 352800
},
{
"uid": 253570,
"uname": "膨胀的奶黄包",
"coin": 233600,
"face": "http://i2.hdslb.com/bfs/face/3394dfa87a9d15b7b06c2ef8f41db1bad6212bd1.jpg",
"guard_level": 0,
"rank": 3,
"score": 233600
}
],
"timestamp": 1508919509,
"giftId": 1,
"giftType": 0,
"action": "喂食",
"super": 0,
"price": 100,
"rnd": "",
"newMedal": 0,
"newTitle": 0,
"medal": [],
"title": "",
"beatId": 0,
"biz_source": "live",
"metadata": "",
"remain": 0,
"gold": 0,
"silver": 0,
"eventScore": 0,
"eventNum": 0,
"smalltv_msg": [],
"specialGift": null,
"notice_msg": [],
"capsule": {
"normal": {
"coin": 46,
"change": 0,
"progress": {
"now": 5931,
"max": 10000
}
},
"colorful": {
"coin": 0,
"change": 0,
"progress": {
"now": 0,
"max": 5000
}
}
},
"addFollow": 0
}
}

这是一个welcome大佬的数据包:

{
"cmd": "WELCOME",
"data": {
"uid": 7651584,
"uname": "零幺的村头恶霸女装扶她卡通狗蛋喵",
"isadmin": 1,
"vip": 1
},
"roomid": 989474
}

有了这些格式就可以定制自己弹幕机的功能。

最后要提一点就是,这个链接是有心跳保持机制的,基本上不心跳的话1分钟就会自动断掉。心跳包格式:

00 00 00 10:16字节数据

00 10:magic_number

00 01: 版本号01

00 00 00 02:心跳包类型

00 00 00 01:数据交换包

这个包的大小是70字节,如果你批量抓去房间信息的话可以很容易发现他,每隔一段时间就会由本地ip地址发往弹幕服务器。验证这个是否是货真价实的心跳包,其实只需要找一个没什么人说话的房间挂在那里,因为没有人说话所以不会有别的包,观察一下就能证实了。根据我的观察每30秒就会有一次心跳包发起。在实现的时候我们可以起一个协程或者一个线程来专门负责发送心跳包。

分析有问题的地方欢迎勘误

以上

Reference:

https://baike.baidu.com/item/UTF-8/481798?fr=aladdin  UTF-8编码百度百科

B站弹幕姬(🐔)分析与开发(下篇)的更多相关文章

  1. B站弹幕姬(🐔)分析与开发(上篇)

    辞职之后 休息了一段时间,最近准备开始恢复去工作的状态了,所以搞点事情来练练手.由于沉迷b站女妆大佬想做个收集弹幕的然后根据弹幕自动回复一些弹幕的东西.网上搜了一下有个c#的版本,感觉还做得不错,于是 ...

  2. b站弹幕的爬取以及词云的简单使用

    一.B站弹幕的爬取 1.分析发现,其弹幕都是通过list.so?=cid这个文件加载出来的,所以我们找到这个文件的请求头的请求url, 2. 打开url就能看到所有的评论 3. 上代码,解析 #!/u ...

  3. B站弹幕爬取 / jieba分词 - 全站第一的视频弹幕都在说什么?

    前言 本次爬取的视频av号为75993929(11月21的b站榜首),讲的是关于动漫革命机,这是一部超魔幻现实主义动漫(滑稽),有兴趣的可以亲身去感受一下这部魔幻大作. 准备工作 B站弹幕的爬取的接口 ...

  4. Python之路,Day22 - 网站用户访问质量分析监测分析项目开发

    Python之路,Day22 - 网站用户访问质量分析监测分析项目开发   做此项目前请先阅读 http://3060674.blog.51cto.com/3050674/1439129  项目实战之 ...

  5. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

  6. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  7. Python网络爬虫实战(三)照片定位与B站弹幕

    之前两篇已经说完了如何爬取网页以及如何解析其中的数据,那么今天我们就可以开始第一次实战了. 这篇实战包含两个内容. * 利用爬虫调用Api来解析照片的拍摄位置 * 利用爬虫爬取Bilibili视频中的 ...

  8. [原创]Android Monkey 在线日志分析工具开发

    [原创]Android Monkey 在线日志分析工具开发 在移动App测试过程中,Monkey测试是我们发现潜在问题的一种非常有效手段,但是Android原生的Monkey有其天然的不足,数据不能有 ...

  9. B站弹幕爬取

    B站弹幕爬取 单个视频弹幕的爬取 ​ B站弹幕都是以xml文件的形式存在的,而xml文件的请求地址是如下形式: http://comment.bilibili.com/233182992.xml ​ ...

随机推荐

  1. 在ASP.NET MVC中使用Redis

    一.Redis基本认知 1.含义: REmote DIctionary Server(Redis) | 是一个key-value存储系统 2.特性: 2.1 持久化:可以将内存中的数据保存在磁盘中,重 ...

  2. Java时间api

  3. Linux:Day11(上) ifcfg命令

    将Linux主机接入到网络中: 配置方式: 静态指定: ifcfg:ifconfig,route,netstat ip:object{link,addr,route},ss,tc 配置文件:syste ...

  4. Python:Day09

    Ubantu忘记密码: 1.开机长按shift,进入界面后按e: 2.将红框中内改成如下并按F10重启: 3.输入passwd,然后用户名,然后重新输入密码: locale命令查看系统中是否有中文 a ...

  5. 【css】IE盒子模型和标准W3C盒子模型

    其实盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型. 1.标准盒子 从上图可以看到标准 W3C 盒子模型的范围包括 margin.border.padding.content,并且 c ...

  6. docker 8 docker的镜像命令

    先回顾一下容器.存储.镜像三者之间的关系. 我们知道docker的logo是一条大鲸鱼背上驮着集装箱.那我们对应到docker如下: 1)蓝色的大海里面------->宿主机系统比如我笔记本wi ...

  7. GDB 命令回顾

    0) 为使用 GDB, 编译时需要加入调试信息 -g 选项,例如, $ gcc -g test.c -o test 1) 使用 GDB 开始调试 $ gdb test 也可以, $ gdb $ fil ...

  8. 初学Python—列表和元组

    一.什么是列表 列表是一系列数据的集合 二.列表的引用 首先定义一个列表 names=["alex","bob","alice"," ...

  9. 操作循环的关键字switch,break,return的应用及区别

    break 使用break结束循环  break可以终止循环 和 switch语句的运行; break用于结束一个循环,即跳出循环体,执行循环体之后的代码: switch 使用continue提前结束 ...

  10. (admin.E108) The value of 'list_display[4]'报错解决方案

    参考资料:虫师-<web接口开发与自动化测试:基于python语言> 日常学习Django框架中,创建了用户模型,但是页面功能验证时候,提示不能进行列表字段操作,debug好久,才找到问题 ...