注意,本文所用代码请参照guijialei-web/youdaofanyi: 有道翻译爬虫,获取单词数据 (github.com)
进入正文,第一步肯定是先去找数据包
很显然是这个包,接着我们去分析他的参数
对比参数我们大概能够知道,i参数就是要查询的单词,然后sign参数可能是加密的,mystictime像是时间戳,那么我们主要是去找那个sign参数的加密,先获取到数据,然后将这个数据进行解密,得到真正的数据,这个就是我们的思路。那么先去找加密逻辑,可以用调用栈,也可以去search栏里面搜索,我们可以先试试看,通过搜索url后面的那个关键词,我们可以看到下面的结果
进去之后发现这里面的url和我们的包的url一样,大概估计数据就是在这里传输的
接着我们打上断点进行调试,并且在控制台里面测试一下根据js的基本知识,我们对代码进行一下简单的处理
简化前:I = (e,t)=>Object(a["d"])("https://dict.youdao.com/webtranslate", Object(n["a"])(Object(n["a"])({}, e), E(t)),
简化后:a.d(url,n.a(n.a({},e),E(t)))
我们在控制台上调试后发现这里面的url中e的值就等于n.a({},e)
所以再次简化一下就变成了
再次简化a.d(url,n.a(e,E(t)))
我们看了一下E(t),发现这个里面就有我们需要的sign参数,所以我们现在估计E这个函数里面有我们想要的东西
我们看看这个函数
我们可以看到sign参数是由k(o,e)来得到的,这里的o就是时间戳,从第二行就可以看出来,那么这个e是什么,就是我们传入的那些参数,那么由此我们去看看k函数就可以慢慢的找到sign的加密了
这边这个k函数又调用了j函数,我们大概就知道了这是一个md5加密了,具体的细节就不多说了,那么就基本可以解决这个参数的加密了
接着我们来看这个a.d是什么,我们看他的格式大概是向这个url发送一个请求,可能是ajax,axios等,我们进去看看
看到这个promise八九不离十就是axios,那么我们接着来看,这个返回的数据传给了谁
这边是I接收到了这个数据,那么我们的思路是看看谁调用了这个,并且找到相关的加密和解密逻辑,我们通过查找调用栈来找到谁调用了他,我们去到下一个po这个栈里面
进来后我们打上断点再次进行调试
这个o就是我们抓包时候看到的数据,但是这个数据不是我们想要的明文数据,对此我们需要找到他的解密入口。我们在下面接着打一个断点,并且继续调试,接着我们就在控制台看到了我们想要的结果,那么我们就知道解密的过程就在这个n这个变量里面,并且这个decodedata,包括decodekey,还有decodeiv(这个参数截图这里没截到)我们也可以猜测是在这个地方,那么我们就可以进去看看这个函数
那么基本破案了,这是一个aes加密,里面有一个加密的o,和加密的n,对应的data和iv,接着是aes的加密,然后base64,具体的代码参照文章开头给的链接。