有道翻译 | 青训营笔记

88 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

在青训营中学习到了如何使用翻译接口进行翻译。

在自己尝试使用有道翻译的时候,发现了一些问题,例如接口的sign是加密信息,通过百度,找到了解决方法,下面是解决加密问题的步骤

  1. 找到加密的js代码块。

    通过有道的翻译网址,打开控制台,点击源代码-》{} 按钮 可以得到如下图的js代码块

image-20220508093453769.png

image-20220508093523314.png 在里面可以找到这一块代码,就是我需要的加密代码块了

 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) {}
        })
    }
  1. 其中关键是这几句代码

    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,ltssalt也随之解决

  2. 下面是我的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)
    
  3. 运行结果截图

image-20220508094932110.png