大家都知道,以前谷歌翻译是开放免费API的,对于我们工程中即时翻译用的很方便,可是后来谷歌收费了,5555 各种不方便啊
遂 ,决定自己做个采集翻译的小工具,方便自己,也能方便大家。当然,网上的哪些所谓的方法工具都已经失效了。
先来梳理一下谷歌翻译的流程, 用抓包工具走了一遍,发现内容提交是GET方式,qurestring , 还伴有cookie,于是从抓包工具中提取GET..... HTTP/1.1 (GET /translate_a/single?client=t&sl=zh-CN&tl=en&hl=zh-CN&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&source=btn&ssel=3&tsel=3&kc=0&tk=494883.112282&q=%E5%A6%82%E6%9E%9C HTTP/1.1)提取cookie
(_ga=GA1.3.1165698298.1450741032; NID=83=Q01ASZSQufLFnKHIdshHP5NRfGho82XPttcC58jRq0SjWrV-9vxy0sYtzxaQfKtQ2yqyAIfVY_Zmz6elJwfL3EWm-rM3JwyNMAcEiuJKkAh_Qo8cOvQxYEH7F3pYwCfV)
用fsockopen模拟浏览器试了一下,哎呦不错,直接就得到翻译的内容了,json形式的。心里一阵暗喜,居然这么简单(为啥网上还有好多人说搞不定呢)。
接着测试,继续用其他中文,哎呀,居然403错误,google不给翻译了。
仔细研究了下,发现链接中 tk 值很特殊,不知道怎么来的。然后查看了谷歌翻译的源文件,看到了一串js代码TKK=eval('((function(){var a\x3d1246737830;var b\x3d1020198760;return 408411+\x27.\x27+(a+b)})())'); 这串代码产生的值与tk有点像,但又不全像,显然这个TKK字符串还要经过运算。于是查看了一下谷歌翻译的JS文件,找到了相关的函数,还挺复杂的,这个TKK值还要与待翻译的文字一起运算才能得到 tk 值, 也就是说 tk 值 既与TKK有关也与 待翻译文字有关。而且 发现不需要cookie 。
google了一下,发现国外有牛人提取并简化 了 tk的运算函数。
var TKK = ((function() {
var a = 561666268;
var b = 1526272306;
return 406398 + '.' + (a + b);
})());
function b(a, b) {
for (var d = 0; d < b.length - 2; d += 3) {
var c = b.charAt(d + 2),
c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
}
return a
}
function tk(a) {
for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
var c = a.charCodeAt(f);
128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ? (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240, g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
}
a = h;
for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
a = b(a, "+-3^+b+-f");
a ^= Number(e[1]) || 0;
0 > a && (a = (a & 2147483647) + 2147483648);
a %= 1E6;
return a.toString() + "." + (a ^ h)
}
经过测试,确实有用,能够正确算出tk 值, 只是这位仁兄直接用了固定的TKK值,而在实际中TKK是随机变的。
所以正确的流程是:
1.) get谷歌,获得TKK
2.) 算出 tk
3.) 采集翻译
我做了个demo,是Javascript版本的,下载地址:http://pan.baidu.com/s/1dEGVoNv 提取码a4bq ; 下载地址:http://download.youkuaiyun.com/detail/life169/9598373
其实还有个PHP版的,有为高手做了个在线实例 http://www.liuxiatool.com/t.php