0%

百度翻译js逆向

对百度翻译的js逆向爬虫分析。

前言

在有道翻译的基础上对百度翻译进行js逆向
以下是本篇文章正文内容,下面案例可供参考

一、分析接口

在输入框输入英文,在自带的抓包工具中可以看到有一个新的异步请求:

可以看到这里是需要cookie和token的:


进行全局搜索sign:

可以看到这里就是我们传进去的参数,我们进行格式化,并找到相应的语句打断点:

可以看到n就是我们输入的数据,token是根据 window.common.token生成的,simple_means_flag始终为 3,transtype始终为realtime。
我们最后解决一下sign生成的问题,看一下生成的函数:

可以看到函数很长,我们使用python进行模拟的话,工作量是很大的,于是使用第三方库直接编译js,并分析函数过程中需要哪些值,要传哪些参数。
运行中发现缺少i的值,是不变的,于是补齐:

又发现有一个函数n没有定义:

定位到n所在的位置,就在函数e的上方,并在js文件中补齐:

到此分析已经结束,接下来进行代码的编写。

二、代码编写

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
import requests
import execjs


# 模仿JavaScript生成sign参数
def get_sign(word):
# 打开js文件
with open('test.js', 'r', encoding='utf8') as js:
js_code = js.read()
# 运行 js 文件
sign = execjs.compile(js_code).call('e', word)
# 返回参数
return sign


# 请求百度翻译接口
def request(word):
# 中英文识别
if word[0] in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']:
f = 'en'
t = 'zh'
else:
f = 'zh'
t = 'en'
# 获取sign
sign = get_sign(word)
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
# 伪装头
headers = {
'cookie': '你的cookie',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/87.0.4280.141 Safari/537.36 Edg/87.0.664.75 '
}
# post提交的参数
formData = {
'from': f,
'to': t,
'query': word,
'transtype': 'realtime',
'simple_means_flag': '3',
'sign': sign,
'token': '你的token',
'domain': 'common'
}
# 请求 并转json
response = requests.post(url=url, headers=headers, data=formData).json()
# json数据分析
if response.get('liju_result').get('tag'):
print(', '.join(response.get('liju_result').get('tag')))
if response.get('trans_result').get('data'):
for d in response.get('trans_result').get('data'):
print(d['dst'])


if __name__ == '__main__':
while True:
word = input('请输入需要翻译的英文(中文):')
if word == 'exit0':
break
request(word)

下面是JavaScript代码:

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
function e(r) {
var i = '320305.131321201'
var o = r.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
if (null === o) {
var t = r.length;
t > 30 && (r = "" + r.substr(0, 10) + r.substr(Math.floor(t / 2) - 5, 10) + r.substr(-10, 10))
} else {
for (var e = r.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), C = 0, h = e.length, f = []; h > C; C++)
"" !== e[C] && f.push.apply(f, a(e[C].split(""))),
C !== h - 1 && f.push(o[C]);
var g = f.length;
g > 30 && (r = f.slice(0, 10).join("") + f.slice(Math.floor(g / 2) - 5, Math.floor(g / 2) + 5).join("") + f.slice(-10).join(""))
}
var u = void 0
, l = "" + String.fromCharCode(103) + String.fromCharCode(116) + String.fromCharCode(107);
u = null !== i ? i : (i = window[l] || "") || "";
for (var d = u.split("."), m = Number(d[0]) || 0, s = Number(d[1]) || 0, S = [], c = 0, v = 0; v < r.length; v++) {
var A = r.charCodeAt(v);
128 > A ? S[c++] = A : (2048 > A ? S[c++] = A >> 6 | 192 : (55296 === (64512 & A) && v + 1 < r.length && 56320 === (64512 & r.charCodeAt(v + 1)) ? (A = 65536 + ((1023 & A) << 10) + (1023 & r.charCodeAt(++v)),
S[c++] = A >> 18 | 240,
S[c++] = A >> 12 & 63 | 128) : S[c++] = A >> 12 | 224,
S[c++] = A >> 6 & 63 | 128),
S[c++] = 63 & A | 128)
}
for (var p = m, F = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(97) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(54)), D = "" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(51) + ("" + String.fromCharCode(94) + String.fromCharCode(43) + String.fromCharCode(98)) + ("" + String.fromCharCode(43) + String.fromCharCode(45) + String.fromCharCode(102)), b = 0; b < S.length; b++)
p += S[b],
p = n(p, F);
return p = n(p, D),
p ^= s,
0 > p && (p = (2147483647 & p) + 2147483648),
p %= 1e6,
p.toString() + "." + (p ^ m)
}


function n(r, o) {
for (var t = 0; t < o.length - 2; t += 3) {
var a = o.charAt(t + 2);
a = a >= "a" ? a.charCodeAt(0) - 87 : Number(a),
a = "+" === o.charAt(t + 1) ? r >>> a : r << a,
r = "+" === o.charAt(t) ? r + a & 4294967295 : r ^ a
}
return r
}

运行结果

本文标题:百度翻译js逆向

文章作者:fanchen

发布时间:2021年01月16日 - 15:05:37

最后更新:2021年02月05日 - 17:56:50

原始链接:http://88fanchen.github.io/posts/c39daa58/

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