asxe
asxe

# 准备

本文仅讲解某道的 js 逆向部分,json 逆向不进行讲解

网址:网址

# 开始

# 查找 api

进入首页,F12 打开检查页面,选择网络记录并选择 XHR
在翻译框中任意输入,即可看到抓取到两个 api, 如下
1.png
我们点开 keyapi 并查看其响应,如下
2.png
可以看到其并非翻译接口,接下来点开另一个 api 并查看其响应,如下
3.png
这个则是一堆密文,即是返回的翻译结果等进行了 json 加密

# 查找加密函数

我们查看其表单数据(即负载),如下
4.png
其中参数 i, 很明显就是输入的文字,此时我们再输入任意文字在翻译框中,经对比,可以发现仅有 sign mysticTime 是变化的,
此时便在源代码中搜索 sign:,(加个冒号方便查找),最后找到一处
5.png
此处定义了一个 t 变量,用于获取时间戳,而 mysticTime 的返回值正是 t 变量,则判定 mysticTime 为时间戳,
sign 则是调用了一个方法 v,其中传入参数 t e,t 我们知道了是时间戳,那么 e 呢?
那么我们便在 sign 处打上断点,再翻译一遍,可以发现程序此时停在了 sign 处,我们将鼠标放在 e 上,可以看到 e 的值是一个字符串
6.png

知道了 t e, 那么我们就要看方法 v 是一个什么,将鼠标放在 v 上,即可看到方法位于哪里,如下
7.png
定位到 v 方法,如下
8.png
v 方法返回的是一个 g 方法处理过后的值,用同样的方法定位到方法 g,如下
9.png
可以清晰的看到是一个 MD5 加密

# 思路梳理

我们知道了表单中的参数 i 就是要翻译的文字,mysticTime 则是时间戳,sign 则是对拼接后的字符串进行 MD5 加密

# python 原理复现

# MD5 加密

md5加密
def md5(self,value):
        md = hashlib.md5()
        md.update(value.encode())
        return md.hexdigest()

# 时间戳

时间戳
time_get=str(int(time.time())*1000)

# 完整代码

完整代码
#此代码仅返回加密的 json,若需看到明文,还需要进行 json 逆向,本文不予解释
import requests
import hashlib
import time
class Spider:
    def __init__(self):
        self.headers={
            'Cookie':'[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=972176560.743925; _ga=GA1.2.1317022467.1665466107; UM_distinctid=184aa25fe24a7b-0ff2966cce682a-7d5d5471-144000-184aa25fe2514e1; DICT_UGC=be3af0da19b5c5e6aa4e17bd8d90b28a|; JSESSIONID=abcIJ43UT_s_Q5TofIUwy',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.76',
            'Referer':'https://fanyi.youdao.com/'
        }
        self.url='https://dict.youdao.com/webtranslate'
    def md5(self,value):
        md = hashlib.md5()
        md.update(value.encode())
        return md.hexdigest()
    def spider(self,text):
        time_get=str(int(time.time()))
        sign=self.md5(f"client=fanyideskweb&mysticTime={time_get}&product=webfanyi&key=fsdsogkndfokasodnaso")
        data = {
            "i":text,
            "from": "auto",
            "to":"auto",
            "domain":"0",
            "dictResult":"true",
            "keyid":"webfanyi",
            "sign": sign,
            "client": "fanyideskweb",
            "product":"webfanyi",
            "appVersion":"1.0.0",
            "vendor":"web",
            "pointParam":"client,mysticTime,product",
            "mysticTime":time_get,
            "keyfrom":"fanyi.web"
        }
        response=requests.post(self.url,data=data,headers=self.headers,verify=False)
        print(response.text)
if __name__=='__main__':
    while True:
        get_text=input('请输入文字:')
        Spider().spider(get_text)