zoukankan      html  css  js  c++  java
  • [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":"u4ecau5929"}]}

    返回结果里的中文是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 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表示的,形如“u4ecau5929”,那为什么这里沒有做不论什么处理?由于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(" ");  
    6.     buffer.append("Q译通为用户提供专业的多语言翻译服务,眼下支持以下翻译方向:").append(" ");  
    7.     buffer.append("    中 -> 英").append(" ");  
    8.     buffer.append("    英 -> 中").append(" ");  
    9.     buffer.append("    日 -> 中").append(" ");  
    10.     buffer.append("使用演示例子:").append(" ");  
    11.     buffer.append("    翻译我是中国人").append(" ");  
    12.     buffer.append("    翻译dream").append(" ");  
    13.     buffer.append("    翻译さようなら").append(" ");  
    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("
    
    ");
    	buffer.append("Q译通为用户提供专业的多语言翻译服务,眼下支持以下翻译方向:").append("
    ");
    	buffer.append("    中 -> 英").append("
    ");
    	buffer.append("    英 -> 中").append("
    ");
    	buffer.append("    日 -> 中").append("
    
    ");
    	buffer.append("使用演示例子:").append("
    ");
    	buffer.append("    翻译我是中国人").append("
    ");
    	buffer.append("    翻译dream").append("
    ");
    	buffer.append("    翻译さようなら").append("
    
    ");
    	buffer.append("回复“?”显示主菜单");
    	return buffer.toString();
    }

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

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

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

  • 相关阅读:
    漏斗算法 java
    servlet request参数只能取一次解决方法
    redis的使用
    关于Http协议与TCP协议的一些简单理解
    OSI七层与TCP/IP五层网络架构详解
    linux命令详解——eval
    使用apache benchmark(ab) 测试报错: apr_socket_recv: Connection timed out (110)
    hadoop相关随记
    mesos-master启动失败,报错Failed to load unknown flag 'quorum.rpmsave'
    根目录/缺少执行权限x产生的两种错误
  • 原文地址:https://www.cnblogs.com/mfryf/p/3598792.html
Copyright © 2011-2022 走看看