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),请尊重他人的辛勤劳动成果,谢谢!

  • 相关阅读:
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (四) 自动化部署
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (三) 服务观测
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (二) 部署微服务程序
    阿里云 k8s 部署 Spring Cloud Alibaba 微服务实践 (一) 部署 Nacos
    C++知识点
    libmkl 学习笔记
    基于tesseract-OCR进行中文识别
    poco编译与运行
    Linux下的I/O复用与epoll详解(转载)
    高并发网络编程之epoll详解(转载)
  • 原文地址:https://www.cnblogs.com/mfryf/p/3598792.html
Copyright © 2011-2022 走看看