百度翻译, 代码如下
import re
import json
import execjs
import requests
from pprint import pprint
from urllib.parse import quote
class BaiDuTranslate:
def __init__(self):
# 请求头非常重要,在请求 fanyi.baidu.com 这个页面的时候需要传递
self.header = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
"Cookie": "REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; "
"SOUND_PREFER_SWITCH=1; BDUSS=13dldTV1JHa1FpaFdPcWsyeWpqZG5uVHlZcUtrQmFpQ2E3ZWp5M21Pb"
"WJrbWRjQVFBQUFBJCQAAAAAAAAAAAEAAAD0~dRrzt7P3rXAufsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJsFQFybBUBcck; PSTM=1550450714; BIDUPSID=998C4C"
"69D611D5C89DF87A4E79021472; __cfduid=d4bf66b9959559daf94440933236e0e721551087845; BAIDU"
"ID=ABE5158E5EB63B07C56E0E394C97F0AE:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_"
"PSSID=26524_1436_21125_18559_28607_28585_28557_28518_28627; delPer=0; PSINO=3; BDRCVFR["
"feWj1Vr5u3D]=I67x6TjHwwYf0; locale=zh; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1552371808,"
"1552378365,1552447865,1552447869; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1552447869; "
"to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22v"
"alue%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D; from_lang_often=%5B%7B%22value"
"%22%3A%22dan%22%2C%22text%22%3A%22%u4E39%u9EA6%u8BED%22%7D%2C%7B%22value%22%3A%22en%22%2C%"
"22text%22%3A%22%u82F1%u8BED%22%7D%2C%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u658"
"7%22%7D%5D",
}
# 获取网页源码
self.html = requests.get('https://fanyi.baidu.com', headers=self.header)
self.html.encoding = 'utf-8'
# 正则匹配 gtk
matches = re.findall("window.gtk = '(.*?)';", self.html.text, re.S)
self.gtk = matches[0] if matches else ""
# 正则匹配 token
matches = re.findall("token: '(.*?)'", self.html.text, re.S)
self.token = matches[0] if matches else ""
self.signCode = 'function a(r,o){for(var t=0;t<o.length-2;t+=3){var a=o.charAt(t+2);a=a>="a"?a.charCodeAt' \
'(0)-87:Number(a),a="+"===o.charAt(t+1)?r>>>a:r<<a,r="+"===o.charAt(t)?r+a&4294967295:r^a} ' \
'return r}var C=null;var hash=function(r,_gtk){var o=r.length;o>30&&(r=""+r.substr(0,10)+' \
'r.substr(Math.floor(o/2)-5,10)+r.substr(-10,10));var t=void 0,t=null!==C?C:(C=_gtk||"")||"";' \
'for(var e=t.split("."),h=Number(e[0])||0,i=Number(e[1])||0,d=[],f=0,g=0;g<r.length;g++)' \
'{var m=r.charCodeAt(g);128>m?d[f++]=m:(2048>m?d[f++]=m>>6|192:(55296===(64512&m)&&g+1' \
'<r.length&&56320===(64512&r.charCodeAt(g+1))?(m=65536+((1023&m)<<10)+(1023&r.charCodeAt' \
'(++g)),d[f++]=m>>18|240,d[f++]=m>>12&63|128):d[f++]=m>>12|224,d[f++]=m>>6&63|128),d[f++]=' \
'63&m|128)}for(var S=h,u="+-a^+6",l="+-3^+b+-f",s=0;s<d.length;s++)S+=d[s],S=a(S,u);' \
'return S=a(S,l),S^=i,0>S&&(S=(2147483647&S)+2147483648),S%=1e6,S.toString()+"."+(S^h)}'
def main(self, source):
sign = execjs.compile(self.signCode).call('hash', source, self.gtk)
# 请求接口
from_language = 'en'
to_language = 'zh'
v2transapi = 'https://fanyi.baidu.com/v2transapi?from=%s&to=%s&query=%s&transtype=translang&simple_means_flag' \
'=3&sign=%s&token=%s' % (from_language, to_language, quote(source), sign, self.token)
translate_result = requests.get(v2transapi, headers=self.header)
data = json.loads(translate_result.text)
# pprint(data)
english = data['trans_result']['data'][0]['dst']
return english
if __name__ == '__main__':
bd = BaiDuTranslate()
print(bd.main('hello'))