Files
metatube-server/translate/baidu.go
T
2022-12-15 23:13:04 +08:00

132 lines
2.9 KiB
Go

package translate
import (
"crypto/md5"
"encoding/hex"
"encoding/json"
"fmt"
"math/rand"
"net/http"
"strconv"
"strings"
"time"
"github.com/javtube/metatube-sdk-go/common/fetch"
)
const baiduTranslateAPI = "https://api.fanyi.baidu.com/api/trans/vip/translate"
func BaiduTranslate(q, from, to, appID, appKey string) (result string, err error) {
var (
resp *http.Response
// salt & sign
salt = strconv.Itoa(rand.Intn(0x7FFFFFFF))
sign = md5sum(appID + q + salt + appKey)
)
if resp, err = fetch.Post(
baiduTranslateAPI,
fetch.WithURLEncodedBody(map[string]string{
"q": q,
"from": parseToBaiduSupportedLanguage(from),
"to": parseToBaiduSupportedLanguage(to),
"appid": appID,
"salt": salt,
"sign": sign,
}),
fetch.WithHeader("Content-Type", "application/x-www-form-urlencoded"),
); err != nil {
return
}
defer resp.Body.Close()
data := struct {
From string `json:"from"`
To string `json:"to"`
TransResult []struct {
Src string `json:"src"`
Dst string `json:"dst"`
} `json:"trans_result"`
ErrorCode string `json:"error_code"`
ErrorMsg string `json:"error_msg"`
}{}
if err = json.NewDecoder(resp.Body).Decode(&data); err == nil {
if len(data.TransResult) > 0 {
s := strings.Builder{}
for _, t := range data.TransResult {
s.WriteString(t.Dst)
s.WriteByte('\n')
}
result = strings.TrimSpace(s.String())
} else {
err = fmt.Errorf("%s: %s", data.ErrorCode, data.ErrorMsg)
}
}
return
}
func md5sum(s string) string {
h := md5.New()
h.Write([]byte(s))
return hex.EncodeToString(h.Sum(nil))
}
func parseToBaiduSupportedLanguage(lang string) string {
if lang = strings.ToLower(lang); lang == "" || lang == "auto" /* auto detect */ {
return "auto"
}
switch lang {
case "zh", "chs", "zh-cn", "zh_cn", "zh-hans":
return "zh"
case "cht", "zh-tw", "zh_tw", "zh-hk", "zh_hk", "zh-hant":
return "cht"
case "jp", "ja":
return "jp"
case "kor", "ko":
return "kor"
case "vie", "vi":
return "vie"
case "spa", "es":
return "spa"
case "fra", "fr":
return "fra"
case "ara", "ar":
return "ara"
case "bul", "bg":
return "bul"
case "est", "et":
return "est"
case "dan", "da":
return "dan"
case "fin", "fi":
return "fin"
case "rom", "ro":
return "rom"
case "slo", "sl":
return "slo"
case "swe", "sv":
return "swe"
}
return lang
}
// https://fanyi-api.baidu.com/api/trans/product/apidoc
//var baiduErrorText = map[int]string{
// 52000: "成功",
// 52001: "请求超时",
// 52002: "系统错误",
// 52003: "未授权用户",
// 54000: "必填参数为空",
// 54001: "签名错误",
// 54003: "访问频率受限",
// 54004: "账户余额不足",
// 54005: "长query请求频繁",
// 58000: "客户端IP非法",
// 58001: "译文语言方向不支持",
// 58002: "服务当前已关闭",
// 90107: "认证未通过或未生效",
//}
func init() {
rand.Seed(time.Now().UnixNano())
}