Google翻译接口Python API实现和TK算法解析

在最近的项目里遇到一个需要将中文翻译成日语的case, 起来也只有Google翻译API可以稍稍满足需求,但是Google翻译的官方API是收费版本且费用还很高,

期待方案分别是:

1. 百度翻译 – 40/1000次 效果一般

2. 网易翻译 – 效果不是很好

3. 继续研究Google翻译算法

Google自从被墙之后, transalte,google.com 是被墙了无法使用,所以以下Python库中的包是不能使用的.

Python Google翻译包

安装:

pip install translator

用法举例:

>>> from python_google_translator import translator
>>> print translator.translate(sl=’en’, tl=’zh-CN’, content=’Hi,\nWhat time is it?’, proxy=’qi:ws2013@127.0.0.1:8080′)
您好!
现在是什么时候?

参数说明:
sl – 原语言。
tl – 翻译成的目标语言。
content – 要翻译的内容。
proxy – 访问谷歌翻译使用的代理。

方法二: 采用最原始的方法就是模拟人工输入翻译, 也就是模拟人在Google翻译中文版里面 模拟输入和 模拟点击翻译来实现翻译效果.

根据Chrome调试,发现Google翻译请求的网址是:

Google翻译请求url

发现是get请求方式,那就更简单了,直接拼接URL,分析一下参数,发现最关键的是q,q后面带的就是待翻译的文本,我这里只需要将英文翻译成汉语,其他的参数就直接照抄了,如果有其他需求,直接修改相关参数即可

请求的参数为:

Google翻译API请求参数

总结为:

http://translate.google.cn/translate_a/single?client=t&sl=en&tl=zh-CN&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&otf=1&srcrom=0&ssel=0&tsel=0&kc=5&tk=196711.345729&q=替换为待翻译字符串

注意, 这里有一个很重要的参数就是tk, tk是谷歌服务器验证的token参数,以屏蔽机器.

这里直接给出大家google 翻译的TK的算法, 根据算法大家可以得到合法的tk然后请求Google翻译.cn里面的url 即可获取Google翻译

  1. function TL(a) { 
  2.         var k = “”; 
  3.         var b = 406644; 
  4.         var b1 = 3293161072; 
  5.          
  6.         var jd = “.”; 
  7.         var $b = “+-a^+6”; 
  8.         var Zb = “+-3^+b+-f”; 
  9.      
  10.         for (var e = [], f = 0, g = 0; g < a.length; g++) { 
  11.             var m = a.charCodeAt(g); 
  12.             128 > m ? e[f++] = m : (2048 > m ? e[f++] = m >> 6 | 192 : (55296 == (m & 64512) && g + 1 < a.length && 56320 == (a.charCodeAt(g + 1) & 64512) ? (m = 65536 + ((m & 1023) << 10) + (a.charCodeAt(++g) & 1023), 
  13.             e[f++] = m >> 18 | 240, 
  14.             e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224, 
  15.             e[f++] = m >> 6 & 63 | 128), 
  16.             e[f++] = m & 63 | 128) 
  17.         } 
  18.         a = b; 
  19.         for (f = 0; f < e.length; f++) a += e[f], 
  20.         a = RL(a, $b); 
  21.         a = RL(a, Zb); 
  22.         a ^= b1 || 0; 
  23.         0 > a && (a = (a & 2147483647) + 2147483648); 
  24.         a %= 1E6; 
  25.         return a.toString() + jd + (a ^ b) 
  26.     }; 
  27.      
  28.     function RL(a, b) { 
  29.         var t = “a”; 
  30.         var Yb = “+”; 
  31.         for (var c = 0; c < b.length – 2; c += 3) { 
  32.             var d = b.charAt(c + 2), 
  33.             d = d >= t ? d.charCodeAt(0) – 87 : Number(d), 
  34.             d = b.charAt(c + 1) == Yb ? a >>> d: a << d; 
  35.             a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d 
  36.         } 
  37.         return a 
  38.     } 

这里是js版本的google 翻译tk算法实现,

Python版本tk算法实现:

https://github.com/MrS0m30n3/google-translate

Ruby语言的google翻译 tk算法实现:

https://github.com/Stichoza/google-translate-php/issues/32#issuecomment-174027042

PHP语言版本的Google翻译TK算法实现:

https://github.com/Stichoza/google-translate-php/issues/32#issuecomment-218713346

有人问:谷歌翻译tk算法是怎么实现的,现在网上所有的的代码失效,抓包显示tk=是关键,有大牛知道吗,tk不知道你就不能用任何编程实现

这下就知道答案了。

根据以上的tk算法得到tk后,我们就可以开始请求Google翻译的url地址啦.

具体代码实现:

import urllib.request
import os,sys
sys.path.append(‘/home/andy/dev/cleanTag’) # tk生产文件的路径
import tk_generator #tk生产文件的文件名

def open_url(url):
    headers = {‘User-Agent’:’Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0′}  
    req = urllib.request.Request(url = url,headers=headers)
    response = urllib.request.urlopen(req)
    data = response.read().decode(‘utf-8’)
    return data

def translate(content,tk):
    if len(content) > 4891:
        print(“翻译的长度超过限制!!!”)
        return 
        content = urllib.parse.quote(content)
        url = “http://translate.google.cn/translate_a/single?client=t”\
            “&sl=en&tl=zh-CN&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&clearbtn=1&otf=1&pc=1″\
            “&srcrom=0&ssel=0&tsel=0&kc=2&tk=%s&q=%s”%(tk,content)

#返回值是一个多层嵌套列表的字符串形式,解析起来还相当费劲,写了几个正则,发现也很不理想,  
#后来感觉,使用正则简直就是把简单的事情复杂化,这里直接切片就Ok了
        result = open_url(url)
        end = result.find(“\”,”)
        if end > 4:
            print(result[4:end])   

if __name__ == “__main__”:
    tk = tk_generator.get_tk(“世界”)
    translate(“世界”,tk)
    #main()  

发表回复