0%

有道翻译js逆向

对有道翻译进行的js逆向爬虫分析。

前言

js逆向第一战。

一、JS逆向是什么?

抓取网页端数据时,经常被加密参数、加密数据所困扰,获取不到想要的数据。这个时候需要根据JavaScript的代码逆向进行解决问题。

二、分析和编写代码

1.分析

地址:有道翻译
在输入框内输入英文,抓包工具中新增一个接口:

显而易见,这就是我们想要的数据,那么我们来看看请求头。

对比多个请求头的参数后发现,salt,sign,和lts是一直动态变化的,我们去搜索一下sign在js文件中出现的位置,并初步排除一下代码段。

搜到一条结果,格式化一下,再在其中搜索sign:

有十五个值,我们根据特征逐条查看一下,找到了其中的关键片段:

这里可以很清楚的看到:

  • 调用了工具md5加密
  • (new Date).getTime() 时间戳
  • parseInt(10 * Math.random(), 10) 10以内的随机数
  • n.md5(“fanyideskweb” + e + i + “Tbh5E8=q6U3EXe+&L[4c@”) 拼接字符串后,进行md5加密
    于是,打断点进行测试,注意在语句运行之后打断点:

    于是这里的e就是我们输入的英文字符串,r是时间戳,i是时间戳后加一个随机数,对应关系为:
  • ts: r
  • salt: i
  • sign: 拼接并加密后的e
    与我们的请求头对应上了,接下来我们只需要在python中模仿其做出相同的操作即可。

2.编写代码

代码如下:

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
import requests
import random
import hashlib
import time


class TranslationSpider:
def __init__(self, word):
# 先请求基本页面再请求接口,session中会存在对应的cookie等参数
self.base_url = 'http://fanyi.youdao.com/?keyfrom=fanyi-new.logo'
# 接口地址
self.url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
# 初始化session
self.session = requests.session()
# 初始化伪装头
self.headers = {
'Referer': 'http://fanyi.youdao.com/',
'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 Edg/87.0.664.66 '
}
# 初始化参数
self.word = word
self.data = {}

def generator_data(self):
# 获得时间戳
ts = str(int(time.time() * 1000))
# 时间戳加随机数
salt = ts + str(random.randint(0, 10))
# md5加密
sign = "fanyideskweb" + self.word + salt + "Tbh5E8=q6U3EXe+&L[4c@"
md5 = hashlib.md5()
md5.update(sign.encode())
sign = md5.hexdigest()
# post请求的参数
self.data = {
"i": self.word,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": salt,
"sign": sign,
"lts": ts,
"bv": "b286f0a34340b928819a6f64492585e8",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME"
}

def get_request(self):
# 请求初始界面
self.session.get(url=self.base_url, headers=self.headers)
# 再请求接口地址 并返回json
response = self.session.post(url=self.url, data=self.data, headers=self.headers).json()
return response

def parse_json(self, json):
# 解析传过来的json数据
tgt = json['translateResult'][0][0]['tgt']
entries = json['smartResult']['entries']
print('英文{}翻译结果为:{}'.format(self.word, tgt))
print(''.join(entries))

def run(self):
# 调用封装好的方法
self.generator_data()
self.parse_json(self.get_request())


if __name__ == '__main__':
# 循环翻译
while True:
w = input('输入需要翻译的英文:')
# 输入exit0退出
if w == 'exit0':
print('退出成功!')
break
# new一个对象
spider = TranslationSpider(w)
# 运行
spider.run()

总结

第一个js逆向的项目结束,以后再见。

本文标题:有道翻译js逆向

文章作者:fanchen

发布时间:2021年01月16日 - 15:08:17

最后更新:2021年02月05日 - 18:00:22

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

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