yintai2/app/common/service/translate.go

103 lines
2.2 KiB
Go

package service
import (
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
"yintai-api/base/config"
"github.com/tidwall/gjson"
)
type BaiduTranslate struct {
APIKey string
SecretKey string
}
func NewBaiduTranslate() *BaiduTranslate {
return &BaiduTranslate{
APIKey: config.GetConfig().Baidu.TranslateApiKey,
SecretKey: config.GetConfig().Baidu.TranslateSecret,
}
}
func (t *BaiduTranslate) accessToken() (string, error) {
client := &http.Client{}
target := fmt.Sprintf("https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s&", t.APIKey, t.SecretKey)
request, err := http.NewRequest("GET", target, nil)
if err != nil {
return "", err
}
resp, err := client.Do(request)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
accessToken := gjson.ParseBytes(body).Get("access_token").String()
if accessToken == "" {
return "", fmt.Errorf("access token is empty")
}
return accessToken, nil
}
// ZH2EN zh to en
func (t *BaiduTranslate) ZH2EN(text string) (string, error) {
return t.Translate(text, "zh", "en")
}
func (t *BaiduTranslate) Translate(text, from, to string) (string, error) {
if len(text) == 0 {
return "", nil
}
token, err := t.accessToken()
if err != nil {
return "", err
}
client := &http.Client{}
target := fmt.Sprintf("https://aip.baidubce.com/rpc/2.0/mt/texttrans/v1?access_token=%s", token)
params := make(map[string]string)
params["from"] = from
params["to"] = to
params["q"] = text
body, err := json.Marshal(params)
if err != nil {
return "", fmt.Errorf("json marshal error: %w", err)
}
req, err := http.NewRequest("POST", target, strings.NewReader(string(body)))
if err != nil {
return "", err
}
resp, err := client.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err = io.ReadAll(resp.Body)
if err != nil {
return "", err
}
result := gjson.ParseBytes(body)
var res string
for _, v := range result.Get("result.trans_result").Array() {
res += gjson.Parse(v.String()).Get("dst").String()
}
if len(res) == 0 {
return "", fmt.Errorf("translate error")
}
return res, nil
}