当前位置 博文首页 > python 实现有道翻译功能

    python 实现有道翻译功能

    作者:Revenant- 时间:2021-07-20 18:54

    目录
    • 初期操作
    • 分析参数
    • 分析salt、sign
    • Python代码
    • 运行效果

    初期操作

    ​打开有道翻译界面—F12—Network—在翻译框中输入'hello'—在Network下面发现名为'translate_o?smartresult......'返回翻译之后的数据

    分析参数

    把所有的Request Headers、params都写上尝试爬虫,可以得到结果。

    ​然后Request Headers中Headers、Host、Origin、Referer三项留下,Cookie一项经尝试只有 OUTFOX_SEARCH_USER_ID=-1927650476@223.97.13.65;会验证而且尝试多次之后我这里是没有变化的。

    Accept: application/json, text/javascript, */*; q=0.01
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Connection: keep-alive
    Content-Length: 252
    Content-Type: application/x-www-form-urlencoded; charset=UTF-8
    Cookie: OUTFOX_SEARCH_USER_ID=-1927650476@223.97.13.65; OUTFOX_SEARCH_USER_ID_NCOO=1897197670.972445; JSESSIONID=aaalvPunK-sv2fyR-UjEx; ___rl__test__cookies=1612924426799
    Host: fanyi.youdao.com
    Origin: http://fanyi.youdao.com
    Referer: http://fanyi.youdao.com/
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36
    X-Requested-With: XMLHttpRequest

    再就是params参数,变化的是salt、sign、lts,尝试后发现lts可有可无,所以变化的只有salt、sign两项。

    i: 你好
    from: AUTO
    to: AUTO
    smartresult: dict
    client: fanyideskweb
    salt: 16129244361391
    sign: 2820759b6e54f25e0aa94e185e2265e3
    lts: 1612924436139
    bv: 3da01a09873456cfb5dba05f2124b148
    doctype: json
    version: 2.1
    keyfrom: fanyi.web
    action: FY_BY_REALTlME

    分析salt、sign

    全局搜索sign,结果中有fanyi.min.js文件,双击进入,然后右键选择'Open in Source panel',搜索'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 = n.md5(navigator.appVersion)
       , r = "" + (new Date).getTime()
       , i = r + parseInt(10 * Math.random(), 10);
      return {
       ts: r,
       bv: t,
       salt: i,
       sign: n.md5("fanyideskweb" + e + i + "Tbh5E8=q6U3EXe+&L[4c@")
      }
     };

    ​可以看出salt是13位时间戳加了一个10以内的随机数,而sign是'固定字符串+e+i+固定字符串',其中i就是salt,而e经过断点调试(我选择在var t = n.md5(navigator.appVersion)这一行加断点,然后输入你好,会出现e='你好')可以得知e为我们要翻译的字符串。这样整个分析过程就结束了。

    ​之后通过爬虫可以得到我们想要的数据,因为返回的是json数据,我们使用.json()来获得返回值更加方便。

    Python代码

    import hashlib
    import random
    import time
    import requests
    
    
    def get_data():
     r = str(round(time.time() * 1000))
     salt = r + str(random.randint(0, 9))
    
     content = '你好'
    
     data = "fanyideskweb" + content + salt + "Tbh5E8=q6U3EXe+&L[4c@"
     sign = hashlib.md5()
    
     sign.update(data.encode("utf-8"))
    
     sign = sign.hexdigest()
     # print(len(sign))
     # print(sign)
     return content, salt, sign
    
    
    def send_request(content, salt, sign):
     url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    
     headers = {
      'Cookie': 'OUTFOX_SEARCH_USER_ID=-1927650476@223.97.13.65;',
      'Host': 'fanyi.youdao.com',
      'Origin': 'http://fanyi.youdao.com',
      'Referer': 'http://fanyi.youdao.com/',
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36',
     }
    
     data = {
      'i': str(content),
      'from': 'AUTO',
      'to': 'AUTO',
      'smartresult': 'dict',
      'client': 'fanyideskweb',
      'salt': str(salt),
      'sign': str(sign),
      # 'lts': '1612879546052',
      # 'bv': '6a1ac4a5cc37a3de2c535a36eda9e149',
      # 'doctype': 'json',
      'version': '2.1',
      'keyfrom': 'fanyi.web',
      'action': 'FY_BY_REALTlME',
     }
    
     res = requests.post(url=url, headers=headers, data=data).json()
    
     print('翻译后:', res['translateResult'][0][0]['tgt'])
     print('翻译前:', res['translateResult'][0][0]['src'])
    
    
    if __name__ == '__main__':
     content, salt, sign = get_data()
     send_request(content, salt, sign)

    运行效果

    jsjbwy
    下一篇:没有了