内容概要
本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译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编码。 |
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类
- importjava.util.List;
- /**
- *调用百度翻译api查询结果
- *
- *@authorliufeng
- *@date2013-10-21
- */
- publicclassTranslateResult{
- //实际采用的源语言
- privateStringfrom;
- //实际采用的目标语言
- privateStringto;
- //结果体
- privateList<ResultPair>trans_result;
- publicStringgetFrom(){
- returnfrom;
- }
- publicvoidsetFrom(Stringfrom){
- this.from=from;
- }
- publicStringgetTo(){
- returnto;
- }
- publicvoidsetTo(Stringto){
- this.to=to;
- }
- publicList<ResultPair>getTrans_result(){
- returntrans_result;
- }
- publicvoidsetTrans_result(List<ResultPair>trans_result){
- this.trans_result=trans_result;
- }
- }
TranslateResult类中的trans_result属性是一个ResultPair集合,该类的代码如下:
- /**
- *结果对
- *
- *@authorliufeng
- *@date2013-10-21
- */
- publicclassResultPair{
- //原文
- privateStringsrc;
- //译文
- privateStringdst;
- publicStringgetSrc(){
- returnsrc;
- }
- publicvoidsetSrc(Stringsrc){
- this.src=src;
- }
- publicStringgetDst(){
- returndst;
- }
- publicvoidsetDst(Stringdst){
- this.dst=dst;
- }
- }
2)接口调用
- importjava.io.BufferedReader;
- importjava.io.InputStream;
- importjava.io.InputStreamReader;
- importjava.io.UnsupportedEncodingException;
- importjava.net.HttpURLConnection;
- importjava.net.URL;
- importcom.google.gson.Gson;
- /**
- *
- *@authorliufeng
- *@date2013-10-21
- */
- publicclassBaiduTranslateService{
- /**
- *发起http请求获取返回结果
- *
- *@paramrequestUrl请求地址
- *@return
- */
- publicstaticStringhttpRequest(StringrequestUrl){
- StringBufferbuffer=newStringBuffer();
- try{
- URLurl=newURL(requestUrl);
- HttpURLConnectionhttpUrlConn=(HttpURLConnection)url.openConnection();
- httpUrlConn.setDoOutput(false);
- httpUrlConn.setDoInput(true);
- httpUrlConn.setUseCaches(false);
- httpUrlConn.setRequestMethod("GET");
- httpUrlConn.connect();
- //将返回的输入流转换成字符串
- InputStreaminputStream=httpUrlConn.getInputStream();
- InputStreamReaderinputStreamReader=newInputStreamReader(inputStream,"utf-8");
- BufferedReaderbufferedReader=newBufferedReader(inputStreamReader);
- Stringstr=null;
- while((str=bufferedReader.readLine())!=null){
- buffer.append(str);
- }
- bufferedReader.close();
- inputStreamReader.close();
- //释放资源
- inputStream.close();
- inputStream=null;
- httpUrlConn.disconnect();
- }catch(Exceptione){
- }
- returnbuffer.toString();
- }
- /**
- *utf编码
- *
- *@paramsource
- *@return
- */
- publicstaticStringurlEncodeUTF8(Stringsource){
- Stringresult=source;
- try{
- result=java.net.URLEncoder.encode(source,"utf-8");
- }catch(UnsupportedEncodingExceptione){
- e.printStackTrace();
- }
- returnresult;
- }
- /**
- *翻译(中->英英->中日->中)
- *
- *@paramsource
- *@return
- */
- publicstaticStringtranslate(Stringsource){
- Stringdst=null;
- //组装查询地址
- StringrequestUrl="http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";
- //对参数q的值进行urlEncodeutf-8编码
- requestUrl=requestUrl.replace("{keyWord}",urlEncodeUTF8(source));
- //查询并解析结果
- try{
- //查询并获取返回结果
- Stringjson=httpRequest(requestUrl);
- //通过Gson工具将json转换成TranslateResult对象
- TranslateResulttranslateResult=newGson().fromJson(json,TranslateResult.class);
- //取出translateResult中的译文
- dst=translateResult.getTrans_result().get(0).getDst();
- }catch(Exceptione){
- e.printStackTrace();
- }
- if(null==dst)
- dst="翻译系统异常,请稍候尝试!";
- returndst;
- }
- publicstaticvoidmain(String[]args){
- //翻译结果:Thenetworkreallypowerful
- 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传递中文参数的情况,一定要显示地对中文进行编码,否则很可能出现程序在本机能正常运行,但部署到服务器上却有问题,因为本机与服务器的默认编码方式可能不一样。
5)第88行代码就是调用百度翻译API。
6)第90行代码是使用Gson工具将json字符串转换成TranslateResult对象,是不是发现Gson的使用真的很简单?另外,前面提到过调用百度翻译API返回的json里如果有中文是用unicode表示的,形如“\u4eca\u5929”,那为什么这里没有做任何处理?因为Gson的内部实现已经帮我们搞定了。
公众账号后台调用
在公众账号后台,需要对接收到的文本消息进行判断,如果是以“翻译”两个字开头的,就认为是在使用智能翻译功能,然后将“翻译”两个字之后的内容作为翻译对象,调用API进行翻译;如果输入的只有“翻译”两个字,就提示智能翻译功能的使用指南。关键代码如下:
- //文本消息
- if(WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)){
- Stringcontent=requestMap.get("Content").trim();
- if(content.startsWith("翻译")){
- StringkeyWord=content.replaceAll("^翻译","").trim();
- if("".equals(keyWord)){
- textMessage.setContent(getTranslateUsage());
- }else{
- textMessage.setContent(BaiduTranslateService.translate(keyWord));
- }
- out.print(WeixinUtil.textMessageToXml(textMessage));
- }
- }
- /**
- *Q译通使用指南
- *
- *@return
- */
- publicstaticStringgetTranslateUsage(){
- StringBufferbuffer=newStringBuffer();
- 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("回复“?”显示主菜单");
- returnbuffer.toString();
- }
说明:希望通过本例的学习,除了掌握百度翻译API的调用之外,读者还能够掌握json字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot来支持柳峰!
转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!