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 }