接上篇

下面开始分析弹幕信息:

当我们在完成和服务器的握手之后,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. CentOS自带定时任务crontab

    设置定时任务规则,crontab -e,如下示例为每一分钟执行一次脚本 在脚本中写入内容时需注意路径,可以写绝对路径,也可以按照如下形式 exepath=$(cd "$(dirname &q ...

  2. Vue学习-基本指令

    一.关于vue介绍:https://mp.weixin.qq.com/s?__biz=MzUxMzcxMzE5Ng==&mid=2247485737&idx=1&sn=14fe ...

  3. mongo中游标

    1.手动循环访问游标 mongo中我们常用的查询方式db.collection.find()方法其实返回的就是游标,只不过我们并未给返回的游标分配变量,我们所看到的的查询数据也就是游标自动迭代得出的( ...

  4. Redis学习之字典源码分析

    字典,又叫映射,是一种用于保存键值对的抽象数据结构 划重点:抽象数据结构 Redisd字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表结点,而每个哈希表结点就保存了字典中的一个键值对 一.哈 ...

  5. 关于GitHub的Hello Word

    最近GitHub一直是最火的配置库技术之一,各个技术大牛也都纷纷入驻GitHub 我每天都打交道的DITA-OT开源项目也宣布迁入GitHub. 那么GitHub到底有什么过人之处呢?给各位先扫个盲. ...

  6. Grafana+Prometheus打造全方位立体监控系统

    前言 本文主要介绍如何使用Grafana和Prometheus以及node_exporter对Linux服务器性能进行监控.下面两张图分别是两台服务器监控信息: 服务器A 服务器B 概述 Promet ...

  7. 性能调优3:硬盘IO性能

    数据库系统严重依赖服务器的资源:CPU,内存和硬盘IO,通常情况下,内存是数据的读写性能最高的存储介质,但是,内存的价格昂贵,这使得系统能够配置的内存容量受到限制,不能大规模用于数据存储:并且内存是易 ...

  8. 朱晔和你聊Spring系列S1E6:容易犯错的Spring AOP

    阅读PDF版本 标题有点标题党了,这里说的容易犯错不是Spring AOP的错,是指使用的时候容易犯错.本文会以一些例子来展开讨论AOP的使用以及使用过程中容易出错的点. 几句话说清楚AOP 有关必要 ...

  9. 朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟

    朱晔的互联网架构实践心得S1E4:简单好用的监控六兄弟 [下载本文PDF进行阅读] 这里所说的六兄弟只指ELK套件(ElasticSearch+Logstash+Kibana)以及TIG套件(Tele ...

  10. [Offer收割]编程练习赛97

    链接 [https://hihocoder.com/contest/offers97/problems] 题意 题目1 : 放置矩形 时间限制:10000ms 单点时限:1000ms 内存限制:256 ...