上接:
Python3网络爬虫教程8——有道在线翻译项目(JS加密)
https://blog.csdn.net/u011318077/article/details/86538141
6.1 有道翻译js加密
-
有道翻译在线进行了加密过程,检查源码发现formdata中有salt和sign两个键
-
salt(俗称加盐,一个附加的字符串,附加之后然后进行加密,
- 类似于一般用户输入密码位数有限,服务器会给密码附加一串随机的数值,然后再进行加密,
- 加密一般都是JS加密)
-
sign(加密后的字段)
-
提取有道翻译的JS数据
-
打开有道翻译首页,检查,刷新一下,参考图片43_19.png,然后复制里面的JS数据
-
数据易读性很差,到在线网站http://tool.oschina.net/codeformat/js进行格式化一下
-
将格式化的数据保存到,43_19.txt中,
-
然后ctrl+f查找salt,会找到多个salt,找到以下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 + “p09@Bn{h02_BIEe]$P^nG”)
} -
查看数据发现 i = “” + (new Date).getTime() + parseInt(10 * Math.random(), 10)
-
上面的i就是计算salt的值的公式
-
上面的sign中值是一个计算md5的公式
-
sign: n.md5(“fanyideskweb” + e + i + “p09@Bn{h02_BIEe]$P^nG”)
- md5后面的括号中为计算公式,包含以下部分
- 第一部分和第四部分为两个字符串
- 第三部分就是i,就是上面salt对应的值
- 第二部分为e,是输入的一个值,经推测,应该是输入的单词
- md5后面的括号中为计算公式,包含以下部分
-
-
具体实现过程参考案例43_19
-
案例43_19是按照加密算法,实现的代码
def getSalt():
'''
salt公式是: "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10));
把他翻译成python代码
:return:
'''
import time, random
salt = int(time.time()*1000) + random.randint(0,10)
return salt
def getMD5(v):
import hashlib
md5 = hashlib.md5()
# update需要一共bytes格式的参数
md5.update(v.encode("utf-8"))
sign = md5.hexdigest()
return sign
def getSign(key, salt):
sign = 'fanyideskweb'+ key + str(salt) + "ebSeFb%=XZ%T[KZ)c(sy!"
sign = getMD5(sign)
return sign
from urllib import request, parse
import json
def youdao(key):
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
salt = getSalt()
data = {
"i": key,
"from":"AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": str(salt) ,
"sign": getSign(key, salt),
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult": "false"
}
# 参数data需要是bytes格式
data = parse.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": len(data),
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
"Cookie": "[email protected];JSESSIONID=aaaTLWzfvp5Hfg9mAhFkw;OUTFOX_SEARCH_USER_ID_NCOO=1999296830.4784973;___rl__test__cookies=1523100789517",
"Host": "fanyi.youdao.com",
"Origin": "http://fanyi.youdao.com",
"Referer": "http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0( X11; Linux x86_64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36 X-Requested-With: XMLHttpRequest"
}
req = request.Request(url=url, data=data, headers=headers)
res = request.urlopen(req)
# 下载导出数据
result = json.loads(res.read())
# 打印出翻译后的结果
print("\n翻译结果: " + result["translateResult"][0][0]["tgt"])
if __name__ == '__main__':
key = input("请输入需要翻译的文字(输入完成后请按Enter): ")
youdao(key)
输出结果:
请输入需要翻译的文字(输入完成后请按Enter): 我爱你 宝贝
翻译结果: I love you baby
Process finished with exit code 0
下接:
Python3网络爬虫教程9——ajax异步请求
https://blog.csdn.net/u011318077/article/details/86633196