上上周,在培训课中给同学们讲解了手机抓包代理软件Charles和Fiddler等工具, 同时设定以实践项目中获取快手APP热门短视频的下载链接为学习目标。
获取快手APP热门短视频的下载链接的思路和方法很多, 但同学们在这过程中普遍遇到了以下困难:
1) Charles或Fiddler手机代理抓包工具对来自手机上快手APP的https无法解析,即在代理中看到的快手https包为unknown或乱码。
2) 有的同学参考了大量网上关于快手短视频的爬取文章,但由于没有系统性地分析讲解快手视频下载链接的获取方法,加之快手APP技术的升级,导致部分信息失效。 所以,同样无功而返。
因此,如何获取快手APP热门短视频的下载链接?
第一步: 首先我们需要清楚为什么手机代理抓包失败?
参考: 为什么抓包代理软件对有些APP应用可以解密https包而有些APP乱码第二步:找到原因,如何避开ssl pinning来抓包呢?
参考:如何用抓包代理软件Charles或Fiddler能抓取并解密APP的https包第三步: 安装好整体抓包环境并成功解析https包以后,就可以用Charles或Fiddler配合安卓模拟器来共同获取视频下载链接。下面以Charles为例说明:
1) 初步分析Charles中抓取的快手包,并在View - Focused Hosts 添加快手APP服务端的域名,与其他主机的抓包从列表中区分开来。快手APP服务端域名有: api.ksapisrv.com, api.gifshow.com等5,6个域名。由于其他域名主要是图片服务器,或日志服务器等,因此,初步判断视频来自:api.ksapisrv.com。
2)通过手机APP操作,进一步观察分析发现,快手的热门视频是由以下APP POST请求返回。返回结果为JSON。
具体链接形式:
http://api.ksapisrv.com/rest/n/feed/hot?isp=CMCC&mod=Netease%28Android%29&lon=119.73903&country_code=CN&kpf=ANDROID_PHONE&extId=1b22ead02dc8b31&did=ANDROID_2556&kpn=KUAISHOU&net=WIFI&app=0&oc=MYAPP%2C1&ud=0&hotfix_ver=&c=MYAPP%2C1&sys=ANDROID_6.0.1&appver=6.4.1.8151&ftt=&language=zh-cn&iuid=&lat=55.652478&did_gt=15585905&ver=6.4&max_memory=192
除了以上POST链接以外, 还包含POST内容:
type=7&page=1&coldStart=false&count=20&pv=false&id=44&refreshTimes=2&pcursor=&source=1&needInterestTag=false&browseType=1&seid=f20dc8-1418-4424-a196&volume=0.73&client_key=3c2cddff5&os=android&sig=29cd3e091129cd305b123c1639cd305
从以上POST请求的返回JSON中,main_mv_urls_h265中值便为热门视频的下载链接。
本例中main_mv_urls_h265的链接提取为:
http://jsmov2.a.yximgs.com/upic/2019/05/06/09/BMjAxOTA1MDYwOTM0MjBfMTE5NzgxMzE4MV8xMjgxNTYzMDQxMV8yXzM=_rmeo_Bc10ff888fe81ca7897948d52f8db94de.mp4?tag=1-1558927804-h-0-crutoivkjt-e6c48f832c55803c&type=hot
APP首页中有许多热门视频,所以类似的链接在返回JSON中默认有20个。
3) 至此,我们就成功定位了快手热门短视频的下载链接。
注意:以上的client_key和签名串是由快手定义,因用户而异。 因此,以上签名做了失效处理。在实际项目中,请同学们采用各自账户生成的client_key和签名串。