浏览代码

谷歌翻译

xiexiaoyuan 2 年之前
父节点
当前提交
4ac61f8e51
共有 4 个文件被更改,包括 149 次插入17 次删除
  1. 2 2
      controllers/day_new.go
  2. 0 12
      go.sum
  3. 76 3
      services/day_new.go
  4. 71 0
      services/google_translate.go

+ 2 - 2
controllers/day_new.go

@@ -26,9 +26,9 @@ func (c *DayNewController) RefreshMsg() {
 // @Description 手动翻译内容
 // @router /translate [get]
 func (c *DayNewController) TranslateContent() {
-	err := services.DayNewTranslateContent()
+	err := services.DayNewTranslateContentByGoogle()
 	if err != nil {
-		c.FailWithMessage("翻译失败, " + err.Error())
+		c.FailWithMessageErr("翻译失败", err.Error())
 		return
 	}
 	c.Ok()

+ 0 - 12
go.sum

@@ -181,8 +181,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
 github.com/go-redis/redis v6.14.2+incompatible h1:UE9pLhzmWf+xHNmZsoccjXosPicuiNaInPgym8nzfg0=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v7 v7.4.0/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg=
-github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
-github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc h1:jZY+lpZB92nvBo2f31oPC/ivGll6NcsnEOORm8Fkr4M=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc/go.mod h1:25mL1NKxbJhB63ihiK8MnNeTRd+xAizd6bOdydrTLUQ=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
@@ -366,7 +364,6 @@ github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108
 github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
 github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
-github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
 github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
 github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -374,7 +371,6 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
 github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
 github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw=
 github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
 github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
@@ -459,15 +455,11 @@ github.com/siddontang/goredis v0.0.0-20150324035039-760763f78400/go.mod h1:DDcKz
 github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA=
 github.com/silenceper/wechat/v2 v2.1.3 h1:vMHnU9PG6wROTqkQI+HnBiEzriEEE+sbmGHg9cdb4yc=
 github.com/silenceper/wechat/v2 v2.1.3/go.mod h1:FoU0YvegD+Z85TBGQhjkXjY8BMb0+cagbe9BqJ0fKhA=
-github.com/silenceper/wechat/v2 v2.1.4 h1:X+G9C/EiBET5AK0zhrflX3ESCP/yxhJUvoRoSXHm0js=
-github.com/silenceper/wechat/v2 v2.1.4/go.mod h1:F0PKqImb15THnwoqRNrZO1z3vpwyWuiHr5zzfnjdECY=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
 github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
-github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs=
@@ -561,8 +553,6 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrO
 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -671,8 +661,6 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
-golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 76 - 3
services/day_new.go

@@ -192,7 +192,7 @@ func DayNewWeworkMsgRefresh() (err error)  {
 	}
 
 	//批量翻译
-	go DayNewTranslateContent()
+	go DayNewTranslateContentByGoogle()
 
 	//go GetWeWorkUsersNickName()
 
@@ -260,8 +260,8 @@ func GetWeWorkUsersNickName() (err error)  {
 func DayNewTranslateContent() (err error) {
 	defer func() {
 		if err != nil {
-			utils.ApiLog.Println("企业微信 中翻英操作失败, Err:"+err.Error())
-			go alarm_msg.SendAlarmMsg("企业微信 中翻英操作失败, Err:"+err.Error(), 1)
+			utils.ApiLog.Println("企业微信 阿里云中翻英操作失败, Err:"+err.Error())
+			go alarm_msg.SendAlarmMsg("企业微信 阿里云中翻英操作失败, Err:"+err.Error(), 1)
 		}
 	}()
 	//查询待翻译的内容列表
@@ -368,3 +368,76 @@ func batchTranslateHandler(contentMap map[string]string) (contentEnMap map[strin
 	return
 }
 
+
+func DayNewTranslateContentByGoogle() (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			utils.ApiLog.Println("企业微信 谷歌中翻英操作失败, Err:"+err.Error()+"ErrMsg: "+errMsg)
+			go alarm_msg.SendAlarmMsg("企业微信 谷歌中翻英操作失败, Err:"+err.Error()+"ErrMsg: "+errMsg, 1)
+		}
+	}()
+	//查询待翻译的内容列表
+	condition := ` and (content_en = "" or content_en is null) and is_delete = 0`
+	var pars []interface{}
+	list, err := day_new.GetWeworkMsgByConditionLimit(condition, pars, 2000) //默认最多查询2000条
+	if err != nil {
+		err = errors.New(fmt.Sprintf("查询未翻译的聊天记录失败 err: %v", err))
+		return
+	}
+	multi := ""
+	needChangeIds := ""
+	count := 0
+	contentMap := make(map[string]string, 0)
+	contentEnMap := make(map[string]string)
+	var ups []interface{}
+	for _, v := range list {
+		//如果单条翻译的字符数超过1000,则直接翻译,否则批量翻译
+		if count >= 50 {  //待翻译的条数不能超过50; 单条翻译字符数不能超过1000字符
+			contentEnMap, err, errMsg = batchTranslateHandlerByGoogle(contentMap)
+			if err != nil {
+				return
+			}
+			// 拼接更新sql
+			for rk, rv := range contentEnMap {
+				needChangeIds += rk + ","
+				multi += ` WHEN `+rk+` THEN ?`
+				ups = append(ups, rv)
+			}
+			contentMap = make(map[string]string, 0)
+			count = 0
+		}
+		contentMap[strconv.Itoa(int(v.Id))] = v.Content
+		count += 1
+	}
+	//剩余不满50条的content
+	if count > 0 {
+		contentEnMap, err, errMsg = batchTranslateHandlerByGoogle(contentMap)
+		if err != nil {
+			return
+		}
+		// 拼接更新sql
+		for rk, rv := range contentEnMap {
+			needChangeIds += rk + ","
+			multi += ` WHEN `+rk+` THEN ?`
+			ups = append(ups, rv)
+		}
+	}
+
+	if needChangeIds != "" {
+		needChangeIds = strings.Trim(needChangeIds, ",")
+		err = day_new.MultiUpdateContentEn(multi, needChangeIds, ups)
+		if err != nil {
+			err = errors.New(fmt.Sprintf("更新翻译后的内容失败 err: %v", err))
+			return
+		}
+	}
+	return
+}
+
+func batchTranslateHandlerByGoogle(contentMap map[string]string) (contentEnMap map[string]string, err error, errMsg string)  {
+	contentStr, _ := json.Marshal(contentMap)
+	contentEnMap, err, errMsg = GoogleTranslateApi(string(contentStr))
+	return
+}
+

+ 71 - 0
services/google_translate.go

@@ -0,0 +1,71 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+)
+var (
+	googleTranslateUrl = "http://8.210.169.38:8396/api/google/translate"
+)
+
+type GoogleApiResp struct {
+	Code int    `json:"code"`
+	Msg  string  `json:"msg"`
+	ErrMsg string `json:"err_msg"`
+	Data GoogleApiRespData `json:"data"`
+}
+
+type GoogleApiRespData struct {
+	ContentEn string `json:"content_en"`
+}
+
+// content 为json字符串
+func GoogleTranslateApi(content string) (contentEnMap map[string]string, err error, errMsg string) {
+	params := make(map[string]interface{})
+	params["content"] = content
+	bytesData, err := json.Marshal(params)
+	if err != nil {
+		err = fmt.Errorf("json.Marshal Err:" + err.Error())
+		return
+	}
+	// 将解析之后的数据转为*Reader类型
+	reader := bytes.NewReader(bytesData)
+	resp, err := http.Post(googleTranslateUrl, "application/json",  reader)
+	if err != nil {
+		errMsg = err.Error()
+		err = fmt.Errorf("调用谷歌翻译接口失败")
+		return
+	}
+	defer resp.Body.Close()
+	if resp.StatusCode != 200  {
+		err = fmt.Errorf("调用谷歌翻译接口失败")
+		errMsg = "Status Code: " + strconv.Itoa(resp.StatusCode)
+		return
+	}
+	body, _ := ioutil.ReadAll(resp.Body)
+	//fmt.Println(string(body))
+	var ret GoogleApiResp
+	err = json.Unmarshal(body, &ret)
+	if err != nil {
+		errMsg = "解析谷歌翻译接口返回值失败 json.Unmarshal Err " +err.Error()
+		err = fmt.Errorf("解析谷歌翻译接口返回值失败")
+		return
+	}
+	if ret.Code != 200 {
+		err = fmt.Errorf(ret.Msg)
+		errMsg = ret.ErrMsg
+		return
+	}
+	contentEnMap = make(map[string]string , 0)
+	err = json.Unmarshal([]byte(ret.Data.ContentEn), &contentEnMap)
+	if err != nil {
+		errMsg = "解析谷歌翻译接口返回值失败2 json.Unmarshal Err " +err.Error()
+		err = fmt.Errorf("解析谷歌翻译接口返回值失败")
+		return
+	}
+	return
+}