一故事起源
程序猿有时候很痛苦, 遇到问题解决不了就睡不着, 也找不到人倾诉, 只能通过失眠来解脱, 那天长夜漫漫, 我却无心睡眠, 就拿起手机继续刷朋友圈, 发现了睡前故事这个信息:
就手贱点进去一看, 妈呀顿时酥了, 只能用无限循环表达我的心情其实这部动画我没看过, 不知道原始的配音是什么样的, 但是就这个配音真的太赞了, 英语太好听了, 其实吧我是非常崇拜英语口语流利的人! 好了就这样在无限循环下呼呼的进入睡眠了, 第二天醒来我在想这东西我得珍藏呀, 有的人说直接收藏链接在微信中呗? 其实这种方式不靠谱, 因为假如有一天这个配音 app 倒闭了数据丢失, 或者作者把作品删除了, 我该怎么办? 所以就直接把视频弄下来保存本地珍藏才是正解
二数据协议分析
好了前面的故事说完了, 下面进入正题吧, 本文的重点是如何把这个 app 中某个作者的配音作品都爬取到本地, 首先我们知道这个 app 叫做英语流利说不多说了, 直接下载安装, 然后通过搜索中找到我粉的这个作者, 然后进入他的专辑:
然后发现有很多作品呀, 所以就点进去查看:
然后点击配音作品查看详细信息:
不过在我的意料之中, 这个视频是不支持下载的, 因为这个 app 关心版权问题那么问题就是我们怎么爬取这个视频保存到本地呢? 这个其实以前我写过一篇文章: Python 爬取今日头条视频; 大家都知道突破口就是抓包不多说了直接连接 Fiddler 进行抓包, 可惜的是遇到这个错误:
说来巧了, 我之前做应用因为我们服务器用了自己家的证书所以我在调试程序就出现这个问题, 连提示信息都一样, 所以看到这问题我很敏感直接断定这个 app 的服务器用了自家的证书, 所以我们连接 Fiddler 抓包就提示错误, 这里的原因大致是这样的: Fiddler 抓包 https 的时候我们都知道需要安装 Fiddler 自己的证书, 这个证书肯定没有去认证过也就是 Android 手机系统中不认这个证书的而这个 app 的服务器肯定购买了认证的证书, Android 手机系统中内置了一些根证书, 就是为了验证后续的证书这个 app 的证书是被这些根证书认证过了我们在使用系统默认的网络请求其实都是需要认证证书的, 而有的 app 用到了 https 请求, 但是我们还可以用 Fiddler 抓包成功, 那是因为这些 app 的服务器肯定没有购买证书, 所以客户端就添加代码信任所有的证书, 所以这么看 https 的安全性就没有任何意义了那么有的同学好奇为什么这些 app 要这么干呢? 因为我曾经在一家公司做东西的时候就遇到这样的问题, 就是从购买证书到服务器部署成功这个过程有很多艰难过程的有的公司开始没有用 https, 最后迁移用到 https, 整个过程很费劲的所以很多公司没办法就先曲线救国让客户端先信任所有的证书
上面说了关于为什么我们连接 Fiddler, 也安装了 Fiddler 证书还是没有抓取到这个 app 的数据:
所以大家以后要是遇到这类问题一定要第一想到这个原因, 一看 443 端口就是 https, 你安装证书了却还抓不到包那么很有可能就是证书问题, 既然现在知道问题了, 我们该怎么解决这类问题呢? 其实这个问题解决方案有两个:
第一使用 Xposed 拦截系统的证书校验功能, 这个网上有大神给出了 hook 模块代码, 可以去 github 上搜 JustTrustMe 项目代码即可, 就一个简单类, 导入 Xposed 中自己编译即可
第二反编译 app, 找到网络请求模块, 因为系统默认是校验证书的, 所以我们需要修改 smali 让其信任所有证书, 一般通过连接或者全局搜 HttpClient 等类信息定位到地方, 然后修改 smali 代码即可, 信任所有证书的代码网上也有
通过这两种方式可以看到, 第一种方式最简单, 第二种方式需要反编译修改 smali 代码还是有点麻烦, 但是第一种操作的前置条件很多, 第二种修改之后可以给很多人用不过本文肯定用第一种, 原因很简单因为我们的目的是能够成功抓包看数据, 而不是二次打包使用所以不解释直接下载 JustTrustMe 模块代码编译:
代码这里就不分析了, 就是 hook 系统的关键类修改值即可:
来源: http://blog.csdn.net/jiangwei0910410003/article/details/79367213