谷歌翻译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的运算函数。

 

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. var TKK = ((function() {  
  2.   var a = 561666268;  
  3.   var b = 1526272306;  
  4.   return 406398 + '.' + (a + b);  
  5. })());  
  6.   
  7. function b(a, b) {  
  8.   for (var d = 0; d < b.length - 2; d += 3) {  
  9.       var c = b.charAt(d + 2),  
  10.           c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),  
  11.           c = "+" == b.charAt(d + 1) ? a >>> c : a << c;  
  12.       a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c  
  13.   }  
  14.   return a  
  15. }  
  16.   
  17. function tk(a) {  
  18.     for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {  
  19.         var c = a.charCodeAt(f);  
  20.         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)  
  21.     }  
  22.     a = h;  
  23.     for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");  
  24.     a = b(a, "+-3^+b+-f");  
  25.     a ^= Number(e[1]) || 0;  
  26.     0 > a && (a = (a & 2147483647) + 2147483648);  
  27.     a %= 1E6;  
  28.     return a.toString() + "." + (a ^ h)  
  29. }  


经过测试,确实有用,能够正确算出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

 

文章来源:http://blog.csdn.net/life169/article/details/52153929

猜你喜欢

转载自kfcman.iteye.com/blog/2356517