百度翻译

百度翻译, 代码如下

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'))

猜你喜欢

转载自blog.csdn.net/qq_42553568/article/details/88531130