# 准备
本文仅讲解某道的 js 逆向部分,json 逆向不进行讲解
网址:网址
# 开始
# 查找 api
进入首页,F12 打开检查页面,选择网络记录并选择 XHR 类
在翻译框中任意输入,即可看到抓取到两个 api, 如下
我们点开 keyapi 并查看其响应,如下
可以看到其并非翻译接口,接下来点开另一个 api 并查看其响应,如下
这个则是一堆密文,即是返回的翻译结果等进行了 json 加密
# 查找加密函数
我们查看其表单数据(即负载),如下
其中参数 i, 很明显就是输入的文字,此时我们再输入任意文字在翻译框中,经对比,可以发现仅有 sign 和 mysticTime 是变化的,
此时便在源代码中搜索 sign:,(加个冒号方便查找),最后找到一处
此处定义了一个 t 变量,用于获取时间戳,而 mysticTime 的返回值正是 t 变量,则判定 mysticTime 为时间戳,
sign 则是调用了一个方法 v,其中传入参数 t 和 e,t 我们知道了是时间戳,那么 e 呢?
那么我们便在 sign 处打上断点,再翻译一遍,可以发现程序此时停在了 sign 处,我们将鼠标放在 e 上,可以看到 e 的值是一个字符串
知道了 t 和 e, 那么我们就要看方法 v 是一个什么,将鼠标放在 v 上,即可看到方法位于哪里,如下
定位到 v 方法,如下
v 方法返回的是一个 g 方法处理过后的值,用同样的方法定位到方法 g,如下
可以清晰的看到是一个 MD5 加密
# 思路梳理
我们知道了表单中的参数 i 就是要翻译的文字,mysticTime 则是时间戳,sign 则是对拼接后的字符串进行 MD5 加密
# python 原理复现
# 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) |