在最近的项目里遇到一个需要将中文翻译成日语的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翻译请求的网址是:
发现是get请求方式,那就更简单了,直接拼接URL,分析一下参数,发现最关键的是q,q后面带的就是待翻译的文本,我这里只需要将英文翻译成汉语,其他的参数就直接照抄了,如果有其他需求,直接修改相关参数即可
请求的参数为:
总结为:
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翻译
- function TL(a) {
- var k = “”;
- var b = 406644;
- var b1 = 3293161072;
- var jd = “.”;
- var $b = “+-a^+6”;
- var Zb = “+-3^+b+-f”;
- for (var e = [], f = 0, g = 0; g < a.length; g++) {
- var m = a.charCodeAt(g);
- 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),
- e[f++] = m >> 18 | 240,
- e[f++] = m >> 12 & 63 | 128) : e[f++] = m >> 12 | 224,
- e[f++] = m >> 6 & 63 | 128),
- e[f++] = m & 63 | 128)
- }
- a = b;
- for (f = 0; f < e.length; f++) a += e[f],
- a = RL(a, $b);
- a = RL(a, Zb);
- a ^= b1 || 0;
- 0 > a && (a = (a & 2147483647) + 2147483648);
- a %= 1E6;
- return a.toString() + jd + (a ^ b)
- };
- function RL(a, b) {
- var t = “a”;
- var Yb = “+”;
- for (var c = 0; c < b.length – 2; c += 3) {
- var d = b.charAt(c + 2),
- d = d >= t ? d.charCodeAt(0) – 87 : Number(d),
- d = b.charAt(c + 1) == Yb ? a >>> d: a << d;
- a = b.charAt(c) == Yb ? a + d & 4294967295 : a ^ d
- }
- return a
- }
这里是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()