有小伙伴和我反馈上次的那篇某云音乐评论的爬取js逆向难度挺大的,不太好理解,有没有简单点的案例,正好这几天了解到了一个简单的js逆向网站十分适合入门学习。如果对你有帮助的话记得点赞喔。
目标网站:
aHR0cDovL2ZhbnlpLnlvdWRhby5jb20v
目的:
实现翻译软件的翻译功能
目录:
1、环境
2、分析网站
3、功能实现
1、环境
Python3.7、requests、hashlib
2、分析网站
在翻译框内输入需要翻译的文本(这里以网络为例)
输入网络后右边的框内会出现对应的翻译结果,同时在Network会出现几个请求,第一个请求translate_o?smartresult=dict…直接翻译过来就是“翻译 智能的结果”结果是一个字典。进入第一个请求查看Preview,可以看到第一行的字典中包含了我们需要的结果
接下来就是分析这个请求的接口了
这个接口需要传入这些参数,这么多参数肯定有些的不变的,请求一次这个接口找出不变的和变了的参数,发现
可以发现参数salt、sign、ts是变化的,其他参数是不变的,其中salt是ts加了一位数,ts我估计就是时间戳了,加的那个数字估计是随机数,说那么多废话干嘛,直接开始找就行了,还估计什么呀。
按照之前的习惯先全局搜索关键字,这里搜sign
这里只有一个结果,太舒服了吧,进入这个js文件查看,是被压缩过的代码,正常格式化就好了,再在这个结果中查找sign(Ctrl + F)
这里有15个结果
在第5处发现一个疑似的,在这里打个断点(点击旁边的行数即可),继续往下翻
在第6处看到了一个md5加密的sign,这个大概就是了,打个断点。在文本框中输入“网络”看看这里的参数是什么样的
成功的在这里断住了,右侧框内也没有结果,看来这个请求没被发出去
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 + "mmbP%A-r6U3Nw(n]BjuEU")
}
};
分析这段代码的各个参数,e是输入的文本、t是将app版本进行了编码或加密、r是时间戳、i是r加一个0~10的随机数取整,ts对应的就是r、bv对应t、salt对应i、sign是将两端固定字符与e、i相加并进行md5加密。
3、功能实现
先不急着用python实现先观察哪些数值可以直接写死的,ts版本号、r加的那个随机数也可以写死(都是随机的,就固定为1把,反正识别不出来)
先实现md5的加密
def sign_md5(text, timestamp):
string = 'fanyideskweb' + text + f'{timestmp}1' + 'mmbP%A-r6U3Nw(n]BjuEU'
return hashlib.md5(string.encode('utf-8')).hexdigest()
参数text就是需要翻译的文本,timestmp为时间戳乘1000并取整
md5需要byte的格式,可以直接用utf-8的编码方式,也可以在参数前添加b来转换类型
hashlib.md5(b’123’) .hexdigest()
请求函数
这里要用post方法,没什么好说的,直接上代码吧
def get_page(url, data):
try:
response = requests.post(url=url, headers=headers, data=data)
if response.status_code == 200:
return response.json()
except requests.ConnectionError as e:
print('Error', e.args)
哦,对了这里的请求头还是要说一下的
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',
}
如果你只加一个ua是会出问题的
这里需要再添加Cookie、Referer
尽可能的去模拟ta的请求,ta有的参数我们也添加就好了
主函数
这个函数需要传入这全部的参数,最大程度的模拟真实请求。
def main():
need_translate_text = input('输入需要翻译的文本:')
timestamp = int(time.time() * 1000)
sign = sign_md5(text=need_translate_text, timestamp=timestamp)
data = {
'i': need_translate_text,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': f'{timestamp}1',
'sign': sign,
'ts': f'{timestamp}',
'bv': '07f15609aa4583527f9a1c22f48db662',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
result = get_page(url=url, data=data)
print(f"需要翻译的文本:{need_translate_text} n结果为:{result.get('translateResult')[0][0].get('tgt')}")
运行结果: