寻找请求条件与参数
准备爬虫的时候,我们要知道什么?我们必须知道API请求的参数,请求的方法、请求的头是哪些。入下图:

请求头里面有JWT和一个token,可能是我们必须要求的。我们也没有在cookies中找到他,那可能是JS里面发起的请求。
我们就必须知道他是由什么请求生成的JWT。开启浏览器抓包,刷新页面,我们要注意是否有数据包返回值为token:qgemv4jr1y38jyq6vhvi和JWT密文。找了所有返回包,仅仅发现有JWT的返回包,如下图:

并无返回结果为token:qgemv4jr1y38jyq6vhvi的返回包,那么有可能这个token是在JS中有浏览器的id加密成的也有可能就是在JS中的硬编码。直接在浏览器中搜索JS文件是否存在qgemv4jr1y38jyq6vhvi。如下图所示:

他是存在JS中的硬编码,那么就可以不管它,直接拿来用即可。对https://api.interpreter.caiyunai.com/v1/user/jwt/generate以JSON格式发起POST请求,并附带上参数{browser_id: “cba5c021d7ef12a51be1f97fb0d1dc5e”}即可得到JWT
这样一来我们就有了token和JWt那么就可以对翻译接口发起请求结果返回图下图。Emmmm这结果居然被加密的如下图所示:

API返回的结果是H3SfVBnmdBJScD==,从头到尾的的返回包,就没有见到“Sql
注入”的影子,那么结果只有一个。这个是加密过后的数据,那么并没有其他请求已H3SfVBnmdBJScD==作为参数向服务器发送请求解密,所以他只能用JS进行解密。
JS调试
JS如何调试?在没有一切反调之前,他是如下图所示:

在粘贴待翻译的文本在文本框的同时快速点击箭头指向的⏸按钮,即可进入调试模式。在调试模式中,我们可以一直按

直到出现加密结果,接下来JS肯定是解密,要不然做其他没意义的事情,只会影响用户体验。现在我可以使用步入一个一个看,很快就能找到解密处,入下图:

不会解密的也没关系,我们只要复制这一段代码。放到Python中用python执行JS代码即可。
function le(t) {var e;return function(t) {return Zt.decode(t)}((e = function(t) {return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(t)},t.split("").map(function(t) {return e(t) > -1 ? "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"[e(t)] : t}).join("")))}
import execjs#最终return的是这个是根据最后解密后的变量的名称,这里是tdecode=execjs.compile("""function le(t) {var e;return function(t) {return t}((e = function(t) {return "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".indexOf(t)},t.split("").map(function(t) {return e(t) > -1 ? "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"[e(t)] : t}).join("")))}""")t="H3SfVBnmdBJScD=="result=decode.call('le',t)print(result)
注意这个注释。如下图:


python执行的结果,和JS调试的结果一样,但是得到这个解密后的字符串好像也不是我们要的答案,最后t会进入Zt.decode()由于我调试了之后,是base64解码我就不详细讲解。

回到JS刚刚解密方式,如果用python来那么我也不算是逆向了,其实玩了几年的CTF我真的是一眼看出来他是凯撒密码。
写个凯撒解密跑一下偏移,得到偏移位为13。
在很多很多爬虫中经常会遇到我们想要的结果被加密,可以尝试用JS逆向
