文章来源于公众号:爬虫逆向与数据分析
想想已经好久没有写公众号了,今天偷得闲,想起上次写了某道和某度的翻译, 有人问我Google翻译的呢, 那今天就来个Google翻译吧
对于我来说, Google翻译确实是花费了点时间,参数加密倒是不难, 难点在于找到他的加密点, 话不多说, 先上点图:
图1
图2
Google翻译的请求url如图1所示, 而请求参数则如图2所示
参数看起来很多,挺吓人的哈。。。其实吧, 最主要的参数就只有一个, 就是tk这个参数,其他参数都是可以固定的, 那我们的主要观察点,就是tk的生成方式了
(由于本人找tk的时候,也找到了xid的生成方式,就也把他的代码贴出来吧,感兴趣的同学可以自己找找看,)
[code]var hv = function (a) {var b = (new an(q.location.href)).g, c = b.get(\"e\"), d = b.get(\"expid\");b = b.get(\"expflags\");var e = \"\";if (b)return \"expflags=\" + b;c && (e += \"e=\" + c);d && (e && (e += \"&\"),e += \"expid=\" + d);a.h.length && (e && (e += \"&\"),e += \"xid=\" + a.h.join());return e};
接下来咱们的目标就是找tk了, tk的这个参数着实有点难找, 我也是费了好大一股劲, 首先咱们先来尝试查找一下tk
图3
然后就找到了这么多, 如图3
是不是顿时有种吃了翔的感觉, 至少我感觉是的, 既然tk行不通, 那我们就从其他参数入入手来看看,这里是找了xid, 如图4
这下看着就清爽了好多有没有, 这时, 两个js引起了我的注意, 一个是analytics.js, 还有一个是translate_m_zh-CN.js, 从字面意思上看,
一个是分析, 一个是翻译, 根据经验来看,应该是后一个,有兴趣的小伙伴可以两个都看看哈, 这里咱就直接看后一个js了
搜索xid,这时你会惊奇的发现—-你找到了上面我发的那个函数hv, 对,他就是xid的生成函数,可是我们要找的是tk,不是xid啊。不着急,咱接下来慢慢分析
图5
咱们接着搜索hv, 然后发现hv竟然有10个匹配(如图5所示)。唉。。。又是一把辛酸泪。来吧,接着刚。经过细致,小心,瞪大了眼珠子的分析之后,
图6
很幸运, 感谢皇天后土啊, 我们发现了他(如图6所示), 找到了他,其实就已经算是找到了tk了, 因为tk的生成就在xv这个函数里面, 细心的小伙伴应该已经从图6中看到了我的断点了哈哈
说到这里其实也就没啥好说的了, 打个断点调试一下, 就能找到生成规则了
这里就贴下js代码:
[code]var wu = function (a) {return function () {return a}};xu = function (a, b) {for (var c = 0; c < b.length - 2; c += 3) {var d = b.charAt(c + 2);d = \"a\" <= d ? d.charCodeAt(0) - 87 : Number(d);d = \"+\" == b.charAt(c + 1) ? a >>> d : a << d;a = \"+\" == b.charAt(c) ? a + d & 4294967295 : a ^ d}return a};zu = function (a) {if (null !== \'443839.4088163002\')var b = \'443839.4088163002\';else {b = wu(String.fromCharCode(84));var c = wu(String.fromCharCode(75));b = [b(), b()];b[1] = c();b = (yu = window[b.join(c())] || \"\") || \"\"}var d = wu(String.fromCharCode(116));c = wu(String.fromCharCode(107));d = [d(), d()];d[1] = c();c = \"&\" + d.join(\"\") + \"=\";d = b.split(\".\");b = Number(d[0]) || 0;for (var e = [], f = 0, g = 0; g < a.length; g++) {var h = a.charCodeAt(g);128 > h ? e[f++] = h : (2048 > h ? e[f++] = h >> 6 | 192 : (55296 == (h & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (h = 65536 + ((h & 1023) << 10) + (a.charCodeAt(++g) & 1023),e[f++] = h >> 18 | 240,e[f++] = h >> 12 & 63 | 128) : e[f++] = h >> 12 | 224,e[f++] = h >> 6 & 63 | 128),e[f++] = h & 63 | 128)}a = b;for (f = 0; f < e.length; f++)a += e[f],a = xu(a, \"+-a^+6\");a = xu(a, \"+-3^+b+-f\");a ^= Number(d[1]) || 0;0 > a && (a = (a & 2147483647) + 2147483648);a %= 1E6;return c + (a.toString() + \".\" + (a ^ b))};console.log(zu(\"清楚\"));
生成tk值之后,带入请求的url就可以正常拿数据了(小贴士:我这里访问的Google翻译是.com的,需要梯子哦), 如图7所示:
图7
欢迎大家关注公众号哦: