目录
(一)课题目的
(二)遇到的障碍
(三)障碍分析
(四)找到js
(五)在js中找到改变salt,sign,ts的函数
(六)找到数据来源
(七)python实现相同逻辑
自己实现在pycharm中输入每一个单词都能查询到翻译内容
我们通常会拿到翻译接口,将Form Data的数据提交过去就能拿到翻译结果,因为Form Data中会有我们输入的查询单词,只要我们在python中用变量接收输入值放到字典里,再将字典传输到翻译接口就行了。但是我们发现,我们只能查到mode单词的意思,其他单词都会报错,为什么呢?
首先,有道翻译接口不会错,那么就是我们Form Data的问题了。会不会每个单词的Form Data除了除了第一个键值对还有不一样的呢?(会)。因为我们拿到了mode单词的Form Data放到了代码里,只是将i:mode这里的mode改成了动态获取所查询单词,其他键值都没改动过,那么其他键值动态的来源是谁?
我们首先尝试搜索三个单词,对应三个单词的Form Data发现,salt,sign,ts也是会动态改变的。见下图
既然不是用户动态输入,那就是js了,那么js在哪? 是怎么改变他们的呢?
找网站的js文件双击打开,复制粘贴后在线格式化,再复制到pycharm里就好了
怎么找呢?
在复制到pycharm后按ctrl+f查找salt。
为什么查找salt呢?
headers中的数据来源于客户端,目的地是服务器,所以headers中的数据要么是用户输入的值,要么是js自己或根据用户输入产生的动态值,js生成的数据会用变量接收,Form Data中的键名一般会(99.99%)与js中的变量名一致,因为是同一个人开发的这一模块。我们根据salt,sign,ts到js文件中按住ctrl+f查找找就能找到相应的功能函数,找到了就可以发现他们三个键的值是怎么生成的了,我们再用python实现js同样的功能就好了。
在js代码中按ctrl+f查找salt找到下面代码块(可能有多个salt,按照理解分析找到对的地方)。
图中的e是以参数传进来的,我们要找他可以ctrl+f查询谁调用了这个r函数,就能得到参数e是啥了,即:查询r(e)或 = r( ,没错就是等号和单括号。 我找到的结果是:e就是我们输入的查询单词mode
最后一行给定了两个字符串,并且将e和i放进去一起进行md5加密
实现五处动态:
第五处:不输入单词时是233,输入单词会动态变化
代码实现js相同逻辑:
import requests
import time
import random
# 生成md5字符串
def getMd5(value):
import hashlib
md5 = hashlib.md5()
md5.update(bytes(value, encoding='Utf-8'))
md5_str = md5.hexdigest()
return md5_str
if __name__ == '__main__':
#输入单词
keyword = input('翻译的单词:')
#生成salt的值
r = str(int(time.time()*1000))
salt = r + str(int(random.random()*10))
#生成sign
value = "fanyideskweb" + keyword + salt + "@6f#X3=cCuncYssPsuRUE"
md5_str = getMd5(value)
#生成header
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9,und;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Content-Length': str(233+len(keyword)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '[email protected]; OUTFOX_SEARCH_USER_ID_NCOO=6241167.578427844; _ga=GA1.2.1519057173.1535511777; JSESSIONID=aaamFTGK4qLCf4uKcrxPw; ___rl__test__cookies=1556242390777',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
#生成表单数据
data_dic = {
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': md5_str,
'ts': r,
'bv': 'ae62d2e2541901f6ebf99ec18e429e3f',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME'
}
#接口地址
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
#发起网络请求
response = requests.post(url=url,data=data_dic,headers=headers)
print(response.text)