Python 使用有道翻译
最近想将一些句子翻译成不同的语言,最开始想使用Python向有道发送请求包的方式进行翻译。
这种翻译方式可行,不过只能翻译默认语言,不能选定语言,于是我研究了一下如何构造请求参数,其中有两个参数最复杂(salt 和 sign),网络上有很多人发现如何破解,不过我尝试过后发现并不能用,有道已经改版了(2018年6月改版),使用了自己定义的md5加密方式来构建sign参数。
define("newweb/common/service", ["./utils", "./md5", "./jquery-1.7"], function(e, t) { var n = e("./jquery-1.7"); e("./utils"); e("./md5"); var r = function(e) { var t = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10)); return { salt: t, sign: n.md5("fanyideskweb" + e + t + "6x(ZHw]mwzX#u0V7@yfwK")#e 为需要翻译的文本, t为时间戳 } };
define("newweb/common/md5", ["./jquery-1.7"], function(e, t) { var n = function(e, t) { return e << t | e >>> 32 - t }, r = function(e, t) { var n, r, i, o, a; return i = 2147483648 & e, o = 2147483648 & t, n = 1073741824 & e, r = 1073741824 & t, a = (1073741823 & e) + (1073741823 & t), n & r ? 2147483648 ^ a ^ i ^ o: n | r ? 1073741824 & a ? 3221225472 ^ a ^ i ^ o: 1073741824 ^ a ^ i ^ o: a ^ i ^ o }, i = function(e, t, n) { return e & t | ~e & n }, o = function(e, t, n) { return e & n | t & ~n }, a = function(e, t, n) { return e ^ t ^ n }, s = function(e, t, n) { return t ^ (e | ~n) }, l = function(e, t, o, a, s, l, c) { return e = r(e, r(r(i(t, o, a), s), c)), r(n(e, l), t) }, c = function(e, t, i, a, s, l, c) { return e = r(e, r(r(o(t, i, a), s), c)), r(n(e, l), t) }, u = function(e, t, i, o, s, l, c) { return e = r(e, r(r(a(t, i, o), s), c)), r(n(e, l), t) }, f = function(e, t, i, o, a, l, c) { return e = r(e, r(r(s(t, i, o), a), c)), r(n(e, l), t) }, d = function(e) { for (var t, n = e.length, r = n + 8, i = 16 * ((r - r % 64) / 64 + 1), o = Array(i - 1), a = 0, s = 0; s < n;) a = s % 4 * 8, o[t = (s - s % 4) / 4] = o[t] | e.charCodeAt(s) << a, s++; return t = (s - s % 4) / 4, a = s % 4 * 8, o[t] = o[t] | 128 << a, o[i - 2] = n << 3, o[i - 1] = n >>> 29, o },
当使用Python中md5加密方法,虽然与有道得到的参数形式很像,但是始终翻译结果为一群问好。
于是使用了下面方法,python + selenium,总于可以得到翻译结果。上代码:
def youdao_trans(trans_sentences): driver_path = r"E:\python\tools\selenuimDirivers\chromedriver_win32_2.40\chromedriver.exe" chrome = webdriver.Chrome(driver_path) chrome.get("http://fanyi.youdao.com/") for key in trans_sentences: try: script = "lans = document.getElementById('languageSelect');lans.childNodes[7].firstElementChild.click()" print("translate from:",key) chrome.execute_script(script)#这里使用javascript获取翻译语言,注意lans.childNodes[index],index需为奇数,大家在浏览器里运行便可知道原因。
inputOriginal = chrome.find_element_by_id('inputOriginal')
inputOriginal.send_keys(key)
chrome.implicitly_wait(1)
result = chrome.find_element_by_xpath('//div[@id="transTarget"]/p/span')
yield result.text
chrome.refresh()
except Exception as e:
print(e)
translate_list = ['你好','如何使用Python编程','今天天气怎么样']
result = youdao_trans(translate_list)
for r in result:
print("translate to:", r)