前言
刚没事做了一下有道翻译参数的破解,在这大致思路,也算是记录一下吧(要是有什么不对的地方,还请斧正)。此次的目标是网页端的有道翻译。闲话不多说,进入正题(各位看官觉得有用的话欢迎点个喜欢哇)
分析
老规矩,找到数据接口,如图:
可以看到,是以POST方式提交的数据,继续,看到DATA部分。
看到这里,这些参数除其中i,salt,sign三个参数外,其他在多次翻译时都不会改变。显而易见,i是我们需要翻译的内容。那么salt是什么呢,其实熟练地话能很容易看出来是一个时间戳。可是它为什么命名为salt呢?不由得与下面的sign联想到一起,是不是有py交易呢?sign类似于某个字符加salt的md5值。暂时是推测,接下来验证。
找到发起这一请求的js,格式化后打开。搜索sign这一参数,很幸运,代码没有混淆,没有加密,很规范,这才是人看的代码,哈哈。
看到代码,是不是有一种豁然开朗的感觉,把其中的关键代码截取出来:
u = "fanyideskweb"
c = i.deEight("rY0D^0'nM0}g5Mm1z%1G4"),
var g = n.md5(u + d + f + c);
/*sign是u+d+f+c的md5值
d 即待翻译的内容
f是时间戳
c, u是固定的字符串
*/
e("/output/output").translate({
i: d,
from: s,
to: l,
smartresult: "dict",
client: u,
salt: f,
sign: g,
doctype: "json",
version: "2.1",
keyfrom: "fanyi.web",
action: t,
typoResult: !0
})
至此,所有的关键参数已经被分析出来了,接下来就是Python的代码实现了,同样,只写关键代码(我懒,每次都是大晚上的码字- -)
'''
Created by Chen
'''
import hashlib
import time
def createData(transStr):
'''
待翻译的内容
:param transStr:
:return: dict
'''
salt = str(int(time.time()*1000))
client = 'fanyideskweb'
a = "rY0D^0'nM0}g5Mm1z%1G4"
md5 = hashlib.md5()
digStr = client+transStr+salt+a
md5.update(digStr)
sign = md5.hexdigest()
data = {
'i': transStr ,
'from': 'AUTO',
'to': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': salt,
'sign': sign,
'doctype': 'json',
'version': '2.1',
'keyfrom': 'fanyi.web',
'action': 'FY_BY_CL1CKBUTTON',
'typoResult': 'true'
}
return data