这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
在青训营中学习到了如何使用翻译接口进行翻译。
在自己尝试使用有道翻译的时候,发现了一些问题,例如接口的sign是加密信息,通过百度,找到了解决方法,下面是解决加密问题的步骤
-
找到加密的js代码块。
通过有道的翻译网址,打开控制台,点击源代码-》{} 按钮 可以得到如下图的js代码块
在里面可以找到这一块代码,就是我需要的加密代码块了
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 + "Ygy_4c=r#e#4EX^NUGUc5")
}
};
t.recordUpdate = function(e) {
var t = e.i
, i = r(t);
n.ajax({
type: "POST",
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
url: "/bettertranslation",
data: {
i: e.i,
client: "fanyideskweb",
salt: i.salt,
sign: i.sign,
lts: i.ts,
bv: i.bv,
tgt: e.tgt,
modifiedTgt: e.modifiedTgt,
from: e.from,
to: e.to
},
success: function(e) {},
error: 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 + "Ygy_4c=r#e#4EX^NUGUc5") //... salt: i.salt, sign: i.sign, lts: i.ts,很明显 要的
sign就是通过md5加密的一字符串这段字符串有两个变量
e就是这个方法的传参,可以通过断点调试知道这个e就是我们要翻译的输入值i就是通过一个毫秒的时间戳 加上 一个10的随机数拼接而成的解决的
sign,lts和salt也随之解决 -
下面是我的go语言实现,我翻译已经成功实现了
ts := time.Now().UnixNano() / 1e6 // 获取当前时间戳 salt := ts + int64(rand.Intn(10)) // 获取10以内的随机数 并且拼接时间戳 str := fmt.Sprint("fanyideskweb", query, salt, "Ygy_4c=r#e#4EX^NUGUc5") // 获取要md5加密的字符串 m := md5.New() m.Write([]byte(str)) // md5加密 sign := m.Sum(nil) var data = strings.NewReader(fmt.Sprint("i=", query, "&from=AUTO&to=AUTO&"+ "smartresult=dict&"+ "client=fanyideskweb&"+ fmt.Sprint("salt=", salt, "&")+ fmt.Sprint("sign=", hex.EncodeToString(sign), "&")+ // 用这个方法进行[]byte 到 string的转换 fmt.Sprint("lts=", ts, "&")+ "bv=247811f9b7fd387f154bf67d8ebd44f3&"+ "doctype=json&"+ "version=2.1&"+ "keyfrom=fanyi.web&"+ "action=FY_BY_REALTlME")) req, err := http.NewRequest("POST", "https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule", data) -
运行结果截图