前语:
**
**
本文涉及到的爬虫知识点:js逆向,js代码混淆,位运算
前文:
因为年初疫情大爆发,所以许多赛事都开启了延迟比赛模式,趁着赛事延期,不少体育赛事网站也进行了不同程度的网站迭代更新,其中就包括今日的主角,我们国内比较出名的某速(下面简称速速),随着各大赛事的陆续开始恢复赛程,速速也开启了自己的全新版本,不近赛事更加全面了,赛事直播视频画质更高清了,数量更是多了不少。
当然咯,伴随着全新的速速而来的也有全新的视频反爬机制。接下来,我们将通过一系列的讲解,来了解下,升级后的速速的视频直播地址怎么获取。
正文:
首先,少不了的观察法:通过F12以及一系列的点点可知:点击视频按钮可以触发一个请求,响应内容是一个携带了诸如乱码型字符串的json数据,发送了该请求后不一会之后,就开始播放视频了。身为爬虫,直觉告诉我们,这就是携带了播放地址的加密数据了,那怎么破解出来呢,不急,且让我们慢慢的逆向回去
![在这里插入图片描述](https://img-blog.csdnimg.cn/20201028175206700.png#pic_center
当我们逆向到这里时,有点数据加密的小伙伴看了,是不是觉得很熟悉呢?是的,没错,这个方法跟AES加密很像,对这类加密不了解的小伙伴可以看看我jdy的采集分析,以至于我一度认为:这家伙就是用AES加密,那不难呀,找到加密秘钥,然后根据对应的加密参数进行对应的解密就可以了丫。事实证明,我还是太年轻了:深入研究才发现,这只是速速的加密工程师做的障眼法,这并不是原生的AES加密,只是长得像而已,具体的解密方法是速速工程师自己定义的,所以我们需要继续逆向回去。接下来,根据图示可以分为两部分进行逆向:加密字符串转加密数组,加密数组转解密字符串
1.加密字符串转加密数组
由上图1号代码块进入深层次的加密方法中,此处需要跳转多次的函数调用,然后我们会来到一个parse方法里面
通过理解函数意思,可以明白这里进行了一个字符串转数组的数组初始化的操作,初始化了一个数组e,返回数据之前调用了r函数,并将生成的e跟乱码型字符串i传入这个r函数。而这个r函数即是最开始的加密字符串i的第一步处理函数,通过断点调试可以得知
上图中的e即是加密字符串第一步处理的加密数组。看到这,或许会有小伙伴觉得,这就是第一部分的解密了呀,那挺简单的呀,如果你这么想了,那只能说:孩子,你还年轻。事实上,除了这第一次的序列化处理,还需要对处理后的数组进行位置调整,与其他的数组进行位操作等一系列的操作。
接着在逆向之路前行,我们来到_process这个函数这里,
这里就是e的进一步处理的地方,e在_process中先进行按4的步进值进行遍历操作,然后把o(即前面获取到的e)传入decryptBlock函数中进行指定数组元素的位置互换操作,在位置互换操作过程中,将位置互换过的数组数据传到_doCryptBlock中进行数组的位运算操作。这个时候就出现另外一个问题了
如图示:this[t[169]],u,v,p,d,e这些参数在哪里获取呢?为什么到这里,这些数据就会有了呢?其实u,v,p,d,e这些参数在我们进入这个页面时就已经完成初始化了,this[t[169]]则是在我们进行数组第一次序列化时就已经完成初始化了,而初始化的函数就在decryptBlock上面:
u,v,p,d,e的初始化函数:
this[t[169]]的初始化函数:
其中,this[t[169]]的初始化需要在u,v,p,d,e等参数初始化完成的基础上才能完成初始化,this[t[169]]即是上图中的c,当我们把这些参数初始化完成后,即可进行数组位运算操作了。把数组遍历完成后,获得的新的o数组,
即是完成了数组处理的可以解析出播放地址的数组,接下来就可以进入加密数组转解密字符串操作了。
加密数组转解密字符串
接下来,让我们回到2号编号处的代码处,从2代码块继承的函数stringify进入对应的代码函数stringify中,由图所示,r即是携带了处理后的数组的字典对象,stringify即是遍历数组,然后将每个数组进行新的位运算,运算完后将得到的数组转化为对应的ascii码对应的字符,最后再把这些转化后的字符连接起来就出现了我们最后需要的数据了。
既然已经把所有处理的核心js代码都找出来了,接下来就只需要把代码拷贝下来,或者模拟js生成参数即可。但需要注意的是,获取到的播放url需要在一定时间内进行使用,否则url会失效。
总结:
总的来说,速速新增加的反爬机制大致可以概括为:1,将加密过的乱码字符串数据str_a转成特定数组array_a,将数组array_a数据进行二次处理生成新的处理数组array_b,将array_b数组转化成真正的具有视频url的字典数据json_a,最后就可以从json_a中提取出诸如的播放流地址了。这些处理流程比较难的是跳转函数比较多,然后还是用了js代码混淆,所以,理解函数不好理解,需要花费时间跟精力。当理解了处理流程之后,就简单很多了。同时,因为速速的反扒中,很多数据都是具有固定化的特性,所以当理解了之后,可以简化很多的流程。
finally
**
**
本人只是菜鸟一只,如果有说的不对的,欢迎大家指出,本人也没有啥python学习教程可以分享,就不留啥联系方式了,如果有小伙伴对上面的有疑问,可以留言,我看到会回的。
最后,谢谢大家观看。完结,撒花,哈哈。