写在开头,不差钱的建议直接去调用搜狗官方的api,稳定、不会被封、且高并发,也算对官方的支持>
- 建议先了解下chrome的调试方法:https://www.jianshu.com/p/b25c5b88baf5
- 工具:chrome
- 首页https://fanyi.sogou.com/,先看看调用一次翻译需要哪些数据:
第一步:抓包
从抓包数据中不难看出,需要一些headers和form data,headers这里不细说,和它没关系,我们主要看加密方式;
实验步骤:
- 用python创建一个脚本,把参数什么的copy到脚本里,重放这次请求,没问题,直接返回正确结果;(大家用postman回放也可以,都一样)
- form data中要注意的只有s和uuid,其他的不用说,很明显就能看出参数啥意思;
- uuid;
- 修改s,重放请求,返回错误,说明s值是服务器端要校验的!
步骤二:调式
实验步骤:
-
打开开发者工具—>source,可以看到网页加载的资源,那么加密算法一定就在某个js脚本里;
-
在上面抓包我们看到了,和s一起发送的数据还有client和uuid等信息,s这个字符搜起来一大堆,所以我们选择在js里搜client效率会高点;
-
在source的所有js脚本里挨个搜索client和uuid,依次排查,最终在一个脚本里找到对应的数据:
在这里我们看到,s的值来自J,而J的值来自公式s("" + P + O + M + V),那么POMV这些变量又是咋来的呢?s这个函数又是啥? -
在289行打上断点,重新在搜狗的输入框输入一段话,网页会在断点处停下并显示相关变量的值:
很明显,M是待翻译文本,O是目的语言,P是原始语言,V是一串数值; -
现在的问题重新变为,s()这个函数是什么?V这个数值是什么?
-
我们先看V值:
在代码里搜索V(注意打开匹配大小写,效率高些),搜索上一个(在我们的参数构造代码出现前的那一个),发现var V = window.seccode
,window.seccode这个值在搜索引擎找了下,没有,那应该就是搜狗自己定义的值了,于是在source的各个js文件里搜索它,在一个js文件里找到了:
发现这个值是写死的,打开无痕浏览,重新打开搜狗搜索,发现里面的window.seccode值一样,说明是个定值,类似于salt;
- 现在只剩s(),我们就可以自己计算s = s(’’ + P + O + M + V)的值了;
- 我们把js代码格式化下,点击下chrome的括号小图标即可
这样我们搜索s()被定义的地方就方便了,因为js中定义函数要么是s = function(){…} ,要么是function s(){…},所以我们依次搜索s(
和s =
,在同一个文件的同一个函数里发现这个代码:
(和大家说个搜索小技巧,这里搜索尽量在我们发现data数据那里,搜索上一个,并且s =
优先查看在同一个函数内的s =
,这样就可以找到离我们的data代码最近的一个被定义的s,省去了不少事!)
在console里打印下n(50),发现它确实是一个函数!
点一下,跳转到对应的js处,得到s()函数的代码为:
function(t, n) {
if (void 0 === t || null === t)
throw new Error("Illegal argument " + t);
var r = e.wordsToBytes(a(t, n));
return n && n.asBytes ? r : n && n.asString ? i.bytesToString(r) : e.bytesToHex(r)
}
在console中测试下这个代码:
发现和我们的data中s值完全一致,且第二个参数可有可无,不影响结果;
9.这样,整个form data数据我们都知道怎么计算了,大家可以用自己的编程语言实现对应的代码即可(其实s()这个函数就是一个md5算法,噗哈哈)
10.都到这一步了,我们可以看看form data里的uuid到底是啥,用搜s()的方法找到uuid,发现uuid = B,搜索B =
,只有俩,发现
向上搜索o =
,得到
在console打印n(16),发现是一个函数,且有get方法,直接调用:
完:其实是今天看了一篇chrome调试的文章(就是开头让你们看的那篇),于是赶紧来练习一遍