有时间了打算把有道、百度、Google翻译都搞一遍,
今天先试水有道翻译
打开地址:
一. js逆向分析
打开Chrome调试工具,然后随意输入一段文字,查看抓包结果。
- 发现是 post 请求
Request URL: http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule
- Form data 参数每次请求
salt: 15584215877008
sign: 6ef278e78eca2affa23720a79c738d33
ts: 1558421587700
bv: a4da7fd2fcb0c879a8b1e37b497afb19
- 观察参数
- sign 参数每次请求都会变化
- ts 参数是时间戳无疑
- salt
- bv
看不出来其它信息,我们可以全局搜索一下不明所以的参数,这里先搜 sign
然后我们发现了 了不得 的东西
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")
}
};
可以看出来:
ts 参数是通过 r = “” + (new Date).getTime() 生成; 也就是获取了当前的时间戳
bv参数是通过 t = n.md5(navigator.appVersion) 生成; 也就是 navigator.appVersion 的 MD5 加密
salt参数是通过 i = r + parseInt(10 * Math.random(), 10) 生成 即在 r(就是ts)的基础上在最后一位随机加上一个整数
sign参数是通过 md5(“fanyideskweb” + e + i + “@6f#X3=cCuncYssPsuRUE”)生成
这里面就此不知道是什么的有 :e, navigator.appVersion
- 接下来打断点查看一下是啥?
可以看出:
e 是输入的文字
navigator.appVersion 是 user-agent
有道翻译的加密过程也就这样了,还是比较简单的。
二. python 编译
1. MD5
python 有一个 hashlib 库, 用来 md5 加密
import hashlib
def MD5(key):
hash = hashlib.md5()
hash.update(key.encode('utf-8'))
return hash.hexdigest()
s = MD5('1324')
2. 结果展示
-
- 英文 -> 中文
- 英文 -> 中文
-
- 中文 -> 英文
3. 代码
#!/usr/bin/env python
# encoding: utf-8
# @software: PyCharm
# @time: 2019/5/21 15:38
# @author: Paulson●Wier
# @file: youdao_fanyi.py
# @desc:
import random
import requests
import time
import hashlib
def md5_b(key):
m = hashlib.md5()
m.update(key.encode('utf-8'))
return m.hexdigest()
def sign_b(key, salt):
sign = 'fanyideskweb' + key + str(salt) + '@6f#X3=cCuncYssPsuRUE'
return md5_b(sign)
def translate(key):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
salt = str(int(time.time()*1000) + random.randint(0, 10))
data = {
"i": key,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"ts": salt[:-1],
"salt": salt,
"sign": sign_b(key, salt),
"bv": md5_b("5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"),
"doctype": "json",
"version": "2.1",
'keyfrom': 'fanyi.web',
'action': 'FY_BY_REALTIME',
# 'typoResult': 'false'
}
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
"Content-Length": "272",
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': 'OUTFOX_SEARCH_USER_ID=-995880639@10.168.8.64; JSESSIONID=aaa4S2JviOjAFe8LvizRw; '
'OUTFOX_SEARCH_USER_ID_NCOO=2146618943.795375; ___rl__test__cookies=1558425516486',
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
res = requests.post(url, data=data, headers=headers).json()
# print(res)
result = res['translateResult'][0][0]
result_tgt = result['tgt']
result_src = result['src']
print(f"""‘{result_src}’,的翻译是: ‘{result_tgt}’""")
try:
# 有时返回数据中会有其他翻译的,如果有的话,就打印出来。
print('其它翻译:\n'+''.join(res['smartResult']['entries']))
except KeyError:
pass
if __name__ == '__main__':
translate("You are such a smart kid!")
# translate("你可真是个小机灵鬼!")
关注,star,点赞,谢谢~
点击前往Github(有道、百度、谷歌google 翻译JS逆向破解参数项目地址)