Python3网络爬虫教程9——有道在线翻译项目(破解JS加密过程)

版权声明:本文章为沐言-BigTree原创,转载复制请标明出处 https://blog.csdn.net/u011318077/article/details/86592160

上接:
Python3网络爬虫教程8——有道在线翻译项目(JS加密)
https://blog.csdn.net/u011318077/article/details/86538141

6.1 有道翻译js加密

  • 有道翻译在线进行了加密过程,检查源码发现formdata中有salt和sign两个键

  • salt(俗称加盐,一个附加的字符串,附加之后然后进行加密,

    • 类似于一般用户输入密码位数有限,服务器会给密码附加一串随机的数值,然后再进行加密,
    • 加密一般都是JS加密)
  • sign(加密后的字段)

  • 提取有道翻译的JS数据

    • 打开有道翻译首页,检查,刷新一下,参考图片43_19.png,然后复制里面的JS数据

    • 数据易读性很差,到在线网站http://tool.oschina.net/codeformat/js进行格式化一下

    • 将格式化的数据保存到,43_19.txt中,

    • 然后ctrl+f查找salt,会找到多个salt,找到以下salt

      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 + “p09@Bn{h02_BIEe]$P^nG”)
      }

    • 查看数据发现 i = “” + (new Date).getTime() + parseInt(10 * Math.random(), 10)

    • 上面的i就是计算salt的值的公式

    • 上面的sign中值是一个计算md5的公式

    • sign: n.md5(“fanyideskweb” + e + i + “p09@Bn{h02_BIEe]$P^nG”)

      • md5后面的括号中为计算公式,包含以下部分
        • 第一部分和第四部分为两个字符串
        • 第三部分就是i,就是上面salt对应的值
        • 第二部分为e,是输入的一个值,经推测,应该是输入的单词
  • 具体实现过程参考案例43_19

  • 案例43_19是按照加密算法,实现的代码

def getSalt():
    '''
    salt公式是:  "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10));
    把他翻译成python代码
    :return:
    '''
    import time, random

    salt = int(time.time()*1000) + random.randint(0,10)

    return salt

def getMD5(v):
    import hashlib
    md5 = hashlib.md5()

    # update需要一共bytes格式的参数
    md5.update(v.encode("utf-8"))

    sign = md5.hexdigest()

    return sign


def getSign(key, salt):

    sign = 'fanyideskweb'+ key + str(salt) + "ebSeFb%=XZ%T[KZ)c(sy!"
    sign = getMD5(sign)

    return sign

from urllib import request, parse
import json


def youdao(key):

    url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"

    salt = getSalt()

    data = {
        "i": key,
        "from":"AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "salt": str(salt) ,
        "sign": getSign(key, salt),
        "doctype": "json",
        "version": "2.1",
        "keyfrom": "fanyi.web",
        "action":"FY_BY_REALTIME",
        "typoResult": "false"
    }

    # 参数data需要是bytes格式
    data = parse.urlencode(data).encode()

    headers = {
        "Accept": "application/json,text/javascript,*/*;q=0.01",
        "Accept-Language": "zh-CN,zh;q=0.9",
        "Connection": "keep-alive",
        "Content-Length": len(data),
        "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
        "Cookie": "[email protected];JSESSIONID=aaaTLWzfvp5Hfg9mAhFkw;OUTFOX_SEARCH_USER_ID_NCOO=1999296830.4784973;___rl__test__cookies=1523100789517",
        "Host": "fanyi.youdao.com",
        "Origin": "http://fanyi.youdao.com",
        "Referer": "http://fanyi.youdao.com/",
        "User-Agent": "Mozilla/5.0( X11; Linux x86_64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36 X-Requested-With: XMLHttpRequest"
    }

    req = request.Request(url=url, data=data, headers=headers)

    res = request.urlopen(req)

    # 下载导出数据
    result = json.loads(res.read())

    # 打印出翻译后的结果
    print("\n翻译结果: " + result["translateResult"][0][0]["tgt"])


if __name__ == '__main__':
    key = input("请输入需要翻译的文字(输入完成后请按Enter): ")
    youdao(key)
输出结果:

请输入需要翻译的文字(输入完成后请按Enter): 我爱你 宝贝

翻译结果: I love you baby

Process finished with exit code 0

下接:
Python3网络爬虫教程9——ajax异步请求
https://blog.csdn.net/u011318077/article/details/86633196

猜你喜欢

转载自blog.csdn.net/u011318077/article/details/86592160
今日推荐