谷歌翻譯API, 免費採集翻譯

大家都知道,以前谷歌翻譯是開放免費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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章