对腾讯AI机器翻译接口的调用

在上一次文字识别代码的基础上,进行了改进,代码结构优化了一点(我认为···)

开完账号,加好应用能力,安装好依赖包,按代码最后的提示改成http(如果要在其他页面中访问,就需要设置 https),就可以启动服务了。浏览器输入 http://localhost:8203/trans/to/zh?text=hello 进行测试
我测试用的前端代码也已给出(本来的目的是要实现一个小插件)
其中Param 及其方法可以用于腾讯 AI 其他 Api 调用,例:
OCR文字识别

package mainimport ("bytes""crypto/md5""encoding/hex""fmt""github.com/gin-gonic/gin""github.com/unrolled/secure""io/ioutil""log""net/http""net/url""sort""strings""time"
)/*
可以直接拿去使用
把自己开通好的 id 和 key 换了就可以,需要在应用中添加对应能力
返回的数据是没有进行json解析,添加自定义的 status 之后直接返回到前端解析*/var (// 自己去官网开账号,开应用appId  = "*"appKey = "*"
)// 为了排序
type Param struct {key, value string
}func SortParams(p []Param) {// 升序sort.Slice(p, func(i, j int) bool {if p[i].key < p[j].key {return true}return false})
}func ParamsToString(p []Param) string {s := ""for _, v := range p {if v.value == "" {continue}// value 需要进行 url 编码s += v.key + "=" + url.QueryEscape(v.value) + "&"}return s[:len(s)-1]
}func PostToTansApi(text, target string) (s []byte, ok bool) {client := http.Client{}params := make([]Param, 0, 10)params = append(params, Param{"app_id", appId})params = append(params, Param{"source", "auto"})params = append(params, Param{"target", target})params = append(params, Param{"text", text})// 随便啥都行,非空且长度小于32params = append(params, Param{"nonce_str", "asbfiuasbhjbcuicg"})params = append(params, Param{"time_stamp", fmt.Sprintf("%d", time.Now().Unix())})// 取得动态加密标志,获取bodyparams = getSign(params)form := ParamsToString(params)body := bytes.NewBufferString(form)request, err := http.NewRequest("POST", "https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate", body)if err != nil {log.Println(err)return}// 重要的!!!request.Header.Set("Content-Type", "application/x-www-form-urlencoded")response, err := client.Do(request)if err != nil {log.Println(err)return}defer response.Body.Close()s, err = ioutil.ReadAll(response.Body)if err != nil {log.Println(err)return}return s, true
}func getSign(p []Param) []Param {s := strings.Builder{}SortParams(p)s.WriteString(ParamsToString(p))s.WriteString("&app_key=" + appKey)// MD5hash := md5.New()hash.Write([]byte(s.String()))encodeToString := strings.ToUpper(hex.EncodeToString(hash.Sum(nil)))p = append(p, Param{"sign", encodeToString})return p
}func TansToZHHandle(c *gin.Context) {text, ok := c.GetQuery("text")if !ok || text == "" {c.JSON(http.StatusOK, map[string]string{"status": "no", "msg": "参数呢"})return}s, ok := PostToTansApi(text, "zh")if !ok {c.JSON(http.StatusOK, map[string]string{"status": "no", "msg": "不可能出现的错误,多次失败请联系管理员"})return}c.JSON(http.StatusOK, map[string]string{"status": "ok", "msg": string(s)})
}func TansToENHandle(c *gin.Context) {text, ok := c.GetQuery("text")if !ok || text == "" {c.JSON(http.StatusOK, map[string]string{"status": "no", "msg": "参数呢"})return}s, ok := PostToTansApi(text, "en")if !ok {c.JSON(http.StatusOK, map[string]string{"status": "no", "msg": "不可能出现的错误,多次失败请联系管理员"})return}c.JSON(http.StatusOK, map[string]string{"status": "ok", "msg": string(s)})
}func AllowControl(c *gin.Context) {c.Header("Access-Control-Allow-Origin", "*")
}func TlsHandler(c *gin.Context) {secureMiddleware := secure.New(secure.Options{SSLRedirect: true,SSLHost:     ":8203",})err := secureMiddleware.Process(c.Writer, c.Request)if err != nil {log.Println(err)return}
}func main() {gin.SetMode(gin.ReleaseMode)r := gin.Default()r.Use(TlsHandler)r.Use(AllowControl){r.GET("trans/to/zh", TansToZHHandle)r.GET("trans/to/en", TansToENHandle)}err := r.RunTLS(":8203", "*.pem", "*.key")if err != nil {panic(err)}
}/*
本地测试注释掉
r.Use(TlsHandler())
改
err := r.RunTLS(":8203", "*.pem", "*.key")
为
err := r.Run(":8203")
*/

前端示例

  • 这里设置了按 ` 显示/隐藏 ESC下面的
  • 仅提供参考,如果我的实例不能访问,替换为本地开启的服务 http://localhost:8203/* 或其他。。。
  • 如果需要,样式大小自行修改
  • 嗯。。希望能有点用吧
<!doctype html>
<html lang="ch">
<head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><script src="https://cdn.jsdelivr.net/npm/vue"></script><script src="https://unpkg.com/axios/dist/axios.min.js"></script><style>#trans-container {top: 200px;left: 200px;margin: 0 auto;border-radius: 8px;box-shadow: 0 0 0 -20px rgba(0, 0, 0, .2), 0 24px 38px 3px rgba(0, 0, 0, .14), 0 9px 46px 8px rgba(0, 0, 0, .12);position: fixed;background: rgba(255, 255, 255, 0.95);width: 150px;max-height: 100px;overflow: auto;opacity: 40%;z-index: 999999999;}#trans-container div p,#trans-container div input {font-weight: 100;padding: 0;margin: 0;}#trans-container div input{border-width: 0;}#trans-container div input:focus{outline: none;}#trans-container::-webkit-scrollbar {display: none;}[v-cloak] {display: none}</style>
</head>
<body>
<div id="trans-container" @mousedown="move" v-cloak v-show="show"><div style="text-align: center;"><input type="text" v-model="text" placeholder="翻译,在此输入" @keypress.enter="send"style="width: 100%;text-align: center;"></div><div><p v-text="ret"></p></div>
</div>
</body>
<script>let pattern = new RegExp("[\u4E00-\u9FA5]+");function getTrans(text) {if (pattern.test(text)) {if (window.top.transapp)getEN(text)} else {if (window.top.transapp)getZH(text)}}function getZH(text) {axios.get('https:ligaofeng.top:8203/trans/to/zh?text=' + text).then(function (response) {let data = response.data;if (data["status"] == "ok") {data = data.msg;data = JSON.parse(data);if (data.ret!=0){console.log(data.msg)window.top.transapp.ret = "翻译失败";return}window.top.transapp.ret = data.data.target_text;} else {console.log(data.msg)window.top.transapp.ret = "翻译失败";}}).catch(function (error) {console.log(error);window.top.transapp.ret = "翻译失败";});}function getEN(text) {axios.get('https:ligaofeng.top:8203/trans/to/en?text=' + text).then(function (response) {let data = response.data;if (data["status"] == "ok") {data = data.msg;data = JSON.parse(data);if (data.ret!=0){console.log(data.msg)window.top.transapp.ret = "翻译失败";return}window.top.transapp.ret = data.data.target_text;} else {console.log(data.msg)window.top.transapp.ret = "翻译失败";}}).catch(function (error) {console.log(error);window.top.transapp.ret = "翻译失败";});}window.top.addEventListener("keypress", function (ev) {switch (ev.key) {case "`":if (!window.top.transapp)window.top.transapp = new Vue({el: "#trans-container",data: {text: "",ret: "",positionX: 0,positionY: 0,show: true},methods: {send() {if (this.text) {this.ret = "获取中。。。"getTrans(this.text)this.text = ""}},move(e) {let odiv = document.getElementById("trans-container");let disX = e.clientX - odiv.offsetLeft;let disY = e.clientY - odiv.offsetTop;document.onmousemove = (e) => {let left = e.clientX - disX;let top = e.clientY - disY;this.positionX = top;this.positionY = left;odiv.style.left = left + 'px';odiv.style.top = top + 'px';};document.onmouseup = () => {document.onmousemove = null;document.onmouseup = null;};},}})elsewindow.top.transapp.show = !window.top.transapp.showbreak}})
</script>
</html>

golang 腾讯AI 机器翻译调用 实现中英互译服务相关推荐

  1. woocommerce产品选项描述修改_简历修改服务:中文修改、英文修改、中英互译、简历定制,名师一对一指导修改!...

    简历,是你接触 HR 的第一步 如果你无法通过简历敲开大门 你面试能力再强,综合素质再高,都无用! 做了那么多网申,投了那么多简历.都是是石沉大海,渺无音讯.你就不想想,是简历有问题吗? 简历是找实习 ...

  2. 中英互译软件工程设计

    中英互译软件工程设计 引言部分 1.1 目的 该文档的目的是描述中英互译软件工程系统的概要设计,主要内容包括系统功能简介.系统结构设计.系统接口设计.模块设计和界面设计等. 本文档预期的读者包括设计人 ...

  3. IntelliJ IDEA/Android Studio 翻译插件,可中英互译。

    TranslationPlugin 项目地址:YiiGuxing/TranslationPlugin 简介:IntelliJ IDEA/Android Studio 翻译插件,可中英互译.    In ...

  4. 中英互译软件测试计划

    中英互译软件测试计划 1.引言 1.1   编写目的 测试软件的中英互译能力,通过给出中文单独的字,句,英文的单独单词,句子以及中英混合,查看翻译结果来确定软件的实用性和准确度. 1.2   项目背景 ...

  5. 中英互译软件工程初步设计

    中英互译软件工程初步设计 引言部分 1.1 目的 该文档的目的是描述中英互译软件工程系统的概要设计,主要内容包括系统功能简介.系统结构设计.系统接口设计.模块设计和界面设计等. 本文档预期的读者包括设 ...

  6. 中英互译在线翻译官方版

    中英互译在线翻译 v6.2.5 官方版 软件大小:26.9MB 软件语言:简体中文 软件类别:转换翻译 软件授权:官方版 更新时间:2015-01-05 应用平台:/Win8/Win7/WinXP 中 ...

  7. 怎样快速实现整篇文档中英互译

    对于一篇中文word文档,怎么才能快速翻译成纯英文的呢?有很多同学说可以将里面的文字直接复制进浏览器进行翻译,在将其拷贝出来即可,但是对于一个几十页的文档而言,这样操作显然不是很高效.下面将文字翻译的 ...

  8. 怎样快速实现整篇文档中英互译?这里有简单的方法

    对于一篇中文word文档,怎么才能快速翻译成纯英文的呢?有很多同学说可以将里面的文字直接复制进浏览器进行翻译,在将其拷贝出来即可,但是对于一个几十页的文档而言,这样操作显然不是很高效.下面将文字翻译的 ...

  9. 非常简单的中英互译在线翻译操作方法

    非常简单的中英互译在线翻译操作方法?无论在工作中还是生活中,我们总能遇到各种翻译问题,尤其是中英文翻译,但是很多人的英文都不好,比如小编.那么如何快捷而又专业的完成中英互译呢?如果你不知道这个问题该如 ...

最新文章

  1. LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
  2. 99%的人都不知道的品牌冷知识
  3. vilatile 深入理解java虚拟机_《深入理解Java虚拟机》笔记 第十二章 volatile变量
  4. mysql 游标 navigate_MySQL游标的概念介绍和游标的使用讲解
  5. ajax走到error_jQuery中ajax 跳入error的原因总结
  6. php离线地图,如何发布百度离线地图及二次开发API
  7. scrollIntoView()窗口滚动
  8. 安装ESXI 5.5卡在LSI_MR3.V00解决方案
  9. 腾讯 android 插件,腾讯 Bugly for Xamarin Android 的插件
  10. 如何在Adobe Illustrator中绘制花园里的小矮人
  11. 论文阅读笔记:内卷involution《Involution: Inverting the Inherence of Convolution for Visual Recognition》
  12. STM32单片机介绍2
  13. 2008年国外最漂亮的50个网站欣赏
  14. 动作电位的产生和动作电位的长距离高速传导
  15. Google Earth网页版初探
  16. P1010 [NOIP1998 普及组] 幂次方 题解
  17. 专访 | 外媒看FAST:刘慈欣说的黑暗森林法则成立吗
  18. 从0到1一个文件,用Python 实现 Web 框架
  19. Python高效替代Excel了,你会吗?
  20. 【数组】雇佣 K 名工人的最低成本

热门文章

  1. 任务驱动在中职计算机课中的应用,论任务驱动教学法在中职计算机基础课上的应用...
  2. 开源论坛框架调研总结
  3. Excel批量合并相同内容单元格操作——WPS太秀了
  4. 大神教你如何优化变压器匝间电容?
  5. 初识vue——vue的发展历程
  6. 解决 CLion 出现中文乱码问题【亲测有效】
  7. 互联网+废品回收小程序,废品回收小程序,废品回收小程序平台,蚂蚁废收小程序
  8. Linux环境安装+阿里云+jdk8
  9. Mysql各种缩写含义
  10. .net 导出excel_使用 EasyPOI 优雅导出Excel模板数据(含图片)