爬虫:突破有道翻译js加密
代码已上传至个人GitHub,可供下载: 突破有道翻译js加密
思路:(python版本3.6)
1、分析post上传form信息,发现存在加密行为
2、查看网页js文件,分析加密函数
3、根据加密函数原理进行解密,突破有道的翻译接口
一、打开有道翻译网页,按F12键,并输入内容进行翻译,可以看到服务器对网页请求作出的回应,最需要关注的是上传的信息和上传的路径(URL)。
通过多次观察,发现上传的form信息中不断变化的信息是(i、salt、sign、ts),其他的信息都是不变的。
根据以往经验就可以判断salt、sign、ts就是有道翻译为机器获取其翻译内容所设置的障碍。
二、寻找js文件中相应的加密函数,并分析其加密过程。
刷新一下网页,就可以看到反馈回来的各种js文件,fanyi.min.js最为显眼,像不像【翻译*密.js】。
打开fanyi.min.js文件,并将js代码进行格式化,并查找相应的加密函数。
将格式化后的js代码放入txt文档进行查找操作,可以得到如下的加密函数。
由上图函数可以看到ts、bv、salt、sign参数的由来,整理如下:
- ts:指的是获取当前的时间戳乘以1000取整
- bv:获取当前有道翻译版本的MD5编码(版本一般长时间不变)
- salt:ts加上[1, 10]之间的随机数
- sign:md5(“fanyideskweb” + 要翻译的内容 + salt + "1L5ja}w$puC.v_Kz3@yYn")
注意:由于有道翻译的反爬虫机制,其中的参数每过一段时间可能会改变,或者直接加密函数发生改变,但不变的解决问题的思想。
三、根据对加密函数的分析,就可以写相对应的解密代码了
from urllib import request, parse
import time
import random
import hashlib
import jsondef get_ts():ts = str(int(1000 * time.time()))return tsdef get_salt(ts):salt = ts + str(random.randint(0, 10))return saltdef get_sign(words, salt):content = 'fanyideskweb' + words + salt + '1L5ja}w$puC.v_Kz3@yYn'sign = hashlib.md5(content.encode()).hexdigest()return signdef translate(words, ts, salt, sign):url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"data = {"i": words,"from": "AUTO","to": "AUTO","smartresult": "dict","client": "fanyideskweb","salt": salt,"sign": sign,'ts': ts,'bv': 'bbb3ed55971873051bc2ff740579bb49',"doctype": "json","version": "2.1","keyfrom": "fanyi.web","action": "FY_BY_REALTIME","typoResult": "false"}data = parse.urlencode(data).encode()headers = {'Accept': 'application/json, text/javascript, */*; q=0.01',# 'Accept-Encoding': 'gzip, deflate','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': '__guid=204659719.2422785200799945700.1554675512727.244; OUTFOX_SEARCH_USER_ID=-1327275086@10.169.0.82; OUTFOX_SEARCH_USER_ID_NCOO=378292303.3354687; JSESSIONID=aaaLYwaICIOxi6ofRh8Nw; monitor_count=8; ___rl__test__cookies=1554693830913','Host': 'fanyi.youdao.com','Origin': 'http://fanyi.youdao.com','Referer': 'http://fanyi.youdao.com/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36','X-Requested-With': 'XMLHttpRequest'}req = request.Request(url=url, data=data, headers=headers)rsp = request.urlopen(req)html = rsp.read().decode('utf-8')json_data = json.loads(html)print('翻译的结果为:' + json_data['translateResult'][0][0]['tgt'])if __name__ == '__main__':words = input('请输入要翻译的内容:')ts = get_ts()salt = get_salt(ts)sign = get_sign(words, salt)translate(words, ts, salt, sign)
运行结果:
代码已上传至个人GitHub,可供下载: 突破有道翻译js加密