反爬六
此次练习的网站,其实这个网站无需破解,奈何当时脑子懵了,怎么请求都无法请求到数据,然后观察该网站的请求方式,在请求头中发现了奇怪的pqm
参数,理所当然认为这是关键所在,所以开始了破解之路。悲催的是,破解之后还是请求不到数据,才发现问题所在。(不过讲道理,如果这个网站真的利用pqm
反爬是很有可能的,我们的破解思路也是没什么问题)。
因为这个网站的破解不是必须的,下面就简单看下破解过程吧。
发现异常参数
首先通过观察,我们发现请求头里有个pqm
的参数,那么当我们向服务器进行请求时,服务器端就很有可能利用该参数进行检测,如果我们发送过去的参数值不对,就不给我们返回正确数据。
定位该参数在js
中的位置
一般情况,这种参数值的生成方法都是写在js
代码中的,当在浏览器中加载页面时就会自动执行。
我们直接搜索pqm
,可以直接找到其所在的js
文件:
点进去这个文件,继续搜索pqm
,很直观看到以下代码:
扣关键代码
很显然,pqm
是Signature.getSignatureByObj
方法生成的,我们只需要把该方法拿出来自己执行就ok
了,但是该方法难免中间调用了一系列方法,我们要把这些依赖都扣出来。
1 | Signature.getSignatureByObj = function(paramObj) { |
代码先贴这么多,我们来简单看下,其实代码思路很清晰,把传递过来的参数先转变为字符串,然后调用
Signature.getSignature
,在这个方法中又调用了一系列方法,但是这里面有两个未解决的问题,分别是moment_default()、md5_default()
,任我们在这个js
文件里如何查找也找不到关于这俩方法的有用信息。那先不急,我们来看下他们有啥用,“打断点调试”:
代码执行到这里,我们用鼠标选中time就可以看到它的值了,或者在console中输入time然后按回车也可以,多试几次,我们会发现其始终为空字符串,那既然这样我们就不用管moment_default()
了,这里直接写成
time=””即可。继续执行我们发现
md5_default()把字符串加密为了一串固定长度的字符,与我们平时用的
md5`函数很像,但是很容易就可以知道这个是人家自定义的方法,我们需要将其挖出来。
如果缺乏经验这里可能有点难以下手,有经验的话我们很容易想到,当程序执行到这里,md5_default()
已经被加载到当前环境中了(我这种说法可能不准确,反正意思就是已定义可以直接调用),那我们可以在console中输入md5_default()
按回车,看到其函数体。
注意,是输入md5_default()
而不是md5_default
,通过分析他的调用方式return md5_default()(secretStr);
,执行完md5_default()
返回一个函数,所以这里是函数嵌套调用;可以采用同样的方式看moment_default()
我们直接点这个返回的函数体可以查看详细的函数体内容。
1 | var crypt = { |
以上就是全部的核心代码了,只需要对代码做部分调整就能正常执行了。
后续
其实本网站无需破解,一开始我post请求的数据格式没有选对,所以导致一直请求不到数据,该网站使用python的requests库的Post方法要使用json
参数(post_man中为body为raw)。