1、实现的功能
2、实现步骤
(1)、获取接口
登录有道翻译 ,获取请求地址:Requests url ,REquest headers,
Form data (表单数据)
(2)、编写程序
import requests
keyword = input("请输入需要翻译的单词:")
data_list={
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15562423019590',
'sign':'66954fe3efeb3ec6df29bbdb5714c7468' ,
'ts':'1556242301959',
'bv': '327689fccf65d35fd25955c1807f5d2d',
'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)
print(response.text)
3、此时服务器会返回一个错误
{"errorCode":50}
说明肯定是有什么地方是不一样的,光加data是不行的,还需要加headers
那该怎么办呢?
解决办法如下:需要加上头请求
4、寻找请求头有什么不同,以job为例,分别输入 j 、jo、 job来进行比较
通过对比,可以发现规律:content-length = 233+要翻译单词的长度
5、修改代码
import requests
keyword=input('请输入要翻译的单词:')
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'Content-Length': str(233+len(keyword)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-470656831@10.168.8.76; JSESSIONID=aaaT594x_2P98-gLurxPw; OUTFOX_SEARCH_USER_ID_NCOO=661300740.1028955; ___rl__test__cookies=1556242425186',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
data_dic = {
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15562424251945',
'sign': '8a649f0ce7088b3f64b3ef6c4a63732c',
'ts': '1556242425194',
'bv': '5933be86204903bb334bf023bf3eb5ed',
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTlME',
}
response = requests.post(url=url, data=data_dic,headers=headers)
print(response.text)
测试:手动输入需要翻译的单词后,会发现发现只有写好的job单词可以翻译,其他的单词都不能被翻译出来还会出现错误。
经过分析,此时只有输入的内容有些不一样,所以是Form Data哪里有问题,
继续分析表单数据
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。
import time
t = time.time() # 1556345652.0227659
t = int(t*1000) # 1556345786259
print(t)
时间戳是随着前端自动变化的,可以实现的就是js,所以我们要找到js文件
7、查找前端的js文件
分析js文件,寻找(salt,ts,sign),经分析比对发现在fanyi.min.js中
为了方便好看,将js文件转换一下,通过现在代码格式化
将代码复制到fanyi,js
在里面查找 salt,
function(e, t) {
var n = e("./jquery-1.7");
e("./utils");
e("./md5");
var r = function(e) {
var t = n.md5(navigator.appVersion),
r = "" + (new Date).getTime(),
i = r + parseInt(10 * Math.random(), 10);
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "@6f#X3=cCuncYssPsuRUE")
}
};
(1)ts的值为 r : 获取到当前的时间戳,并把它转换为字符串
(2)bv的值为 t : t是把navigator.appVersion进行md5加密
由于我们不知道navigator.appVersion是啥,在前端的console输出一下
每次提交数据都不一样
(3)salt的值为 i : 把字符串 r 和从1 到10里面的随机数拼接产生的字符串
字符串+整型数字=直接拼接成字符串
eg: 'abcd'+2='abcd2'
(4)sign的值为对后面的字符串进行md5加密
e 是需要翻译的单词
8、修改后的完整代码
import requests
import time
import hashlib
import random
# 生成md5 字符串
def getMd5(value):
md5 = hashlib.md5()
md5.update(bytes(value,encoding='utf-8'))
md5_str = md5.hexdigest()
return md5_str
if __name__ == "__main__":
keyword = input("请输入你要翻译的单词:")
# 生成加密盐
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',
'Connection': 'keep-alive',
'Content-Length': str(233+len(keyword)),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=1386570177.4402287; OUTFOX_SEARCH_USER_ID="-950805547@10.168.11.69"; _ga=GA1.2.847256424.1555650976; JSESSIONID=aaaEH212V6-ad4u4_5CPw; YOUDAO_MOBILE_ACCESS_TYPE=0; ___rl__test__cookies=1556340146371',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Mobile Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
# 生成表单数据
data_list={
'i': keyword,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': md5_str,
'ts':r ,
'bv': '327689fccf65d35fd25955c1807f5d2d',
'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_list,headers=headers)
data = response.json()['translateResult']
for i in data:
for j in i:
print(j['src'],":",j["tgt"])
结果: