首页 > QQ技巧 > 柳峰微信公众平台开发教程第17篇-应用实例之智...

柳峰微信公众平台开发教程第17篇-应用实例之智能翻译

时间:2015-01-11 13:27 作者:柳峰 我要评论

内容概要
本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译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)接口返回结果示例如下:
 
  1. {"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]} 
返回结果里的中文是unicode编码,需要通过json_decode进行转换,转换后的示例如下:
 
  1.     "from": "en", 
  2.     "to": "zh", 
  3.     "trans_result": [ 
  4.         { 
  5.             "src": "today", 
  6.             "dst": "今天" 
  7.         }, 
  8.         { 
  9.             "src": "tomorrow", 
  10.             "dst": "明天" 
  11.         } 
  12.     ] 
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.    
  3. /**  
  4.  * 调用百度翻译api查询结果  
  5.  *   
  6.  * @author liufeng  
  7.  * @date 2013-10-21  
  8.  */   
  9. public class TranslateResult {   
  10.     // 实际采用的源语言   
  11.     private String from;   
  12.     // 实际采用的目标语言   
  13.     private String to;   
  14.     // 结果体   
  15.     private List<ResultPair> trans_result;   
  16.    
  17.     public String getFrom() {   
  18.         return from;   
  19.     }   
  20.    
  21.     public void setFrom(String from) {   
  22.         this.from = from;   
  23.     }   
  24.    
  25.     public String getTo() {   
  26.         return to;   
  27.     }   
  28.    
  29.     public void setTo(String to) {   
  30.         this.to = to;   
  31.     }   
  32.    
  33.     public List<ResultPair> getTrans_result() {   
  34.         return trans_result;   
  35.     }   
  36.    
  37.     public void setTrans_result(List<ResultPair> trans_result) {   
  38.         this.trans_result = trans_result;   
  39.     }   
  40. }   
 
注意:这里的类名可以任意取,但是成员变量的名字应于翻译API返回的JSON字符串中的属性名保持一致,否则将JSON转换成TranslateResult对象时会报错。
TranslateResult类中的trans_result属性是一个ResultPair集合,该类的代码如下:
 
  1. /**  
  2.  * 结果对  
  3.  *   
  4.  * @author liufeng  
  5.  * @date 2013-10-21  
  6.  */   
  7. public class ResultPair {   
  8.     // 原文   
  9.     private String src;   
  10.     // 译文   
  11.     private String dst;   
  12.    
  13.     public String getSrc() {   
  14.         return src;   
  15.     }   
  16.    
  17.     public void setSrc(String src) {   
  18.         this.src = src;   
  19.     }   
  20.    
  21.     public String getDst() {   
  22.         return dst;   
  23.     }   
  24.    
  25.     public void setDst(String dst) {   
  26.         this.dst = dst;   
  27.     }   
  28. }   
 
说明:这两个类的封装是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.    
  9. /**  
  10.  *   
  11.  * @author liufeng  
  12.  * @date 2013-10-21  
  13.  */   
  14. public class BaiduTranslateService {   
  15.     /**  
  16.      * 发起http请求获取返回结果  
  17.      *   
  18.      * @param requestUrl 请求地址  
  19.      * @return  
  20.      */   
  21.     public static String httpRequest(String requestUrl) {   
  22.         StringBuffer buffer = new StringBuffer();   
  23.         try {   
  24.             URL url = new URL(requestUrl);   
  25.             HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();   
  26.    
  27.             httpUrlConn.setDoOutput(false);   
  28.             httpUrlConn.setDoInput(true);   
  29.             httpUrlConn.setUseCaches(false);   
  30.    
  31.             httpUrlConn.setRequestMethod("GET");   
  32.             httpUrlConn.connect();   
  33.    
  34.             // 将返回的输入流转换成字符串   
  35.             InputStream inputStream = httpUrlConn.getInputStream();   
  36.             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");   
  37.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader);   
  38.    
  39.             String str = null;   
  40.             while ((str = bufferedReader.readLine()) != null) {   
  41.                 buffer.append(str);   
  42.             }   
  43.             bufferedReader.close();   
  44.             inputStreamReader.close();   
  45.             // 释放资源   
  46.             inputStream.close();   
  47.             inputStream = null;   
  48.             httpUrlConn.disconnect();   
  49.    
  50.         } catch (Exception e) {   
  51.         }   
  52.         return buffer.toString();   
  53.     }   
  54.    
  55.     /**  
  56.      * utf编码  
  57.      *   
  58.      * @param source  
  59.      * @return  
  60.      */   
  61.     public static String urlEncodeUTF8(String source) {   
  62.         String result = source;   
  63.         try {   
  64.             result = java.net.URLEncoder.encode(source, "utf-8");   
  65.         } catch (UnsupportedEncodingException e) {   
  66.             e.printStackTrace();   
  67.         }   
  68.         return result;   
  69.     }   
  70.    
  71.     /**  
  72.      * 翻译(中->英 英->中 日->中 )  
  73.      *   
  74.      * @param source  
  75.      * @return  
  76.      */   
  77.     public static String translate(String source) {   
  78.         String dst = null;   
  79.    
  80.         // 组装查询地址   
  81.         String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";   
  82.         // 对参数q的值进行urlEncode utf-8编码   
  83.         requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));   
  84.    
  85.         // 查询并解析结果   
  86.         try {   
  87.             // 查询并获取返回结果   
  88.             String json = httpRequest(requestUrl);   
  89.             // 通过Gson工具将json转换成TranslateResult对象   
  90.             TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);   
  91.             // 取出translateResult中的译文   
  92.             dst = translateResult.getTrans_result().get(0).getDst();   
  93.         } catch (Exception e) {   
  94.             e.printStackTrace();   
  95.         }   
  96.    
  97.         if (null == dst)   
  98.             dst = "翻译系统异常,请稍候尝试!";   
  99.         return dst;   
  100.     }   
  101.    
  102.     public static void main(String[] args) {   
  103.         // 翻译结果:The network really powerful   
  104.         System.out.println(translate("网络真强大"));   
  105.     }   
  106. }  
 
代码解读:
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进行翻译;如果输入的只有“翻译”两个字,就提示智能翻译功能的使用指南。关键代码如下:
 
  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.         }   
  11.         out.print(WeixinUtil.textMessageToXml(textMessage));   
  12.     }   
  13. }   
  14. 7行getTranslateUsage()方法得到的就是智能翻译功能的使用指南,代码如下: 
  15. [java] view plaincopy 
  16. /**  
  17.  * Q译通使用指南  
  18.  *   
  19.  * @return  
  20.  */   
  21. public static String getTranslateUsage() {   
  22.     StringBuffer buffer = new StringBuffer();   
  23.     buffer.append(XiaoqUtil.emoji(0xe148)).append("Q译通使用指南").append("\n\n");   
  24.     buffer.append("Q译通为用户提供专业的多语言翻译服务,目前支持以下翻译方向:").append("\n");   
  25.     buffer.append("    中 -> 英").append("\n");   
  26.     buffer.append("    英 -> 中").append("\n");   
  27.     buffer.append("    日 -> 中").append("\n\n");   
  28.     buffer.append("使用示例:").append("\n");   
  29.     buffer.append("    翻译我是中国人").append("\n");   
  30.     buffer.append("    翻译dream").append("\n");   
  31.     buffer.append("    翻译さようなら").append("\n\n");   
  32.     buffer.append("回复“?”显示主菜单");   
  33.     return buffer.toString();   
  34. }   
 
说明:希望通过本例的学习,除了掌握百度翻译API的调用之外,读者还能够掌握json字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。

标签: 微信公众平台开发
顶一下
(0)
0%
踩一下
(0)
0%

Google提供的广告