内容概要

本篇文章为大家演示怎样在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译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四个參数,描写叙述例如以下:

key value 描写叙述
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

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

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

    内容概要 本篇文章为大家演示如何在微信公众帐号上实现"智能翻译",本例中翻译功能是通过调用"百度翻译API"实现的.智能翻译是指用户任意输入想要翻译的内容(单词 ...

  2. 微信公众帐号开发教程第16篇-应用实例之历史上的今天

    内容概要 本篇文章主要讲解如何在微信公众帐号上实现"历史上的今天"功能.这个例子本身并不复杂,但希望通过对它的学习,读者能够对正则表达式有一个新的认识,能够学会运用现有的网络资源丰 ...

  3. 微信公众帐号开发教程第18篇-应用实例之音乐搜索

    引言及内容概要 微信公众平台支持向用户回复音乐消息,用户收到音乐消息后,点击即可播放音乐.通过音乐消息,公众账号可以实现音乐搜索(歌曲点播)功能,即用户输入想听的音乐名称,公众账号返回对应的音乐(歌曲 ...

  4. [042] 微信公众帐号开发教程第18篇-应用实例之音乐搜索

    引言及内容概要 微信公众平台支持向用户回复音乐消息,用户收到音乐消息后,点击即可播放音乐.通过音乐消息,公众账号可以实现音乐搜索(歌曲点播)功能,即用户输入想听的音乐名称,公众账号返回对应的音乐(歌曲 ...

  5. 微信公众帐号开发教程第6篇-消息及消息处理工具的封装

    本篇内容主要讲解如何将微信公众平台定义的消息及消息相关的操作封装成工具类,方面后期的使用  官方文档 接下来要做的就是将消息请求.回复中定义的消息进行封装,建立与之对应的Java类(Java是一门面向 ...

  6. 微信公众帐号开发教程第1篇-引言(转)

    接触微信公众帐号已经有两个多月的时间了,在这期间,除了陆续完好个人公众帐号xiaoqrobot以外,还带领团队为公司开发了两个企业应用:一个是普通类型的公众帐号,还有一个是会议类型的公众帐号.经过这3 ...

  7. 微信公众帐号开发教程第13篇-图文消息全攻略

    引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本 ...

  8. [025] 微信公众帐号开发教程第1篇-引言

    接触微信公众帐号已经有两个多月的时间了,在这期间,除了陆续完善个人公众帐号xiaoqrobot以外,还带领团队为公司开发了两个企业应用:一个是普通类型的公众帐号,另一个是会议类型的公众帐号.经过这3个 ...

  9. 微信公众帐号开发教程第13篇-图文消息全攻略 -- 转载

    引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本 ...

最新文章

  1. 在坚持了15年后,我毅然决定离开 Linux,投入 Mac 的怀抱
  2. linux内核网络协议栈--br_pass_frame_up和br_forward(二十九)
  3. Fileupload-1.2.1使用简单样例
  4. Boost Asio总结(3)异步通信
  5. html模板 循环里if,django模板里循环变量table里想要两个一行如何控制
  6. java 中的堆和栈
  7. 图像处理-RBG图像和灰度图像
  8. 评论中显示表情,苹果和安卓都一样
  9. 香蕉派开源硬件 Banana PI
  10. linux 读取 ntfs硬盘,嵌入式linux下ntfs格式的硬盘读写方法
  11. 小白Linux入门之:终端复用器Tmux使用参考
  12. OpenCV绘制多边形的代码
  13. 电信光猫改桥接还在苦苦破解超级密码吗?
  14. ckplayer超酷网页播放器
  15. EXCEL滚动条控件制作动态图表
  16. 药易通显示rpc服务器不可用,药易通8825-8826日常问题语句归档教程方案.docx
  17. One Last Kiss风格封面生成器;程序内存分析工具;Python入门课程资料;神经文本语音合成教程;前沿论文 | ShowMeAI资讯日报
  18. Raki的读paper小记:REPRESENTATIONAL CONTINUITY FOR UNSUPERVISED CONTINUAL LEARNING
  19. python中的内置函数总结
  20. POJ 2818:密码

热门文章

  1. bundle 安装_超级小白使用pip安装第三方库的正确姿势
  2. pc个人微型计算机ppt,《IBMPC微型计算机》PPT课件.ppt
  3. mysql ssd优化_mysql ssd 优化
  4. android启动页面显示空白,android – 启动时的空白页面
  5. android content item,Android中ContentProvider的应用实例
  6. 用程序同步mysql数据库表_初次用Java写了个数据库表同步工具
  7. mysql中的钱null_MySQL数据库中null的知识点总结
  8. des java c_这个des加密,到底是用的哪种类型?
  9. 目标检测_目标检测: AnchorFree 时代
  10. c语言5的阶乘流程图_5 种前途迷茫的编程语言