百度翻译接口实例解析

作者: HONGQUAN | 来源:发表于2018-05-20 19:36 被阅读22次

    继《百度翻译最新接口破解》发出之后,很多朋友反馈请求始终是 998 的问题
    这里特地单独写一篇实例来解析

    关于 token 和 gtk 参数的获取以及 sign 参数加密校验的过程请参考《百度翻译最新接口破解

    本实例采用 Python3 进行编写

    获取 token 和 gtk 代码如下

    # 请求头非常重要,在请求 fanyi.baidu.com 这个页面的时候需要传递
    # 笔者测试时发现,如果不传递的话百度也会返回 token 和 gtk,但是此时返回的值是无法正确请求到翻译结果的
    header = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36",
        "Cookie": "'locale=zh; BAIDUID=FC2689968A662FA6104AA311FE89635B:FG=1; from_lang_often=%5B%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%u6587%22%7D%5D; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; to_lang_often=%5B%7B%22value%22%3A%22zh%22%2C%22text%22%3A%22%u4E2D%u6587%22%7D%2C%7B%22value%22%3A%22en%22%2C%22text%22%3A%22%u82F1%u8BED%22%7D%5D'",
    }
    
    # 获取网页源码
    html = requests.get('http://fanyi.baidu.com', headers=header)
    html.encoding = 'utf-8'
    
    # 正则匹配 gtk
    matches = re.findall("window.gtk = '(.*?)';", html.text, re.S)
    for match in matches:
        gtk = match
    
    if gtk == "":
        print('Get gtk fail.')
        exit()
    
    print('gtk = ' + gtk)
    
    # 正则匹配 token
    matches = re.findall("token: '(.*?)'", html.text, re.S)
    for match in matches:
        token = match
    
    if token == "":
        print('Get token fail.')
        exit()
    
    print('token = ' + token)
    

    获取到 token 和 gtk 之后,我们需要对待翻译的内容进行加密,这一步中返回的 sign 可以在百度的翻译页面中进行校验,查看对错与否

    # 计算 sign
    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)}'
    
    source = '今天天气怎么样'
    sign = execjs.compile(signCode).call('hash', source, gtk)
    print('source = ' + source + ', sign = ' + sign)
    

    有了 token 和 sign,我们就可以开始构建请求了
    先来看一个可以正常返回结果的请求
    http://fanyi.baidu.com/v2transapi?from=zh&to=en&query=%E4%BB%8A%E5%A4%A9%E5%A4%A9%E6%B0%94%E6%80%8E%E4%B9%88%E6%A0%B7&transtype=translang&simple_means_flag=3&sign=719145.924184&token=187678c6ec320a5f5e4e0620799970e5
    其中的参数在《百度翻译最新接口破解》中已经进行说明,from 和 to 可以由用户输入,query 的加密使用的 URLEncode,python 中实现的代码是 urllib.parse.quote('需要翻译的内容')

    接下来非常重要的是,千万不要使用 POST 请求 http://fanyi.baidu.com/v2transapi 这个接口,会返回 998,会返回 998,会返回 998
    具体原因不太清楚
    我们需要做的是,按照正常的请求地址拼接一个我们需要的链接,然后 everything is ok~

    请求代码如下

    # 请求接口
    fromLanguage = 'zh'
    toLanguage = 'en'
    
    v2transapi = 'http://fanyi.baidu.com/v2transapi?from=%s&to=%s&query=%s' \
                 '&transtype=translang&simple_means_flag=3&sign=%s&token=%s' % (fromLanguage, toLanguage, urllib.parse.quote(source), sign, token)
    print(v2transapi)
    
    translate_result = requests.get(v2transapi, headers=header)
    print(translate_result.text)
    

    根据上面提供的 3 段代码大家应该可以正常获取返回结果,废话不说了,源码点此下载

    相关文章

      网友评论

      • a0070de5e83a:失效了
        HONGQUAN:@MathJoy 已经更新了,请看最新文章 https://www.jianshu.com/p/2c333f7ae1c2
      • fungleo:我用您的代码写了一个命令行工具,文章地址:https://blog.csdn.net/FungLeo/article/details/81045207 但是最近在使用中发现了 997 错误,甚是懵逼。。。
        {
        "error": 997,
        "from": "zh",
        "to": "en",
        "query": "你好"
        }
        不知道到底是啥情况。楼主有兴趣更新一下不:smile:
        HONGQUAN:@fungleo 已经更新了,请看最新文章 https://www.jianshu.com/p/2c333f7ae1c2

      本文标题:百度翻译接口实例解析

      本文链接:https://www.haomeiwen.com/subject/ijutjftx.html