学了有一段时间Go语言了,大部分基础语法都已经开始熟了,一直找不到什么东西练手,正好,看到了QQ的C#群里面有人搞百度翻译的API,于是我就想到用Go语言写了,看了下官网的文档,没有golang的DEMO,百度了一下,有一个例子写出来了,于是我就参考一下,自己写了一个,代码放下面,做个记录。

package main

import (
    "crypto/md5"
    "encoding/hex"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"
    "strconv"
    "time"
)

type Transapi struct {
    Q      string
    From   string
    To     string
    Appid  string
    Salt   string
    Sign   string
    Passwd string
}

func apimsg(q, from, to, appid, passwd string) Transapi {
    transapi := Transapi{
        Q:      q,
        From:   from,
        To:     to,
        Appid:  appid,
        Passwd: passwd,
    }
    return transapi
}

func (t Transapi) apisum() string {
    appid := t.Appid
    q := t.Q
    salt := t.saltrand()
    passwd := t.Passwd
    content := appid + q + salt + passwd
    //fmt.Println(content)
    return content
}

func (t Transapi) saltrand() string {
    salt := strconv.Itoa(time.Now().Second())
    //fmt.Println(salt)
    return salt
}

func (t Transapi) md5cul() string {
    md5cultc := md5.New()
    md5cultc.Write([]byte(t.apisum()))
    t.Sign = hex.EncodeToString(md5cultc.Sum(nil))
    sign := t.Sign
    //fmt.Println(sign)
    return sign
}

func (t Transapi) sumurl() url.Values {
    values := url.Values{
        "q":     {t.Q},
        "from":  {t.From},
        "to":    {t.To},
        "appid": {t.Appid},
        "salt":  {t.saltrand()},
        "sign":  {t.md5cul()},
    }
    return values
}

func main() {
    appid := "******"
    passwd := "******"
    url := "https://fanyi-api.baidu.com/api/trans/vip/translate"

    src := ""
    fmt.Println("请输入要翻译的内容:")
    fmt.Scanln(&src)

    apimsg := apimsg(src, "en", "zh", appid, passwd)
    values := apimsg.sumurl()

    resp, _ := http.PostForm(url, values)

    defer resp.Body.Close()
    content, _ := ioutil.ReadAll(resp.Body)

    var trans map[string]interface{}
    trans = make(map[string]interface{}, 0)

    err := json.Unmarshal([]byte(content), &trans)
    if err != nil {
        fmt.Printf("fail")
    }

    fmt.Println(trans["trans_result"])
}

按照这个代码写一下基本就能实现功能了,例如这里翻译apple,正常来说,捕捉resp.Body的内容如下:

{"from":"en","to":"zh","trans_result":[{"src":"apple","dst":"\u82f9\u679c"}]}

但是我这里用Unmarshal,把这个json格式反序列了,所以这里最后只是输出了翻译的原文字和翻译后的文字,依然是map格式的
例如我翻译一个apple

[map[dst:苹果 src:apple]]

因为初学,map这里不是很会处理,后期处理好了就放出来吧。

这里再做点解释:
1.通用翻译API如何收费?(以下是客服回复)
答案:您好,各类别服务计费方式如下:
· 通用翻译API-标准版:可不限调用字符量免费使用(QPS为1);
· 通用翻译API-高级版:每月翻译字符数低于200万,享免费服务;超过200万字符,按照49元人民币/百万字符支付当月超出部分字符量费用(QPS为10);
· 通用翻译API-尊享版:每月翻译字符数低于200万,享免费服务;超过200万字符,按照49元人民币/百万字符支付当月超出部分字符量费用(QPS为100)。
所以咱用标准版就好了。
2.代码中的******是什么?
答案:appid和密钥,这两个玩意只要注册了百度账号,开通百度翻译开放平台就能在开发者信息里面看到了
3.有三处做了注释的是什么?
答案:这里主要是输出一下接口需要的内容,做测试用,查看md5有没有算错啥的。

参考文档:
1.Go语言使用百度翻译api
2.通用翻译API接入文档