python爬虫——有道翻译接口的使用

——注:本文档是在程序调试之后才总结完成的,部分截图与程序调试时会不一样。

  • 1.翻译接口url的寻找

    打开有道翻译在线翻译网页,打开页面检查抓包工具,捕获真正的请求url
    python爬虫——有道翻译接口的使用_第1张图片

  • 2.查看文件后发现translate_o?..的文件中有输入的翻译内容及对应的翻译结果,那么文件中的url可能就是我们要找的url了
    python爬虫——有道翻译接口的使用_第2张图片python爬虫——有道翻译接口的使用_第3张图片python爬虫——有道翻译接口的使用_第4张图片

  • 3.找到url后,可以知道请求的方式是get,同时Form Data中有很多需要一起携带的参数,可以试着不携带这些参数去获取请求,最后会发现这些参数都是必要的。接下来可以通过获取多次翻译来对比这些参数每一次都有什么变化:python爬虫——有道翻译接口的使用_第5张图片
    上图中除了 salt、sign、ts这三个参数每次都会变化之外,i是我们输入的内容,其他都不会变(bv每个浏览器都会不一样,但只要使用同一个User-Agent,bv的值也不会变化,这个后面会解释)

  • 4.这些变化的参数可以判定就是通过js来生成的,所以需要寻找这些参数的具体位置并推断出参数的生成过程。这个步骤是整个破解过程的关键。

    • 4.1 可以通过全局搜索先查找salt的位置,如图:
      python爬虫——有道翻译接口的使用_第6张图片python爬虫——有道翻译接口的使用_第7张图片

    • 4.2 打开js文件并格式化代码显示后再次搜索salt,找到salt的位置,可以发现,其他几个参数也在这里
      python爬虫——有道翻译接口的使用_第8张图片

    • 4.3 接下来是设置断点,比如上图点击salt所在的这一行,左侧会有一个蓝色箭头,同时这一行高亮显示,就是设置了断点,然后再点一下“翻译”的按钮,页面会进入调试模式,执行到salt这一行时会停止,可以接着点击右侧的调试工具让程序一步一步执行,查看函数具体调用的位置。
      python爬虫——有道翻译接口的使用_第9张图片python爬虫——有道翻译接口的使用_第10张图片

    • 4.4 可以看到断点执行过程中每个参数最后得到的结果值。

    • 4.5 分析:

      • ts 比较好理解,通过r 得到,r 就是通过简单的(new Date).getTime()函数得到,结果值比较类似于一个时间戳(后面会使用在线工具来验证)
      • salt也好理解,需要先生成ts,然后通过拼接字符串来得到。对应的是 i,i = r + parseInt(10*Math.random(),10),后面的参数应该是生成一个随机数,然后把这个随机数转换为一个字符串来和r 拼接
      • sign值稍微复杂点,需要使用md5进行加密,加密的内容又是几个参数。没事,来分析一下这几个被加密的参数,从表达式中可以看出也是对参数进行拼接来得到一个字符串。第一个参数"fanyideskweb"和最后一个参数"n%A-rKaT5fb[Gy?;N5@Tj"就是固定的字符串,所以就剩两个参数而已。参数e 可以看到结果值就是我们输入要查询的单词 “key”,参数i 就是参数salt,前面先计算出salt的值,这里拿过来用就行了。
      • bv值在一开始的对比中就发现是不会变化的。不过这里生成bv的函数有点意思,所以也看一下。bv 是通过t 得到的,t = n.md5(navigator.appVersion),看来也是获取一个字符串然后再用md5进行加密。而navigator.appVersion看起来比较像一个函数,把鼠标放在这个值上面,可以看到显示出一长串东西,而这串内容会发现很眼熟,就是提取了我们的浏览器标识的内容。
  • 5.参数的详细分析

    • 5.1 参数 ts

      前面的分析ts 应该是一个时间戳,(对于js还是需要再加强加强哇)所以我们也需要用python代码来构造出这个参数
      python爬虫——有道翻译接口的使用_第11张图片

    • 5.2 参数 salt

      这里用在线调试工具来查看两个参数的生成及拼接的结果
      python爬虫——有道翻译接口的使用_第12张图片
      同样用python代码进行验证
      python爬虫——有道翻译接口的使用_第13张图片

    • 5.3 参数 sign

      有了ts 和salt 两个参数之后,因为这些参数之间是相关联的,所以可以构造sign 参数了,同样用python代码来验证
      python爬虫——有道翻译接口的使用_第14张图片
      得到的结果是一个用md5加密的签名值,看着也跟浏览器中生成的结果很像了,只是因为时间戳不一样,所以值不同而已。

    • 5.4 参数 bv

      参数bv 的分析也同样用python代码来验证,如图(按标注的步骤阅读)
      python爬虫——有道翻译接口的使用_第15张图片

  • 6.至此,参数就都分析完了,完善代码,验证最后的结果。

    import requests
    import time
    import random
    import hashlib
    import json
    import sys
    
    
     # key = input("请输入要翻译的内容")
    key = sys.argv[1]
    
    def get_salt(ts):  # 需要ts参数(r)
        """获取salt,js中salt:i"""
        # salt = ts + parseInt(10*Math.random(),10)
        salt = ts + str(random.randint(0, 10))
        return salt
    
    def get_sign(key, salt):
        """获取sign"""
        # var n = e("./jquery-1.7");
        # sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj")
        sign = "fanyideskweb" + key + salt + "n%A-rKaT5fb[Gy?;N5@Tj"
        sign = hashlib.md5(sign.encode("utf-8")).hexdigest()
        return sign
    
    def get_ts():
        # r = "" + (new Date).getTime()
        # ts:r
        ts = int(time.time()*1000)
        return str(ts)
    
     # 请求url地址
    post_url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    
    ts = get_ts()
    salt = get_salt(ts)
    sign = get_sign(key, salt)
    
     # 构造参数
    data = {
        'i': key,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': salt,
        'sign': sign,
        'ts': ts,
        'bv': '53539dde41bde18f4a71bb075fcf2e66',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'
    }
    
     # 构造请求头
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",
        "Accept": "application/json, text/javascript, */*; q=0.01",
        "Accept-Encoding": "gzip, deflate",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7",
        "Connection": "keep-alive",
        "Content-Length": str(len(data)),
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Cookie": "[email protected]|1563967015|0|other|00&99|CN&1562044200&mail_client#CN&null#10#0#0|&0||[email protected]; [email protected]; OUTFOX_SEARCH_USER_ID_NCOO=538717569.5545719; JSESSIONID=aaapjRLwFIQta-h3qM7Ww; YOUDAO_MOBILE_ACCESS_TYPE=0; ___rl__test__cookies=1564388487325",
        "Host": "fanyi.youdao.com",
        "Origin": "http://fanyi.youdao.com",
        "Referer": "http://fanyi.youdao.com",
        "X-Requested-With": "XMLHttpRequest"
    }
    
    r = requests.post(post_url, headers=headers, data=data)
     # print(r.status_code)
    data_dict = json.loads(r.content.decode())
    ret = data_dict["translateResult"][0][0]["tgt"]
    print(key,"翻译的结果是:\n",ret)  
    
  • 7.运行程序

    (这个接口是自动检测输入内容的,所以中英文都可以翻译哦~)python爬虫——有道翻译接口的使用_第16张图片

你可能感兴趣的:(爬虫)