Python - JS逆向破解实现翻译软件

首先先通过POST请求向翻译网页发送请求,获取到返回的json数据

import requests

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

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 "
                  "Safari/537.36",
    "Cookie": "[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1997833077.2695937; "
              "___rl__test__cookies=1661932062388",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Referer": "https://fanyi.youdao.com/"
}

data = {
    'i': '激情',
    'from': 'zh-CHS',
    'to': 'en',
    'smartresult': 'dict',
    'client': 'fanyideskweb',
    'salt': '16619320623954',
    'sign': 'e0c54e9d51998ff92b84acd4b98421ae',
    'lts': '1661932062395',
    'bv': '50b61ff102560ebc7bb0148b22d7715c',
    'doctype': 'json',
    'version': '2.1',
    'keyfrom': 'fanyi.web',
    'action': 'FY_BY_REALTlME'
}

response = requests.post(url, headers=header, data=data).json()
print(response)

translate = response['translateResult'][0][0]
# print(translate)

print(f'单词%s的意思是%s' % (translate['tgt'], translate['src']))

在这里插入图片描述
当我门修改要翻译的单词时,就会报错
Python - JS逆向破解实现翻译软件_第1张图片
这是因为每次POST请求,所携带的data参数不同。重新进行抓包对比两次翻译中data参数的变化。
Python - JS逆向破解实现翻译软件_第2张图片
发现出现变化的有四处,这些值是通过js代码实现的,我们可以通过寻找这些值的生成法则来动态生成这四个值,来实现“翻译软件”

在这里插入图片描述
观察js调用栈,进入到js代码中。通过文档搜索的方式找到生成sign这四个键值对值的代码。并且打断点调试。

再次输入翻译发现卡到断点如下图的位置
Python - JS逆向破解实现翻译软件_第3张图片
可以估计,这里就是生成这四个键值对的值的代码

  • salt对应的是JS代码中的 salt
  • sign对应的是JS代码中的sign,它是通过md5方式进行加密
  • bv对应的是JS代码中的bv
  • lts对应的是JS代码中的ts

分析这段代码,根据调试信息可知

  • 变量e是输入的需要翻译的词
  • 变量i是一个13位时间戳+一个(0,10)的随机值
  • 变量t是当前浏览器版本再通过md5加密。(鼠标移动上可以看到值为"5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36"

这样根据上述分析写出动态生成这四个键值对的代码即可。

import requests
import time
import hashlib
import random

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

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 "
                  "Safari/537.36",
    "Cookie": "[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=1997833077.2695937; "
              "___rl__test__cookies=1661932062388",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Referer": "https://fanyi.youdao.com/"
}

while True:
    word = input("请输入要翻译的词汇:\n")

    trans = hashlib.md5()

    ts = str(int(time.time() * 1000))
    salt = ts + str(random.randint(0, 10))
    trans.update(
        '5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'.encode(
            'utf-8'))
    bv = trans.hexdigest()

    trans = hashlib.md5()  # 清空trans
    trans.update(("fanyideskweb" + word + salt + "Ygy_4c=r#e#4EX^NUGUc5").encode('utf-8'))
    sign = trans.hexdigest()

    data = {
        'i': word,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': salt,
        'sign': sign,
        'lts': ts,
        'bv': bv,
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME'
    }

    response = requests.post(url, headers=header, data=data).json()
    print(response)

    translate = response['translateResult'][0][0]
    # print(translate)

    print(f'%s的意思是%s' % (translate['tgt'], translate['src']))

Python - JS逆向破解实现翻译软件_第4张图片

你可能感兴趣的:(#,爬虫,javascript,python,前端)