接上篇

下面开始分析弹幕信息:

当我们在完成和服务器的握手之后,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. P1145 约瑟夫 W(模拟)

    暴力+模拟 #include<iostream> #include<cstring> using namespace std; int ans, k, k2; ]; bool ...

  2. 在Python虚拟环境中安装scrapy

    虚拟环境安装scrapy 在虚拟环境中执行命令 (scrapyenv) E:\Python\Envs>pip install -i https://pypi.douban.com/simple/ ...

  3. hyperledger中文文档学习-1-词汇表

    参考:https://hyperledgercn.github.io/hyperledgerDocs/glossary/ Chaincode - 链码,即智能合约 链码是一个运行在账本上的软件,它可以 ...

  4. 利用BBED恢复数据文件头

    转载请注明出处:http: @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED block block ) Block: Dba:0x01400001 ---------------- ...

  5. eclipse新建maven web项目

    使用eclipse版本如下,已集成了Maven,只需要配置下即可 一.下载eclipse,解压安装 二.下载maven,解压安装 三.修改${maven_home}/config/settings.x ...

  6. 2018Action Recognition from Skeleton Data via Analogical Generalization over Qualitative Representations

    论文标题: 来源/作者机构情况: Northwestern University Thirty-Second AAAI Conference on Artificial Intelligence, 2 ...

  7. redis学习(三)——List数据类型

    一.概述      在Redis中,List类型是按照插入顺序排序的字符串链表.和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素.在插入时,如果该键并不存在,R ...

  8. CentOS下安装PHP

    今天終於進行了第三次的在linux下的php安裝,在安裝之前我進行了網站訪問測試. 第一步,先查看mysql.apache這兩項系統服務是否已經自動啟動了,chkconfig –list mysql. ...

  9. vue引入css的两种方式

    方案1.在main.js中引入方式    import '@/assets/css/reset.css' 方案2.在.vue文件的<style/>标签里面引入    @import &qu ...

  10. Google 宣布在 4 月 1 日关闭站内搜索

    今春,Google 计划终止又一项产品,它就是“站内搜索”(Site Search)功能.这项产品主要出售给 web 出版商,让它们可以在自家网站内运用业内领先的搜索技术.虽然该公司并未公开宣布此事, ...