天天看点

【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译

有时间了打算把有道、百度、Google翻译都搞一遍,

今天先试水有道翻译

打开地址:

http://fanyi.youdao.com/

一. js逆向分析

打开Chrome调试工具,然后随意输入一段文字,查看抓包结果。

【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译
  • 发现是 post 请求
    【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译
Request URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
  • Form data 参数每次请求
    【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译

salt: 15584215877008

sign: 6ef278e78eca2affa23720a79c738d33

ts: 1558421587700

bv: a4da7fd2fcb0c879a8b1e37b497afb19

  • 观察参数
    • sign 参数每次请求都会变化
    • ts 参数是时间戳无疑
    • salt
    • bv

      看不出来其它信息,我们可以全局搜索一下不明所以的参数,这里先搜 sign

      【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译
      然后我们发现了 了不得 的东西
      【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译
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 + "@6f#X3=cCuncYssPsuRUE")
        }
    };
           

可以看出来:

ts 参数是通过 r = “” + (new Date).getTime() 生成; 也就是获取了当前的时间戳

bv参数是通过 t = n.md5(navigator.appVersion) 生成; 也就是 navigator.appVersion 的 MD5 加密

salt参数是通过 i = r + parseInt(10 * Math.random(), 10) 生成 即在 r(就是ts)的基础上在最后一位随机加上一个整数

sign参数是通过 md5(“fanyideskweb” + e + i + “@6f#X3=cCuncYssPsuRUE”)生成

这里面就此不知道是什么的有 :e, navigator.appVersion

  • 接下来打断点查看一下是啥?
    【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译
    可以看出:

e 是输入的文字

navigator.appVersion 是 user-agent

有道翻译的加密过程也就这样了,还是比较简单的。

二. python 编译

1. MD5

python 有一个 hashlib 库, 用来 md5 加密

import hashlib

def MD5(key):
    hash = hashlib.md5()
    hash.update(key.encode('utf-8'))
    return hash.hexdigest()

s = MD5('1324')
           
【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译

2. 结果展示

    1. 英文 -> 中文
      【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译
    1. 中文 -> 英文
  • 【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译

3. 代码

#!/usr/bin/env python
# encoding: utf-8
# @software: PyCharm
# @time: 2019/5/21 15:38
# @author: Paulson●Wier
# @file: youdao_fanyi.py
# @desc:
import random

import requests
import time
import hashlib


def md5_b(key):
    m = hashlib.md5()
    m.update(key.encode('utf-8'))
    return m.hexdigest()


def sign_b(key, salt):
    sign = 'fanyideskweb' + key + str(salt) + '@6f#X3=cCuncYssPsuRUE'
    return md5_b(sign)


def translate(key):
    url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    salt = str(int(time.time()*1000) + random.randint(0, 10))
    data = {
        "i": key,
        "from": "AUTO",
        "to": "AUTO",
        "smartresult": "dict",
        "client": "fanyideskweb",
        "ts": salt[:-1],
        "salt": salt,
        "sign": sign_b(key, salt),
        "bv": md5_b("5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                    "(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"),
        "doctype": "json",
        "version": "2.1",
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTIME',
        # 'typoResult': 'false'
    }

    headers = {
        'Accept': 'application/json, text/javascript, */*; q=0.01',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
        'Connection': 'keep-alive',
        "Content-Length": "272",
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': '[email protected]; JSESSIONID=aaa4S2JviOjAFe8LvizRw; '
                  'OUTFOX_SEARCH_USER_ID_NCOO=2146618943.795375; ___rl__test__cookies=1558425516486',
        '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/74.0.3729.157 Safari/537.36',
        'X-Requested-With': 'XMLHttpRequest'
    }

    res = requests.post(url, data=data, headers=headers).json()
    # print(res)

    result = res['translateResult'][0][0]
    result_tgt = result['tgt']
    result_src = result['src']

    print(f"""‘{result_src}’,的翻译是: ‘{result_tgt}’""")

    try:
        #  有时返回数据中会有其他翻译的,如果有的话,就打印出来。
        print('其它翻译:\n'+''.join(res['smartResult']['entries']))
    except KeyError:
        pass


if __name__ == '__main__':
    translate("You are such a smart kid!")
    # translate("你可真是个小机灵鬼!")

           

关注,star,点赞,谢谢~

点击前往Github(有道、百度、谷歌google 翻译JS逆向破解参数项目地址)

【2019.05】JS逆向——破解有道翻译参数(sign)爬虫 超级详细一. js逆向分析二. python 编译