逆向有道翻译接口练习
网址https://fanyi.youdao.com/index.html#/
任意请求后发现,不需要刷新页面就会出现翻译,所以是AJAX请求

POST请求,依次排查data中内容
i:输入的内容(待翻译的)
from:翻译语言(自动)
to:目标语言
sign会变得值
keyid:翻译元素
固定值不用去看,所以去搜索可变项
ctrl shift f 搜索sign

定位元素位置

发现请求内容

下断点测试一下,发现数据相同
sign是由e方法生成

发现加密,这样因为e值不变(根据多次断点值不变),t是时间戳也不变,所以我们判断h函数就行,h函数是进行几次md5加密的,所以直接判断

逐步排查,发现decode函数,直接搜索

发现是个固定值,但有解密必定有传参,我再往前推
看代码,往下滑发现

途中上面存再aes,说明是AES加密,所以判断A,C,V三个值

往回搜,V值为MD5加密

代码
import requests,base64
from Crypto.Cipher import AES
import time
import hashlib
 
 
def get_sign():
    d = 'fanyideskweb'
    ee = 'fsdsogkndfokasodnaso'
    u = 'webfanyi'
    ti = str(int(time.time()*1000))
 
    def g(e):
        return hashlib.md5(e.encode("utf-8")).hexdigest()
 
    def h(e, t):
        md5_str = f'client={d}&mysticTime={e}&product={u}&key={t}'
        return g(md5_str)
    return h(ti, ee)
 
 
data = {
    'i': input("输入想要翻译的词语或者句子:"),
    'from': 'auto',
    'to': '',
    'dictResult': True,
    'keyid': 'webfanyi',
    'sign': get_sign(),
    'client': 'fanyideskweb',
    'product': 'webfanyi',
    'appVersion': '1.0.0',
    'vendor': 'web',
    'pointParam': 'client,mysticTime,product',
    'mysticTime': str(int(time.time()*1000)),
    'keyfrom': 'fanyi.web'
}
headers = {
    'Cookie': 'OUTFOX_SEARCH_USER_ID=-197651357@10.112.57.88; OUTFOX_SEARCH_USER_ID_NCOO=2126674871.429606',
    'Host': 'dict.youdao.com',
    'Origin': 'https://fanyi.youdao.com',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36',
    'Referer': 'https://fanyi.youdao.com/',
}
url = 'https://dict.youdao.com/webtranslate'
response = requests.post(url, data=data, headers=headers).text
#   偏移量  
decodeiv = "ydsecret://query/iv/C@lZe2YzHtZ2CYgaXKSVfsb7Y4QWHjITPPZ0nQp87fBeJ!Iv6v^6fvi2WN@bYpJ4"
# 秘钥
decodekey = "ydsecret://query/key/B*RGygVywfNBwpmBaZg*WT7SIOUP2T0C9WHMZN39j^DAdaZhAnxvGcCY6VYFwnHl"
# 在本案例中,先是对两个参数进行了参数加密                  
key = hashlib.md5(decodekey.encode(encoding='utf-8')).digest()
iv = hashlib.md5(decodeiv.encode(encoding='utf-8')).digest()
# AES解密
aes_en = AES.new(key, AES.MODE_CBC, iv)
# 将已经加密的数据放进该方法
data_new = base64.urlsafe_b64decode(response)
# 参数准备完毕后,进行解密
result = aes_en.decrypt(data_new).decode('utf8')
print(result)
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号