一、需要用到的工具:
先把格式化js的线上网址记录一下:http://tool.chinaz.com/Tools/jsformat.aspx
二、分析流程、
有道翻译分析过程
(1)翻译过程中会发起请求 response中可以看到响应的结果
(2)Headers最下面,Form Data许多的数据,这些数据就是在点击翻译的时候浏览器给服务器发送的数据
在这里插入图片描述
(3)
i:需要进行翻译的字符串。
salt:加密用到的盐。这个是我们破解有道反爬虫机制的关键点。
sign:签名字符串。也是破解反爬虫机制的关键点
(4)比较每次翻译时候发送的Form Data的值。我们注意到,Form Data在每次发送网络请求的时候,只有i和salt以及sign这三个是不同的,其他的数据都是一样的
图片: https://uploader.shimo.im/f/Rrk4LH7N164mKRVb.png
(5)每次发送翻译请求的时候,并没有一个请求是专门用来获取这两个值的:
图片: https://uploader.shimo.im/f/8sTHSUy3lZwLOS8n.png
(6)那就是在本地自己生成的,如果是在本地自己生成的,那么规则是什么呢?这里我们点击网页,查看网页源代码,查找所有的JS文件,我们找到那个fanyi.js:
根据分析:salt sign 两个值为所需要破解的密钥
话不多说,上代码:
import json
from urllib import parse, request
import time,random
import hashlib
md5 = hashlib.md5()
def getSign(key, salt):
'''
获取sign
:param key: 要翻译的字符串
:param salt: 盐值
:return:
'''
# 分析js得到sign是由常量"fanyideskweb"+要翻译的字符串+盐值+常量"Nw(nmmbP%A-r6U3EUn]Aj"组成
sign = "fanyideskweb" + str(key) + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"
sign = getmd5(sign)#调用md5加密,把写好的sign传递到加密方法中
return sign #得到的结果返回
def getmd5(v):
'''
:param v: 传递过来写好的sign
:return:
'''
md5.update(v.encode("utf8"))#编码
sign = md5.hexdigest()#执行加密
return sign#返回
def fy(i):
'''
通过在js文件中查找salt或者sign,可以找到
1.可以找到这个计算salt的公式
r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
2. sign:n.md5("fanyideskweb" + t + r + "Nw(nmmbP%A-r6U3EUn]Aj");
md5
一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是salt,
第二个参数是输入的需要翻译的单词
'''
req_url="http://fanyi.youdao.com/translate"
ts = str(int((time.time() * 1000)))#时间戳
salt = str(ts) + str(random.randint(0, 10))#盐值
fanyidata = {
"i":i, #要翻译的字符串
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb", #写死的值
"salt": str(salt), #盐值
"sign":getSign(i, salt), #获取sign
"ts":ts, #时间戳
"bv":"0ed2e07b89acaa1301d499442c9fdf79",#死值
"doctype":"json", #格式
"version":"2.1", #版本
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false",
}
data=parse.urlencode(fanyidata).encode("utf-8") # 对数据进行编码处理
response=request.urlopen(req_url,data) #提交数据并解析
html=response.read().decode("utf-8")# 读取返回来的数据
print(html) #json格式
translate_results=json.loads(html) # 把返回来的json字符串解析成字典
print("translate_results======",translate_results)
translate_results=translate_results["translateResult"][0][0]["tgt"] #翻译后的结果
print("翻译后的结果",translate_results)
return translate_results
if __name__=="__main__":
# 项目入口首先要得到要翻译的字符串,给个输入框来获取
content = input('请输入需要翻译的句子:')
d=content
# 得到以后传给翻译接口
fy(d)
import json
import requests
import time, random
session = requests.session()
import hashlib
md5 = hashlib.md5()
def getSign(key, salt):
'''
获取sign
:param key: 要翻译的字符串
:param salt: 盐值
:return:
'''
# 分析js得到sign是由常量"fanyideskweb"+要翻译的字符串+盐值+常量"Nw(nmmbP%A-r6U3EUn]Aj"组成
sign = "fanyideskweb" + str(key) + str(salt) + "Nw(nmmbP%A-r6U3EUn]Aj"
sign = getmd5(sign)#调用md5加密,把写好的sign传递到加密方法中
return sign #得到的结果返回
def getmd5(v):
'''
:param v: 传递过来写好的sign
:return:
'''
md5.update(v.encode("utf8"))#编码
sign = md5.hexdigest()#执行加密
return sign#返回
def youdao(key):
'''
通过在js文件中查找salt或者sign,可以找到
1.可以找到这个计算salt的公式
r = "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10))
2. sign:n.md5("fanyideskweb" + t + r + "Nw(nmmbP%A-r6U3EUn]Aj");
md5
一共需要四个参数,第一个和第四个都是固定值得字符串,第三个是salt,
第二个参数是输入的需要翻译的单词
'''
url = "http://fanyi.youdao.com/translate"
ts = str(int((time.time() * 1000)))#时间戳
salt = str(ts) + str(random.randint(0, 10))#盐值
data = {
"i":key, #要翻译的字符串
"from":"AUTO",
"to":"AUTO",
"smartresult":"dict",
"client":"fanyideskweb", #写死的值
"salt": str(salt), #盐值
"sign":getSign(key, salt), #获取sign
"ts":ts, #时间戳
"bv":"0ed2e07b89acaa1301d499442c9fdf79",#死值
"doctype":"json", #格式
"version":"2.1", #版本
"keyfrom":"fanyi.web",
"action":"FY_BY_REALTIME",
"typoResult":"false",
}
result =requests.post(url=url, data=data)
resultdata=result.text#得到文本数据
# print("resultdata", resultdata)
translateResult=json.loads(resultdata)# 把返回来的json字符串解析成字典
print("translateResult======", translateResult)
translate_results = translateResult["translateResult"][0][0]["tgt"] # 翻译后的结果
print("翻译后的结果", translate_results)
if __name__ == '__main__':
# 项目入口首先要得到要翻译的字符串,给个输入框来获取
content = input('请输入需要翻译的句子:')
d=content
# 得到以后传给翻译接口
youdao(d)
运行结果:![结果](https://img-blog.csdnimg.cn/20200320200929738.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1b211d3VodWl4dWU=,size_16,color_FFFFFF,t_70#pic_center)
拿走不谢,对您有帮助请点赞支持,谢谢!