破解有道翻译js加密参数

分析页面

首先进行一次正常的翻译操作,F12 打开开发者工具,点击 Network 标签,点击翻译按钮,可以看到下面第一条请求,点击进去查看。

这条请求的方式是 POST,其 Form Data 参数如下所示,其中可能加密的参数有 salt, sign, ts, bv 这四个参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
i: 你好
from: AUTO
to: AUTO
smartresult: dict
client: fanyideskweb
salt: 15483221921975
sign: 3d70a5b668a2edc0c8651848e99ec40d
ts: 1548322192197
bv: 7f2901ed530536104d65f4d3f630826a
doctype: json
version: 2.1
keyfrom: fanyi.web
action: FY_BY_REALTIME
typoResult: false

分析 js 文件

通过查看网站源文件,发现其加密参数被放在了 fanyi.min.js 文件中,由于 js 代码被压缩过,因此需要先把代码进行格式化,点击左下角的 {} 就可以把代码格式化。

格式化后如下图所示,看着舒服多了。

按照关键词 salt 和 sign 搜索它们出现在代码中的位置,可以看到下图。

可以看到,参数中的 ts, bv, salt 和 sign 参数都在这里了,这里先打一个断点看下结果。

其实在这里就已经大致能知道各个参数的加密过程了,加密过程在上图中有解释,不再过多介绍。唯一不明显的就是这个 appVersion ,其实它也是个固定值,是跟着浏览器的 User-Agent 变动的,鼠标放置在 navigator 上面,出现了 navigator 的属性框,其中第三行就是 appVersion, bv 值其实就是将 appVersion 加密后的值。

模拟加密过程

salt 参数

1
2
3
4
5
6
7
def get_salt():

import time,random

salt = int(time.time()*1000)+random.randint(0,10)

return salt

sign 参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def get_md5(v):

import hashlib

md5 = hashlib.md5()

md5.update(v.encode('utf-8'))

value = md5.hexdigest()

return value

def get_sign(key,salt):

sign = 'fanyideskweb' + key + str(salt) + 'p09@Bn{h02_BIEe]$P^nG'

sign = get_md5(sign)

return sign

ts 参数

1
2
3
4
5
6
7
def getts():

import time

ts = int(time.time() * 1000)

return ts

bv 参数

1
2
3
4
5
6
7
8
9
10
11
def getbv(self):

appVersion = '5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'

md5 = hashlib.md5()

md5.update(appVersion.encode('utf-8'))

bv = md5.hexdigest()

return bv

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import hashlib
import random
import time
import requests
from urllib.parse import urlencode


class YoudaoFanyi(object):

def __init__(self, key):
self.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=true'
self.key = key

def getSalt(self):
"""
获取 salt 参数
:return: salt 参数
"""
salt = int(time.time() * 1000) + random.randint(0, 10)

return salt

def getMD5(self, v):
"""
加密值
:param v: 将加密的值
:return: 加密后的值
"""
md5 = hashlib.md5()

md5.update(v.encode('utf-8'))

sign = md5.hexdigest()

return sign

def getSign(self, salt):
"""
获取 sign 参数
:param salt: salt
:return: sign 参数
"""
sign = "fanyideskweb" + self.key + str(salt) + 'p09@Bn{h02_BIEe]$P^nG'

sign = self.getMD5(sign)

return sign

def getbv(self):
"""
获取 bv 参数
:return: bv 参数
"""
appVersion = '5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'

md5 = hashlib.md5()

md5.update(appVersion.encode('utf-8'))

bv = md5.hexdigest()

return bv

def getts(self):
"""
获取 ts 参数
:return: ts 参数
"""
ts = int(time.time() * 1000)

return ts

def main(self):

salt = self.getSalt()

data = {
'i': self.key,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': str(salt),
'sign': self.getSign(salt),
'ts': self.getts(),
'bv': self.getbv(),
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
'typoResult': 'false'
}

data = urlencode(data).encode()

headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Content-Length": str(len(data)),
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "ANTICSRF=cleared; P_INFO=xiezhengwei2008; NTES_OSESS=cleared; S_OINFO=; OUTFOX_SEARCH_USER_ID=1515915441@10.168.8.61; JSESSIONID=aaaAAT3WmCOQ6-0Zne_Hw; OUTFOX_SEARCH_USER_ID_NCOO=1910496961.1878116; ___rl__test__cookies=1548303281445",
"Host": "fanyi.youdao.com",
"Origin": "http://fanyi.youdao.com",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}

response = requests.post(self.url, data=data, headers=headers)

if response.status_code == 200:

result = response.json().get('translateResult')[0][0].get('tgt')

print('Translation result: %s' % result)


if __name__ == '__main__':
while True:
word = input("Please enter the word you want to translate:")
if word == 'quit':
break
youdao = YoudaoFanyi(word)
youdao.main()

运行效果

-------------本文结束感谢您的阅读-------------

本文标题:破解有道翻译js加密参数

文章作者:Tang

发布时间:2019年01月24日 - 17:01

最后更新:2019年01月24日 - 18:01

原始链接:https://tangx1.com/youdao/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%