大家都知道,以前谷歌翻譯是開放免費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.csdn.net/detail/life169/9598373
其實還有個PHP版的,有爲高手做了個在線實例 http://www.liuxiatool.com/t.php