有道翻译-JS逆向-api调⽤
简单⽅法 —调⽤开源api
这个⽐较简单四⾏代码就可以搞定,先放代码:
1import requests
2while True:
3    input_data = input('请输⼊你要翻译的数据:')
('udao/translate',params={'doctype':'json',"type":'AUTO','i':input_data}).json()['translateResult'][0][0]['tgt'])
复杂⼀丢丢的JS解析
打开有道翻译官⽹,输⼊翻译的数据,⿏标右键检查,点击network,再点击翻译,
点第⼀个数据包,然后点击preview 或者response都能看到翻译结果,证明这个就是我们需要解析的数据包
重新回到headers⾥,往下拉到form表单:
我们需要分析这些数据的变化及加密⽅式,
复制⼀份:
i: 历史
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16035204521008
sign: 7a1413f07087cacc38aed4fac47fd403
lts: 1603520452100
bv: 4abf2733c66fbf953861095a23a839a8
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION
再如法翻译⼀个数据,复制form表单和上⾯的⽐较:
i: ⽂化
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 16035228374568
sign: 62eeb0e657b2d71181d6c87be026bbac
lts: 1603522837456
bv: 4abf2733c66fbf953861095a23a839a8
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_CLICKBUTTION
⽐较得出,动态变化的数据只有四个:
1. i :即我们要翻译的数据
2. salt : 初步推测是以毫秒为单位的时间戳 + ⼀个随机数字
3. sign :未知的js加密后的数据
4. lts : 以毫秒为单位的时间戳
下⾯简单介绍⼀些常⽤的加密解密⽅法
常见的加密⽅法
MD5加密
MD5 是⼀种单向加密技术(不可逆向解密)。MD5加密算法简单⾼效且算出的值长度都是固定的, MD5值具有强抗碰撞,对原⽂件哪怕只修改⼀个字符,所计算出的MD5值也会发⽣很⼤变化。基于这些特性,MD5在数据校验上发挥有很⼤作⽤。
在python3中的使⽤:
1import hashlib
2
3 a = 'hello!'
4 b = 'abc'
5 m1 = hashlib.de()).hexdigest()
6 m2 = hashlib.de()).hexdigest()
7print(m1)  #aed978dd6dffef14c3188d28cf0a272d
8print(m2)  #900150983cd24fb0d6963f7d28e17f72
base64加密
base64编码⽅法简单,但是却并不保险,别⼈很容易就能获取原始数据,通常是⽤来对⽂件进⾏⼀种格式化的操作,它是⼀种双向加密(可以逆向解密).
⽤法如下:
1import base64
2
3 a = '123'
4 b = '123456789'
5
6# base64加密
7 base_a = base64.de()).decode()
8 base_b = base64.de()).decode()
9print(base_a) # MTIz
10print(base_b) # MTIzNDU2Nzg5
11
12# base64解密
13 aa = base64.b64decode('MTIz'.encode()).decode()
14 bb = base64.b64decode('MTIzNDU2Nzg5'.encode()).decode()
15print(aa) # 123
16print(bb) # 123456789
HAMC 加密
hamc 同样是基于hash算法,与上⾯两个加密不同的是,hamc加密是以⼀个密钥和⼀个消息作为输⼊,⽣成⼀个消息摘要输出,主要⽤于⾝份验证。
⽤法:
1import hmac,hashlib
2 h = w(key='key'.encode(),msg='hello'.encode())
3 h.update('world!'.encode())
4 ret = h.hexdigest()
5print(ret) # 774bd7473ce15ec74c015338cbf2d421
回归正题,⽬前⼤概只有⼀个sign不确定和那个加盐操作是不是加的随机数,接下来我们就需要具体分析⽹页了:
是四个部分⽤来做加密的参数
1 . “fanyideskweb”
2 .e : 要被翻译的数据
js代码加密软件3 .salt : 毫秒为单位的时间戳 + 随机数字⼀个
4 . “]BjuETDhU)zqSxf-=B#7m”
⾄此,所有的参数解密完毕,可以开始编写代码了,具体参考代码如下:
1import requests  # 发送⽹络请求
2import time  # 导⼊时间戳
3import random  # 需要产⽣随机数进⾏加盐
4import hashlib  # 需要⽤到md5加密
5import jsonpath  # 解析json格式数据
6
7# 函数的封装>>> 调⽤函数就能够得到翻译过后的数据
8def youdao():
9while True:
10# 确认⽬标的url
11        url_ = 'udao/translate_o'
12# 设置form表单的参数
13        input_data = input('请输⼊你要翻译的数据:')  # 要被翻译的数据
14
15        time_ = str(int(time.time() * 1000))  # 以毫秒为单位的时间戳
16
17        time_salt = time_ + str(random.randint(0, 10))  # salt加盐操作以毫秒为单位的时间戳 + 随机数字
18
19# 拼接字符串进⾏md5加密,⽣成sign值
20        a = "fanyideskweb" + input_data + time_salt + "Tbh5E8=q6U3EXe+&L[4c@"
21        sign = hashlib.de()).hexdigest()
22
23# 设置请求头⽤户代理, referer跳转, cookie
24        headers = {
25'Proxy-Connection': 'keep-alive',
26'Accept': 'application/json, text/javascript, */*; q=0.01',
27'X-Requested-With': 'XMLHttpRequest',
28'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36', 29'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
30'Origin': 'udao',
31'Referer': 'udao/',
32'Accept-Language': 'zh-CN,zh;q=0.9',
33        }
34# cookie设置
35        cookies = {
36'OUTFOX_SEARCH_USER_ID': '1994915372@10.108.160.100',
37'OUTFOX_SEARCH_USER_ID_NCOO': '1497055759.2731764',
38'JSESSIONID': 'aaa3M3QefQXLQe8TkbwEx',
39'___rl__test__cookies': time_,
40        }
41
42        params = (
43            ('smartresult', ['dict', 'rule']),
44        )
45
46
47# 发送post请求要携带的表单数据
48        form_data = {
49"i": input_data,  # 要被翻译的数据
50"from": "AUTO",
51"to": "AUTO",
52"smartresult": "dict",
53"client": "fanyideskweb",
54"salt": time_salt,  # 以毫秒为单位的时间戳 + 随机数字
55"sign": sign,  # 未知的js加密后的数据
56"lts": time_,  # 以毫秒为单位的时间戳
57"bv": "4abf2733c66fbf953861095a23a839a8",
58"doctype": "json",
59"version": "2.1",
60"keyfrom": "fanyi.web",
61"action": "FY_BY_REALTlME",
62        }
63try:
64# 利⽤requests发送post请求,得到响应对象
65            response_ =requests.post(url=url_, headers=headers, params=params, cookies=cookies, data=form_data, verify=False) 66
67# 得到响应对象,数据为json格式数据
68            py_data = response_.json()  # 直接转成python数据类型
69
70# 利⽤jsonpath解析,得到翻译数据
71            res_ = jsonpath.jsonpath(py_data,'$..tgt')[0]
72
73print(res_)
74except:
75print('请出⼊正确格式的数据:')
76continue
77        time.sleep(1)  # 降低请求频率避免被封禁IP
78
79if__name__ == '__main__':
80    youdao()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。