[041] 微信公众帐号开发教程第17篇-应用实例之智能翻译

内容概要

本篇文章为大家演示怎样在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译API”实现的。智能翻译是指用户随意输入想要翻译的内容(单词或句子),系统能自己主动识别用户採用的语言,并将其翻译为其它语言,眼下支持的翻译方向:中->英、英->中和日->中。以下我们来看看智能翻译终于做出来的效果:

 

    

 

我们通过输入关键词“翻译”或者点击菜单“翻译”能够看到该功能的使用帮助,然后输入“翻译+内容”就能对内容进行翻译了。

百度翻译API介绍

点击查看百度翻译API使用说明,事实上这份文档已经说的非常具体了,笔者仅仅是将我们调用该接口时最关心的内容摘取出来,主要例如以下:

1)通过发送HTTP GET请求调用百度翻译API。

2)百度翻译API请求地址:

  http://openapi.baidu.com/public/2.0/bmt/translate

3)调用API须要传递from、to、client_id和q四个參数,描写叙述例如以下:

keyvalue描写叙述
from源语言语种:语言代码或auto仅支持特定的语言组合,以下会单独进行说明
to目标语言语种:语言代码或auto仅支持特定的语言组合,以下会单独进行说明
client_id开发人员在百度连接平台上注冊得到的授权API key请阅读怎样获取api key
q待翻译内容该字段必须为UTF-8编码,而且以GET方式调用API时,须要进行urlencode编码。

在调用接口前,我们要先获取到api key。获取方式比較简单,依据提示一步步操作就能够,笔者就不再赘述了。
4)对于智能翻译,參数from和to的传都是auto。
4)參数q的编码方式为UTF-8,传递之前要进行urlencode编码。

5)接口返回结果示比例如以下:

{"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]}

返回结果里的中文是unicode编码,须要通过json_decode进行转换,转换后的示比例如以下:

{"from": "en","to": "zh","trans_result": [{"src": "today","dst": "今天"},{"src": "tomorrow","dst": "明天"}]
}

JSON处理工具包Gson介绍

Gson是Google提供的用于在Java对象和JSON数据之间进行转换的Java类库。通过使用Gson类库,我们能够将JSON字符串转成Java对象,反之亦然。下载地址:https://code.google.com/p/google-gson/downloads/list,Gson的使用比較简单,直接调用它的方法toJson()或fromJson()就能完成对应的转换,但须要注意的是:在使用Gson将json字符串转换成Java对象之前,须要先创建好与目标Java对象。读者能够在维基百科上学习它的使用演示例子http://zh.wikipedia.org/wiki/Gson。

代码实现

1)创建与百度翻译API返回的JSON相对应的Java类

  1. import java.util.List;  
  2.  * 调用百度翻译api查询结果 
  3.  * @author liufeng 
  4.  * @date 2013-10-21 
  5. public class TranslateResult {  
  6.     // 实际採用的源语言  
  7.     private String from;  
  8.     // 实际採用的目标语言  
  9.     private String to;  
  10.     // 结果体  
  11.     private List<ResultPair> trans_result;  
  12.     public String getFrom() {  
  13.         return from;  
  14.     public void setFrom(String from) {  
  15.         this.from = from;  
  16.     public String getTo() {  
  17.         return to;  
  18.     public void setTo(String to) {  
  19.         this.to = to;  
  20.     public List<ResultPair> getTrans_result() {  
  21.         return trans_result;  
  22.     public void setTrans_result(List<ResultPair> trans_result) {  
  23.         this.trans_result = trans_result;  
import java.util.List;/*** 调用百度翻译api查询结果* * @author liufeng* @date 2013-10-21*/
public class TranslateResult {// 实际採用的源语言private String from;// 实际採用的目标语言private String to;// 结果体private List<ResultPair> trans_result;public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public List<ResultPair> getTrans_result() {return trans_result;}public void setTrans_result(List<ResultPair> trans_result) {this.trans_result = trans_result;}
}

注意:这里的类名能够随意取,可是成员变量的名字应于翻译API返回的JSON字符串中的属性名保持一致,否则将JSON转换成TranslateResult对象时会报错。

TranslateResult类中的trans_result属性是一个ResultPair集合,该类的代码例如以下:

  1.  * @author liufeng 
  2.  * @date 2013-10-21 
  3. public class ResultPair {  
  4.     private String src;  
  5.     private String dst;  
  6.     public String getSrc() {  
  7.         return src;  
  8.     public void setSrc(String src) {  
  9.         this.src = src;  
  10.     public String getDst() {  
  11.         return dst;  
  12.     public void setDst(String dst) {  
  13.         this.dst = dst;  
/*** 结果对* * @author liufeng* @date 2013-10-21*/
public class ResultPair {// 原文private String src;// 译文private String dst;public String getSrc() {return src;}public void setSrc(String src) {this.src = src;}public String getDst() {return dst;}public void setDst(String dst) {this.dst = dst;}
}

说明:这两个类的封装是Gson类库所要求的,假设读者不是用Gson解析json字符串,而是用JSON-lib,就沒有必要封装这两个类。

2)接口调用 

  1. import java.io.BufferedReader;  
  2. import java.io.InputStream;  
  3. import java.io.InputStreamReader;  
  4. import java.io.UnsupportedEncodingException;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.URL;  
  7. import com.google.gson.Gson;  
  8.  * @author liufeng 
  9.  * @date 2013-10-21 
  10. public class BaiduTranslateService {  
  11.      * 发起http请求获取返回结果 
  12.      * @param requestUrl 请求地址 
  13.      * @return 
  14.     public static String httpRequest(String requestUrl) {  
  15.         StringBuffer buffer = new StringBuffer();  
  16.             URL url = new URL(requestUrl);  
  17.             HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();  
  18.             httpUrlConn.setDoOutput(false);  
  19.             httpUrlConn.setDoInput(true);  
  20.             httpUrlConn.setUseCaches(false);  
  21.             httpUrlConn.setRequestMethod("GET");  
  22.             httpUrlConn.connect();  
  23.             // 将返回的输入流转换成字符串  
  24.             InputStream inputStream = httpUrlConn.getInputStream();  
  25.             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
  26.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
  27.             String str = null;  
  28.             while ((str = bufferedReader.readLine()) != null) {  
  29.                 buffer.append(str);  
  30.             bufferedReader.close();  
  31.             inputStreamReader.close();  
  32.             // 释放资源  
  33.             inputStream.close();  
  34.             inputStream = null;  
  35.             httpUrlConn.disconnect();  
  36.         } catch (Exception e) {  
  37.         return buffer.toString();  
  38.      * utf编码 
  39.      * @param source 
  40.      * @return 
  41.     public static String urlEncodeUTF8(String source) {  
  42.         String result = source;  
  43.             result = java.net.URLEncoder.encode(source, "utf-8");  
  44.         } catch (UnsupportedEncodingException e) {  
  45.             e.printStackTrace();  
  46.         return result;  
  47.      * 翻译(中->英 英->中 日->中 ) 
  48.      * @param source 
  49.      * @return 
  50.     public static String translate(String source) {  
  51.         String dst = null;  
  52.         // 组装查询地址  
  53.         String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";  
  54.         // 对參数q的值进行urlEncode utf-8编码  
  55.         requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));  
  56.         // 查询并解析结果  
  57.             // 查询并获取返回结果  
  58.             String json = httpRequest(requestUrl);  
  59.             // 通过Gson工具将json转换成TranslateResult对象  
  60.             TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);  
  61.             // 取出translateResult中的译文  
  62.             dst = translateResult.getTrans_result().get(0).getDst();  
  63.         } catch (Exception e) {  
  64.             e.printStackTrace();  
  65.         if (null == dst)  
  66.             dst = "翻译系统异常,请稍候尝试!";  
  67.         return dst;  
  68.     public static void main(String[] args) {  
  69.         // 翻译结果:The network really powerful  
  70.         System.out.println(translate("网络真强大"));  
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;/*** * @author liufeng* @date 2013-10-21*/
public class BaiduTranslateService {/*** 发起http请求获取返回结果* * @param requestUrl 请求地址* @return*/public static String httpRequest(String requestUrl) {StringBuffer buffer = new StringBuffer();try {URL url = new URL(requestUrl);HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();httpUrlConn.setDoOutput(false);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);httpUrlConn.setRequestMethod("GET");httpUrlConn.connect();// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();} catch (Exception e) {}return buffer.toString();}/*** utf编码* * @param source* @return*/public static String urlEncodeUTF8(String source) {String result = source;try {result = java.net.URLEncoder.encode(source, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}/*** 翻译(中->英 英->中 日->中 )* * @param source* @return*/public static String translate(String source) {String dst = null;// 组装查询地址String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";// 对參数q的值进行urlEncode utf-8编码requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));// 查询并解析结果try {// 查询并获取返回结果String json = httpRequest(requestUrl);// 通过Gson工具将json转换成TranslateResult对象TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);// 取出translateResult中的译文dst = translateResult.getTrans_result().get(0).getDst();} catch (Exception e) {e.printStackTrace();}if (null == dst)dst = "翻译系统异常,请稍候尝试!";return dst;}public static void main(String[] args) {// 翻译结果:The network really powerfulSystem.out.println(translate("网络真强大"));}
}

代码解读:
1)第21-53行封装了一个http请求方法httpRequest(),相信读过之前教程的读者已经非常熟悉了。

2)第61-69行封装了一个urlEncodeUTF8()方法,用于对url中的參数进行UTF-8编码。

3)第81行代码中的client_id须要替换成自己申请的api key。

4)第83行代码是对url中的中文进行编码。以后凡是遇到通过url传递中文參数的情况,一定要显示地对中文进行编码,否则非常可能出现程序在本机能正常执行,但部署到server上却有问题,由于本机与server的默认编码方式可能不一样。

5)第88行代码就是调用百度翻译API。

6)第90行代码是使用Gson工具将json字符串转换成TranslateResult对象,是不是发现Gson的使用真的非常easy?另外,前面提到过调用百度翻译API返回的json里假设有中文是用unicode表示的,形如“\u4eca\u5929”,那为什么这里沒有做不论什么处理?由于Gson的内部实现已经帮我们搞定了。

公众账号后台调用

在公众账号后台,须要对接收到的文本消息进行推断,假设是以“翻译”两个字开头的,就认为是在使用智能翻译功能,然后将“翻译”两个字之后的内容作为翻译对象,调用API进行翻译;假设输入的唯独“翻译”两个字,就提示智能翻译功能的使用指南。关键代码例如以下:

  1. // 文本消息   
  2. if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {  
  3.     String content = requestMap.get("Content").trim();  
  4.     if (content.startsWith("翻译")) {  
  5.         String keyWord = content.replaceAll("^翻译", "").trim();  
  6.         if ("".equals(keyWord)) {  
  7.             textMessage.setContent(getTranslateUsage());  
  8.         } else {  
  9.             textMessage.setContent(BaiduTranslateService.translate(keyWord));  
  10.         out.print(WeixinUtil.textMessageToXml(textMessage));  
// 文本消息 
if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {String content = requestMap.get("Content").trim();if (content.startsWith("翻译")) {String keyWord = content.replaceAll("^翻译", "").trim();if ("".equals(keyWord)) {textMessage.setContent(getTranslateUsage());} else {textMessage.setContent(BaiduTranslateService.translate(keyWord));}out.print(WeixinUtil.textMessageToXml(textMessage));}
}

第7行getTranslateUsage()方法得到的就是智能翻译功能的使用指南,代码例如以下:

  1.  * Q译通使用指南 
  2.  * @return 
  3. public static String getTranslateUsage() {  
  4.     StringBuffer buffer = new StringBuffer();  
  5.     buffer.append(XiaoqUtil.emoji(0xe148)).append("Q译通使用指南").append("\n\n");  
  6.     buffer.append("Q译通为用户提供专业的多语言翻译服务,眼下支持以下翻译方向:").append("\n");  
  7.     buffer.append("    中 -> 英").append("\n");  
  8.     buffer.append("    英 -> 中").append("\n");  
  9.     buffer.append("    日 -> 中").append("\n\n");  
  10.     buffer.append("使用演示例子:").append("\n");  
  11.     buffer.append("    翻译我是中国人").append("\n");  
  12.     buffer.append("    翻译dream").append("\n");  
  13.     buffer.append("    翻译さようなら").append("\n\n");  
  14.     buffer.append("回复“?”显示主菜单");  
  15.     return buffer.toString();  
/*** Q译通使用指南* * @return*/
public static String getTranslateUsage() {StringBuffer buffer = new StringBuffer();buffer.append(XiaoqUtil.emoji(0xe148)).append("Q译通使用指南").append("\n\n");buffer.append("Q译通为用户提供专业的多语言翻译服务,眼下支持以下翻译方向:").append("\n");buffer.append("    中 -> 英").append("\n");buffer.append("    英 -> 中").append("\n");buffer.append("    日 -> 中").append("\n\n");buffer.append("使用演示例子:").append("\n");buffer.append("    翻译我是中国人").append("\n");buffer.append("    翻译dream").append("\n");buffer.append("    翻译さようなら").append("\n\n");buffer.append("回复“?”显示主菜单");return buffer.toString();
}

说明:希望通过本例的学习,除了掌握百度翻译API的调用之外,读者还能够掌握json字符串的解析方法,这样就能够自己学会调用许多其他互联网上开放的接口。

假设认为文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰!

转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!

转载于:https://www.cnblogs.com/mfryf/p/3598792.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钉钉上手体会:阿里实用主义的野望

钉钉出自阿里之手&#xff0c;而阿里是电商出身&#xff0c;在移动办公和协同办公方面不算老司机&#xff0c;但钉钉却凭借阿里的背书声称拿下了这个市场的最大份额&#xff0c;甚至超过后面9名的总和&#xff08;数据来源为钉钉官网发布的《2018中国智能移动办公行业趋势报告》…

WAF与IPS的区别总结

谁是最佳选择&#xff1f; Web应用防护无疑是一个热门话题。由于技术的发展成熟和人们对便利性的期望越来越高&#xff0c;Web应用成为主流的业务系统载体。在Web上“安家”的关键业务系统中蕴藏的数据价值引起攻击者的青睐&#xff0c;网上流传的Web漏洞挖掘和攻击工具让攻击的…

企业微信:腾讯的“佛系”办公江湖

、 在协同办公领域&#xff0c;近几年来移动办公伴随着智能手机蓬勃发展起来&#xff0c;特别是腾讯和阿里的入场&#xff0c;改变了业内中小微市场群雄逐鹿的大混战态势&#xff0c;开启了楚汉争霸的局面。相比于钉钉强势的攻城略地&#xff0c;企业微信的“淡定”让人感觉很佛…

Eclipse安装STS插件

Eclipse安装STS插件 1、下载STS插件 地址&#xff1a;https://spring.io/tools/sts/all/ 最上面是已经安装好STS插件的Eclipse软件&#xff0c;可以点击上图红框中的“previous Spring Tool Suite™ versions”&#xff0c;查看其它版本的Eclipse。下面依次为更新文件、更新站…

TFS架构

转载http://www.biaodianfu.com/taobao-tfs.html&#xff0c;感谢原作者标点符。 一、淘宝网的困境 对于淘宝网这样的大型电子商务网站&#xff0c;对于图片服务的要求特别的高。而且对于卖家来说&#xff0c;图片远胜于文字描述&#xff0c;因此卖家也格外看重图片的显示质量、…

(转载)WebStorm 2018.3.2 激活方式(永久)亲测好用!!!!!!

转载链接&#xff1a;https://blog.csdn.net/qq_31279347/article/details/85225234 前言&#xff1a; 总觉的注册码很费事&#xff0c;过一会儿就失效了&#xff0c;博主觉得还是打补丁的方式一劳永逸&#xff0c;很简单&#xff0c;两分钟。 博主版本如下&#xff1a; 第一…

Qt 字符串QString arg()用法总结

原文&#xff1a;http://qimo601.iteye.com/blog/1420750 1、QString::arg()//用字符串变量参数依次替代字符串中最小数值 Cpp代码 QString i "iTest"; // current files number QString total "totalTest"; // number of files to pr…

SVN登录时不断弹出用户名密码输入

** svn换了地址&#xff0c;所以重新定位&#xff0c;在输入账号时&#xff0c;重复报下图&#xff0c;也没有报错&#xff0c;所以就一直无效尝试。期间什么setting clear数据&#xff0c;注册表动文件&#xff0c;搜到的差不多都试了。始终一直报图一的结果。 然后最终结果…

jqgrid 列表条件查询的几步关键操作

jqgrid列表条件查询 记录一下我自己老忘的几个点 这次记录一下使用jqgrid在列表查询时的关键点&#xff0c;过一段时间不用就是忘 1】在html页面用 v-model“q.xxx” xxx是在js处定义。 2】这是js里 在jqgrid查询列表时的模块使用postData 承载参数 3】 这是在定义vue对象时…

wireshark: there are no interfaces on which a capture can be done

权限问题&#xff0c;简单的直接sudo就行。 更安全的做法是&#xff1a; # chmod 4755 /usr/bin/dumpcap dumpcap的所在目录可用whereis命令查看。 转载于:https://www.cnblogs.com/duanguyuan/p/3628569.html

初识:windows下的免费 ssh 客户端工具

如果你的操作系统是 Windows&#xff0c;而你想要连接 Linux 服务器相互传送文件&#xff0c;那么你需要一个简称 SSH 的 Secure Shell 软件。实际上&#xff0c;SSH 是一个网络协议&#xff0c;它允许你通过网络连接到 Linux 和 Unix 服务器。SSH 使用公钥加密来认证远程的计算…

iOS开发之通知中心(NSNotificationCenter)

前言 面向对象的设计思想是把行为方法封装到每一个对象中&#xff0c;以用来增加代码的复用性。正是这种分散封装&#xff0c;增加了对象之间的相互关联&#xff0c;总是有很多的对象需要彼此了解以及相互操作&#xff01; 一个简单示例说明这种交互产生的对象之间的相互依赖&a…

基于AT89C51单片机的8位密码锁仿真与实物制作

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88657969?spm1001.2014.3001.5503 源码获取 C 源码仿真图毕业设计实物制作步骤01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表…

PuTTY配置

目录 1、作用&#xff1f; 2、中文问题解决 &#xff1f; 3、GUI支持&#xff1f; 4、使用密钥对实现安全快捷的无密码登陆? 5、操作习惯&#xff08;AltEnter全屏以及字体配置&#xff09; 6、附录&#xff08;sshd服务器配置&#xff09; 1、作用&#xff1f;PuTTY是一个Tel…

从无到有开发连麦直播技术点整理

最近在跟老师手下的项目&#xff0c;碰到流媒体&#xff0c;流媒体服务器&#xff0c;视频编码技术&#xff0c;推流&#xff0c;拉流等概念&#xff0c;看到本篇博客整理的概念很全面&#xff0c;很自信&#xff0c;故转发留存&#xff0c;感谢原博主。 关键字 采集、前处理、…

从开发小白到音视频专家

音视频方面的技术博客&#xff0c;转发学习 作者&#xff1a;卢俊&#xff0c;七牛云客户端团队技术负责人。拥有丰富的音视频领域的开发和实战经验&#xff0c;先后开发过 Android 播放 SDK、Android 推流 SDK、短视频 SDK&#xff0c;并主导了七牛连麦系统的设计和实现。服务…

node-media-server win环境安装架测试 踩坑记

01 因为老师的项目中需要很多流媒体模块的东西&#xff0c;接触到 Node-Media-Server 这个流媒体服务器&#xff0c;这个国人开发的组件&#xff0c;之前还有SRS也是的。记录一下问题和效果。   本子是win7&#xff0c;之前还有装nodejs时版本的问题&#xff0c;这里插一曲&a…

UIScrollview 技巧

设置UIScrollView的contentSize 如果使用自动布局&#xff0c;那么它会自动帮你基于这个scrollview的子视图的约束来计算这个内容大小。在非自动布局情况下&#xff0c;如果app旋转导致scrollview 的bounds改变&#xff0c;不会影响到scrollview的contentSize&#xff0c;而如果…

NiFi导出自己模板和导入别人模板

NiFi导出模板 进入nifi系统后&#xff0c;选择自己想要导出的流程或者组&#xff08;支持group作为模板导出&#xff09; 点击空白处&#xff0c;右键选择create template 模板文件下载成功 NiFi导入模板 点击空白处&#xff0c;右键选择upload template 查看导入结…

Node.js开发入门(一)——安装Node.js及编辑器配置

Node.js是一个轻松构建快速&#xff0c;可扩展的网络应用平台建立在Chrome的JavaScript运行。Node.js使用事件驱动&#xff0c;非阻塞I/O模型&#xff0c;使得它重量轻&#xff0c;高效&#xff0c;完美的数据密集型实时应用程序运行在分布式设备。 Node.js是让JavaScript脱离浏…