内容概要
本篇文章为大家演示怎样在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译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类
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集合,该类的代码例如以下:
/** * 结果对 * * @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)接口调用
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 powerful System.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进行翻译;假设输入的唯独“翻译”两个字,就提示智能翻译功能的使用指南。关键代码例如以下:
// 文本消息 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()方法得到的就是智能翻译功能的使用指南,代码例如以下:
/** * 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),请尊重他人的辛勤劳动成果,谢谢!