失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 有道翻译js逆向解析

有道翻译js逆向解析

时间:2021-06-11 01:16:31

相关推荐

有道翻译js逆向解析

文章目录

一、需求二、思路分析三、遇到的问题及解决措施四、代码分享

一、需求

爬虫实现“有道翻译”

二、思路分析

1、明确目标url

抓包前可以清空网页加载出来的数据包;抓包过程中可以查看preview或者response响应是否有我们所需要的数据,以此确认url

2、向url发送请求、获取对应的响应

向目标网址发送请求时,需要确定请求方式–post请求,需要携带data参数,提交表单数据

3、提取翻译的结果

结果发现,无法获取到翻译信息,出现了errorCode

三、遇到的问题及解决措施

(1)观察流程

a. 观察发现,form data中的sign、salt、lts的值会随着翻译内容i的变化而变化

b. 有一定反爬经验的话,可以猜测lts是时间戳,经过时间戳在线转换工具的验证,确实如此

c. 观察发现,salt的值和lts的有点像,salt就是在lts后面加了一个数字(加盐操作)

实际上,sign是在js文本中的js代码中加密生成的,那么我们需要在对应的js代码中找到其加密过程

(2)分析流程

r = "" + (new Date).getTime() # r: 获取时间戳i = r + parseInt(10 * Math.random(), 10) # i: r + 一个随机数字return {ts: r,# ts: 以毫秒为单位的格林尼治时间戳bv: t,salt: i, # salt: 时间戳+一位随机数字sign: n.md5("fanyideskweb" + e + i + "Ygy_4c=r#e#4EX^NUGUc5") # sign: 使用md5加密算法对明文参数加密得到的密文,e是翻译内容,i也是salt}lts:ts # lts:以毫秒为单位的格林尼治时间戳

(3)结论

(1)lts – 以毫秒为单位的格林尼治时间戳

int(time.time()*1000)

(2)salt – 以毫秒为单位的格林尼治时间戳 + 一个随机数字

int(time.time()*1000) + random.randint(0,9)

(3)sign – n.md5(“fanyideskweb” + e + i + “Ygy_4c=r#e#4EX^NUGUc5”)

hashlib.md5(明文参数.encode()).hexdigest()

四、代码分享

代码完善:

当输入“有道翻译”无法翻译的内容时,会报错,所以可以使用try…except…捕获异常使用while True循环翻译

​import requestsimport timeimport randomimport hashlibwhile True:content = input("请输入你要翻译的内容:")lts = int(time.time() * 1000)salt = lts + random.randint(0, 9)sign_para = "fanyideskweb" + str(content) + str(salt) + "Ygy_4c=r#e#4EX^NUGUc5"sign = hashlib.md5(sign_para.encode()).hexdigest()url = "/translate_o?smartresult=dict&smartresult=rule"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36","Referer": "/"}form_data = {"i": content,"from": "AUTO","to": "AUTO","smartresult": "dict","client": "fanyideskweb","salt": str(salt),"sign": str(sign),"lts": str(lts),"bv": "ac3968199d18b7367b2479d1f4938ac2","doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTlME"}response = requests.post(url, headers=headers, data=form_data)try:dict_data = response.json() # 解析json参数print("翻译结果:", dict_data["translateResult"][0][0]["tgt"]) # 除此方法,也可以使用jsonpath解析数据except:print("您输入的内容无法翻译,请重新输入..")continue # 跳出本次循环,进行下一次循环​

写在最后:有任何代码问题,欢迎交流~

如果觉得《有道翻译js逆向解析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。