逆向有道翻译接口练习

网址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)

 

posted @ 2023-07-06 15:57  墨柠C  阅读(233)  评论(0)    收藏  举报