B站弹幕姬()分析与开发(上篇)
辞职之后 休息了一段时间,最近准备开始恢复去工作的状态了,所以搞点事情来练练手。由于沉迷b站女妆大佬想做个收集弹幕的然后根据弹幕自动回复一些弹幕的东西。网上搜了一下有个c#的版本,感觉还做得不错,于是准备自己也搞一个,顺便分析一下b站家的协议。
收集需要的信息:
我首先使用charles或者如果你是windows平台的话使用findder抓下http包。看下是否弹幕信息使用的是http api来进行传输的。抓了半天,我并没有发现任何关于弹幕的信息,就可以判定没有走http。其实仔细想下,弹幕是有可能非常大量的,例如某个房间刷了一个小电视。整个屏幕都飘着bilibili干杯。。如果是http协议进行拉取的话我估计后台服务器是遭不住。但是抓取http包依然是有意义的,有一些api肯定会回传房间的信息,不然没有办法进行下面的工作。后面抓到的包也的确证实了我这个猜测。
来看下一个被捕捉到的有用的包里面的内容是什么:
https://api.live.bilibili.com
request: GET /api/player?id=cid:1250611&ts=15f2f17b037 HTTP/1.1response: <uid></uid> # 用户uid只有登陆之后的用户才会返回这个,没有登陆的用户不会 <uname></uname> # 用户昵称,同上 <login></login> # 登陆状态 <isadmin></isadmin> # 是否管理员 <time>1508301890</time> # 时间戳 <rank></rank> # 排名 <level></level> # 等级 <state>LIVE</state> # 这个应该是直播间状态 <chatid>1250611</chatid> # 交谈id 这个不太清楚做什么用 <server>livecmt-2.bilibili.com</server> # 服务器地址(特别注意的时这个服务器也可以接收到弹幕推送。应该是它们网站历史遗留的现在dm服务器有专门的地址返回了) <sheid_user></sheid_user> # sheid这个不知道是啥 <block_time>0</block_time> # 这个应该是被封的时间 <block_type>0</block_type> # 被封禁的类型 <room_shield>1</room_shield> # 房间的sheid <level_sheid>0</level_sheid> # sheid的level <user_sheid_keyword></user_sheid_keyword> # 不知道。。 <room_silent_type></room_silent_type> # 这个应该是房间禁言类型 <room_silent_level>0</room_silent_level> # 禁言类型 <room_silent_second>0</room_silent_second> # 禁言秒数 <user_silent_level></user_silent_level> # 用户禁言等级 <user_silent_rank></user_silent_rank> # 用户禁言排名 <user_silent_verify></user_silent_verify> # 用户禁言确认 <dm_ws_port>2244</dm_ws_port> # (重头戏)弹幕服务器端口号 <dm_wss_port>2245</dm_wss_port> # 弹幕服务器端口号2 <dm_port>2243</dm_port> # 弹幕服务器端口号3 <dm_server>broadcastlv.chat.bilibili.com</dm_server> # 弹幕服务器地址 <need_authority>0</need_authority> # 是否需要认证 <authority_range>日本</authority_range> # 授权区域(这个应该是本机ip地址的地区) <forbidden>0</forbidden>
这是一个请求player详情的api,方便理解我都标注了每个字段大概是什么意思。(我也是根据对比猜测。因为这不是开放api)
可以看到其实跟我们需要的弹幕相关的只有几项,一个是弹幕服务器地址<dm_server> 还有就是dm_port 弹幕端口。弹幕端口最近新家了<dm_ws_port>我估计这个按字面意思来理解应该是html5 live 播放器可以直接使用websocket和服务器握手,然后接受弹幕推送。没有测试过,这一部分不做深度讨论了。
另外需要注意的一个api是:
https://api.live.bilibili.com/room/v1/Room/getRoomInfoMain?roomid=74723
这个是得到房间信息的api,可以得到用户信息的api对比看看,发现它们的api设计真的有点分裂,感觉应该不是同一时期设计的api。
response: {"code": 0,"msg": "ok","message": "ok","data": {"MASTERID": 540217,"ANCHOR_NICK_NAME": "万四屋","ROOMID": 74723,"_status": "on","LIVE_STATUS": "LIVE","ROUND_STATUS": "1","AREAID": "1","BACKGROUND_ID": 4,"ROOMTITLE": "技术型萝莉吃鸡(。・ω・。)自走移动盒","COVER": "https://i0.hdslb.com/bfs/live/74723.jpg?10191128","LIVE_TIMELINE": 1508380144} }
这里可以看到一个room_id。这个room_id其实蛮重要的,因为最开始我在对很多房间进行访问的时候发现几乎所有有人气的主播都是用的短房间码,但是这个三位数的短房间码并不能作为传输数据使用,所以真正的房间好吗是这里的room_id,我们后面在和服务器进行通信的时候会使用到这个。
既然http只能获取到这些信息,那么我们使用wireshark来进一步查看当直播间打开之后发生了什么,以便作更详细的分析。在osx平台下面第一次使用wireshark使用wifi抓包可能会被提示权限不足等说法
You don't have permission to capture on that device
使用sudo chmod 777 /dev/bpf*开放设备权限给wireshark使用就可以监听到数据包了。
如果我们需要知道数据包发送和抓取相关包我们可能需要在wireshark里面过滤出来自己需要的数据。那么我们可以基于ip地址来过滤获取数据。那么我们怎么知道该过滤哪个地址?其实蛮简单的,我尝试了一下用上面api返回的弹幕服务器地址,然后直接就ping出了地址183.240.17.138 常用弹幕地址还有另外一个ip地址 223.99.231.13
piperck➜ /dev ᐅ ping broadcastlv.chat.bilibili.com PING broadcastlv.chat.bilibili.com (183.240.17.138): 56 data bytes 64 bytes from 183.240.17.138: icmp_seq=0 ttl=50 time=49.544 ms --- broadcastlv.chat.bilibili.com ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 49.544/49.544/49.544/0.000 ms
拿到地址之后使用wireshark过滤出我们需要的包。下面让我们来看数据:
前面三个包就是正常的tcp三次握手包。length为66字节的包是有填充tcp option选项的包,54字节是标准只包含头的包。
我们来看第一个从本地发送到弹幕服务器的包里面有些什么内容。忽略前面的包头我们从数据开始看:
00 00 00 37 这里我们可以看到数据包的length是55bytes 这里37hex应该对应十进制的正好是55,我们可以猜测这里放数据大小,可以多查看几个其他包来证明这个推断。
00 10这个我没有看出来是啥。。大概是个 magic_number吧,先放着。
00 01 这个应该是版本号。
00 00 00 07 这个是进入房间的数据。单从这个包里面是看不出来这个意思的,要比较更多通讯包和其他包可以推断。我先把结论放在这里。
00 00 00 01 这个是包类型。像这里就代表的一个数据认证 传输通讯类似这个意思的包,说明还在跟服务器交换信息,并不是一个正常的弹幕包之类的。与之相关的还有后面的心跳包。
除开前面这16字节用于交换数据(应该算是它们自己的协议了,用前面这16个字节交换一些需要的信息和数据)剩下的都是数据。我们需要模仿这个格式发送数据给b站的弹幕服务器告诉它们我们要去的房间号,uid这个参数如果是匿名登录的话是不会有固定数值的是一个随机数。因为我们弄弹幕机并不需要锁定上我们的账号的uid,所以这里可以就传随机数就行。
例如:
self._uid = u_id or int(100000000000000.0 + 200000000000000.0 * random.random())
在介绍下面数据传输相关的东西之前我必须说明一下。上面一定要正确握手,下面才能得到正常的数据。另外如果是抓取的网页的,时间在2017年10月之后貌似它们又更新了,在传输的时候加上了ssl 现在已经抓不到我上面说的那些包了。我只看到一些什么赛门铁克coperation,估计是加入了证书之类的东西。但是为了向下兼容上面说的方法依然可以获取弹幕和相关的数据。另外要说的是,b站的app传输的数据和网站的也略微不一样。如果是抓取的app的包,可以直接看到utf-8编码的数据,而且可以直接解,但是以前网站上的似乎还进行了gzip,抓包的时候看到的数据也不是能直接utf-8解码的数据要稍微麻烦一点。 这点我也是踩了坑,当时拿到无法看懂的数据也是一脸懵逼没有想到还被压缩了一次。
我将在下篇里面介绍弹幕传输的数据意义,以及心跳相关的东西。
相关代码我已经放在了github上面:
https://github.com/piperck/b_danmu_chicken/tree/master
转载于:https://www.cnblogs.com/piperck/p/7676927.html
B站弹幕姬()分析与开发(上篇)相关推荐
- b站弹幕姬python_B站弹幕姬()分析与开发(下篇)
接上篇 下面开始分析弹幕信息: 当我们在完成和服务器的握手之后,b站的弹幕服务器就会开始不停的开始给我们推送相关房间的弹幕消息了.老规矩前面16个字节是这个包的相关信息,我们先来看下这条消息的前面16 ...
- bili弹幕姬_b站弹幕姬|b站弹幕姬下载_v1.0.1.126官方版_9号软件下载
b站弹幕姬是一款适用于b站的弹幕辅助工具,简单易用,即便在b站用户平均智力水平大幅下滑的现在仍能让用户在一定的学习后使用. 软件介绍 b站弹幕姬是一款在进行b站直播的时候十分重要的一款软件,使用这款b ...
- JS逆向加密——B 站弹幕 protobuf 分析
B 站弹幕 protobuf 分析 首先了解 Protobuf 是什么 ? 参考1 网站调试分析 首先 打开 网址的开发者工具,找到所发起的请求 怎么区分 是不是protobuf 格式呢,可以看看请求 ...
- B站弹幕姬,弹幕礼物感谢,关注感谢,自动回复,房管工具,房管助手,基于java
运行环境 可在所有主要操作系统上运行,并且仅需要安装Java JDK或JRE版本8或更高版本.要检查,请运行java -version: $ java -version java version &q ...
- B站直播弹幕获取 - 用python写一个B站弹幕姬吧
前言 关于这个小项目的由来. 最开始是想要利用b站的弹幕进行一些互动之类的.原本也有想过可以利用现有的弹幕姬做个插件来解决的,但无奈不会C#,所以只能自己研究b站的弹幕协议. 后来有写过一个C++版本 ...
- b站弹幕姬python_基于asyncio异步协程框架实现收集B站直播弹幕详细介绍
本文给大家分享的是基于asyncio 异步协程框架实现收集B站直播弹幕收集系统的简单设计,并附上源码,有需要的小伙伴可以参考下 "> 前言 虽然标题是全站,但目前只做了等级 top 1 ...
- bilibili服务器维护7月,GitHub - thestarweb/bilibilidan: 一个B站弹幕姬,就是不会在第一时间维护。。支持插件!!...
这个项目最最直接的作用是供作者本人使用,随便开源以便让大家知道如何让弹幕姬工作 尽管有发行的想法,但是因为时间等原因,不一定及时维护,甚至作为作者都没有第一时间发现弹幕姬已经坏了. 作者本身水平也有限 ...
- b站弹幕姬python_Python 融合多方代码b站弹幕朗读姬代码
import requests import win32com.client import time danmu="D:/python_work/成品/danmu.txt" old ...
- 基于简单统计的b站弹幕情感分析
第一步,先把弹幕下载下来 def danmu(urls):global wordlistglobal avfor i in urls:url2='http://comment.bilibili.com ...
最新文章
- 阿里巴巴开源的缓存框架JetCache创建缓存
- 10个免费好用功能强大的网页动画效果库
- Windows Server 2003 R2中的“分布式文件系统”案例应用
- oracle基本结构
- 部门树_神奇!十堰这个小山村竟然藏着两棵500多年的爱情树!
- Vue.js(学习Vue3之前必须要掌握的知识)
- Leetcode 刷题笔记(二十七) ——动态规划篇之买股票问题(一)
- AKOJ-2021-逆序对(归并,二分)
- .Net Remoting与Web Service
- 杰理之如果再开蓝牙一拖二的话。手机连接样机时,会出现,无法连接【篇】
- 儿童讲堂 - 量词的解释
- Joel Spolsky在耶鲁的演讲无责任导读
- dismiss ios pop效果_iOS ~ ViewController的Push,Pop和Present,Dismiss转场动画
- 《UniDAC 基础》 【菜头】 翻译 (之一)
- Java、JSP老年公寓管理系统
- Workflow Engine for .Net Core ENTERPRISE v4.0.10-SEO-狼术
- 多角度3d模型旋转算法
- Latex下载和安装
- 申请icp和edi许可证
- 使用ActiveSync
热门文章
- 一招解决bat文件执行时cmd命令窗口闪退问题
- Arthas Web-Console一站式解决方案
- Nginx静态资源站点——Nginx虚拟主机
- cocoscreator的Bundle加载问题
- 【剁手】科技发烧友最爱的产品,光是看看就想剁手!
- xxl-job配置发邮件 spring.mail的QQ邮箱配置
- 遥感相关专业英语词汇汇总
- 共享体脂秤为公众号增粉100%真粉活粉吗?
- 2013, Samara SAU ACM ICPC Quarterfinal Qualification Contest C.Victor‘s Research
- 物联网RFID技术在高速ETC中的应用