原文地址:http://blog.csdn.net/bfboys/article/details/52853041
前几天看了知乎的一个问题(如何获取斗鱼直播间的弹幕信息之后,才有了这个想法。一直对抓取信息比较感兴趣,这次也不会错过咯,尝试一下 →.→
抓取数据的基本思路就是: 抓包 → 分析请求信息 → 模拟发送请求 → 获得数据
知乎回答地址:如何获取斗鱼直播间的弹幕信息- Brucezz 的回答 – 知乎
Github 项目代码地址:brucezz/DouyuCrawler
最常见的就是用 Chrome 的开发者工具(F12),然后看 Network 栏,有什么相关的 GET/POST 请求,然后构造相应的参数,用同样的方法发送给服务器,就能得到相应数据了,一般静态 页里的数据用这种方法就能搞定。当然,如果就这个简单的话,这篇博客也没有记录的必要啦,哈哈哈。
另外一个工具 Fiddler,可以捕获 HTTP/HTTPS 协议的流量。
还有一个开源的 络数据包分析软件 Wireshark,这款软件功能更为强大,支持多种协议,能够显示出最为详细的 络数据包数据。
0x01 初探
在直播页面的 HTML 源码里随便翻翻,发现了几点相关的 js 代码:
var $ROOM ={ ... }
var room_args = { ... }
其中,一些参数的含义:
- room_id:房间id
- owner_name:主播名
- show_status:当前直播状态,正在直播为1
- room_url:房间地址
其中,server_config
字段的数据需要 UrlDecode 解码一下(UrlEncode编码/UrlDecode解码),才能看到原本的面目。(省略了其他几个服务器地址)
参数:
- leve_json:定义了一些房间粉丝等级的标签
- server_config:一组服务器地址 ip:port ,后面会用到
页面里还输出了其他几个JSON数据effectConfig
,giftBatterConfig
,分别是定义了一些礼物的前端效果和对应代码,有需要的时候再去分析。
0x02 抓包分析
既然上面拿到的服务器的地址,就尝试监听一下这几个端口吧,看看有些什么数据发送到服务器了。
用 Wireshark 监听当前 络,过滤条件设置为
tcp.port==8046||tcp.port==8044||tcp.port==8071||tcp.port==8068|| tcp.port==8058||tcp.port==8059||tcp.port==8054||tcp.port==8045||tcp.port==8061&&tcp.flags.push==1
就是过滤监听相应的几个端口,然后我们就能看到本地和服务器通信的数据包啦。
这里有个小插曲,上面这段过滤条件很长嘛,我每次调试的时候它都会变,就得重新拼接这么长个字符串。我实在忍不了了,就写了个 Python 小脚本(可以右键另存),自动生成过滤字符串!用法如下:
- 启动脚本,输入从直播房间 HTML 上复制下来的源代码
- 复制出生成的过滤条件字符串
- 粘贴到 Wireshark 里就OK啦!
注:不用刻意去复制对称的引 /括 等等,只要包含整个 server_config
字段就好了,如图
效果图 Here~
好了,先看第一个包,长得就是下面这样了。
前面是tcp三次握手的数据包,就不详写了。从蓝色框框位置开始,是正文内容。
正文包含五个部分:
- 数据长度,大小为后四部分的字节长度,占4个字节
- 内容和第一部分一样,4字节
- 斗鱼固定的请求码,本地->服务器是
0xb1,0x02,0x00,0x00
,服务器->本地是0xb2,0x02,0x00,0x00
,4字节 - 消息内容
- 尾部一个空字节
0x00
消息内容:
然后,看服务器返回了什么东西。
这张图片就证实了,前面说的斗鱼固定的请求码,服务器返回的是 0xb2,0x02,0x00,0x00
四个字节。然后返回了匿名用户的用户名,基本上没什么用。
紧接着,服务器又返回了一条数据。
这条包大概是多条返回数据合并到一起了,没关系,一个一个来看。
消息类型为 msgrepeaterlist
, 里面包含了一组可用的弹幕服务器地址,数据看起来包含了一堆@符 ,是因为用了js代码进行编码。
我用 Chrome 找到了相应的js文件,然后把代码转化为 Java 代码,大概就长下面这个样子:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!