內(nèi)容概要
本篇文章為大家演示怎樣在微信公眾帳號(hào)上實(shí)現(xiàn)“智能翻譯”,本例中翻譯功能是通過(guò)調(diào)用“百度翻譯API”實(shí)現(xiàn)的。智能翻譯是指用戶隨意輸入想要翻譯的內(nèi)容(單詞或句子),系統(tǒng)能自己主動(dòng)識(shí)別用戶採(cǎi)用的語(yǔ)言,并將其翻譯為其它語(yǔ)言,眼下支持的翻譯方向:中->英、英->中和日->中。以下我們來(lái)看看智能翻譯終于做出來(lái)的效果:
?
? ??
?
我們通過(guò)輸入關(guān)鍵詞“翻譯”或者點(diǎn)擊菜單“翻譯”能夠看到該功能的使用幫助,然后輸入“翻譯+內(nèi)容”就能對(duì)內(nèi)容進(jìn)行翻譯了。
百度翻譯API介紹
點(diǎn)擊查看百度翻譯API使用說(shuō)明,事實(shí)上這份文檔已經(jīng)說(shuō)的非常具體了,筆者僅僅是將我們調(diào)用該接口時(shí)最關(guān)心的內(nèi)容摘取出來(lái),主要例如以下:
1)通過(guò)發(fā)送HTTP GET請(qǐng)求調(diào)用百度翻譯API。
2)百度翻譯API請(qǐng)求地址:
http://openapi.baidu.com/public/2.0/bmt/translate
3)調(diào)用API須要傳遞from、to、client_id和q四個(gè)參數(shù),描寫(xiě)敘述例如以下:
keyvalue描寫(xiě)敘述
| from | 源語(yǔ)言語(yǔ)種:語(yǔ)言代碼或auto | 僅支持特定的語(yǔ)言組合,以下會(huì)單獨(dú)進(jìn)行說(shuō)明 |
| to | 目標(biāo)語(yǔ)言語(yǔ)種:語(yǔ)言代碼或auto | 僅支持特定的語(yǔ)言組合,以下會(huì)單獨(dú)進(jìn)行說(shuō)明 |
| client_id | 開(kāi)發(fā)人員在百度連接平臺(tái)上注冊(cè)得到的授權(quán)API key | 請(qǐng)閱讀怎樣獲取api key |
| q | 待翻譯內(nèi)容 | 該字段必須為UTF-8編碼,而且以GET方式調(diào)用API時(shí),須要進(jìn)行urlencode編碼。 |
在調(diào)用接口前,我們要先獲取到api key。獲取方式比較簡(jiǎn)單,依據(jù)提示一步步操作就能夠,筆者就不再贅述了。
4)對(duì)于智能翻譯,參數(shù)from和to的傳都是auto。
4)參數(shù)q的編碼方式為UTF-8,傳遞之前要進(jìn)行urlencode編碼。
5)接口返回結(jié)果示比例如以下:
{"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]}
返回結(jié)果里的中文是unicode編碼,須要通過(guò)json_decode進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換后的示比例如以下:
{"from": "en","to": "zh","trans_result": [{"src": "today","dst": "今天"},{"src": "tomorrow","dst": "明天"}]
}
JSON處理工具包Gson介紹
Gson是Google提供的用于在Java對(duì)象和JSON數(shù)據(jù)之間進(jìn)行轉(zhuǎn)換的Java類(lèi)庫(kù)。通過(guò)使用Gson類(lèi)庫(kù),我們能夠?qū)SON字符串轉(zhuǎn)成Java對(duì)象,反之亦然。下載地址:https://code.google.com/p/google-gson/downloads/list,Gson的使用比較簡(jiǎn)單,直接調(diào)用它的方法toJson()或fromJson()就能完成對(duì)應(yīng)的轉(zhuǎn)換,但須要注意的是:在使用Gson將json字符串轉(zhuǎn)換成Java對(duì)象之前,須要先創(chuàng)建好與目標(biāo)Java對(duì)象。讀者能夠在維基百科上學(xué)習(xí)它的使用演示例子http://zh.wikipedia.org/wiki/Gson。
代碼實(shí)現(xiàn)
1)創(chuàng)建與百度翻譯API返回的JSON相對(duì)應(yīng)的Java類(lèi)
import?java.util.List;???*?調(diào)用百度翻譯api查詢結(jié)果??*?@author?liufeng??*?@date?2013-10-21?public?class?TranslateResult?{??????//?實(shí)際採(cǎi)用的源語(yǔ)言??????private?String?from;??????//?實(shí)際採(cǎi)用的目標(biāo)語(yǔ)言??????private?String?to;??????//?結(jié)果體??????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;?? import java.util.List;/*** 調(diào)用百度翻譯api查詢結(jié)果* * @author liufeng* @date 2013-10-21*/
public class TranslateResult {// 實(shí)際採(cǎi)用的源語(yǔ)言private String from;// 實(shí)際採(cǎi)用的目標(biāo)語(yǔ)言private String to;// 結(jié)果體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;}
}
注意:這里的類(lèi)名能夠隨意取,可是成員變量的名字應(yīng)于翻譯API返回的JSON字符串中的屬性名保持一致,否則將JSON轉(zhuǎn)換成TranslateResult對(duì)象時(shí)會(huì)報(bào)錯(cuò)。
TranslateResult類(lèi)中的trans_result屬性是一個(gè)ResultPair集合,該類(lèi)的代碼例如以下:
?*?@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;?? /*** 結(jié)果對(duì)* * @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;}
}
說(shuō)明:這兩個(gè)類(lèi)的封裝是Gson類(lèi)庫(kù)所要求的,假設(shè)讀者不是用Gson解析json字符串,而是用JSON-lib,就沒(méi)有必要封裝這兩個(gè)類(lèi)。
2)接口調(diào)用?
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?{???????*?發(fā)起http請(qǐng)求獲取返回結(jié)果??????*?@param?requestUrl?請(qǐng)求地址??????*?@return?????public?static?String?httpRequest(String?requestUrl)?{??????????StringBuffer?buffer?=?new?StringBuffer();??????????????URL?url?=?new?URL(requestUrl);??????????????HttpURLConnection?httpUrlConn?=?(HttpURLConnection)?url.openConnection();??????????????httpUrlConn.setDoOutput(false);??????????????httpUrlConn.setDoInput(true);??????????????httpUrlConn.setUseCaches(false);??????????????httpUrlConn.setRequestMethod("GET");??????????????httpUrlConn.connect();??????????????//?將返回的輸入流轉(zhuǎn)換成字符串??????????????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;??????????????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";??????????//?對(duì)參數(shù)q的值進(jìn)行urlEncode?utf-8編碼??????????requestUrl?=?requestUrl.replace("{keyWord}",?urlEncodeUTF8(source));??????????//?查詢并解析結(jié)果??????????????//?查詢并獲取返回結(jié)果??????????????String?json?=?httpRequest(requestUrl);??????????????//?通過(guò)Gson工具將json轉(zhuǎn)換成TranslateResult對(duì)象??????????????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?=?"翻譯系統(tǒng)異常,請(qǐng)稍候嘗試!";??????????return?dst;??????public?static?void?main(String[]?args)?{??????????//?翻譯結(jié)果:The?network?really?powerful??????????System.out.println(translate("網(wǎng)絡(luò)真強(qiáng)大"));?? 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 {/*** 發(fā)起http請(qǐng)求獲取返回結(jié)果* * @param requestUrl 請(qǐng)求地址* @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();// 將返回的輸入流轉(zhuǎn)換成字符串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";// 對(duì)參數(shù)q的值進(jìn)行urlEncode utf-8編碼requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));// 查詢并解析結(jié)果try {// 查詢并獲取返回結(jié)果String json = httpRequest(requestUrl);// 通過(guò)Gson工具將json轉(zhuǎn)換成TranslateResult對(duì)象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 = "翻譯系統(tǒng)異常,請(qǐng)稍候嘗試!";return dst;}public static void main(String[] args) {// 翻譯結(jié)果:The network really powerfulSystem.out.println(translate("網(wǎng)絡(luò)真強(qiáng)大"));}
}
代碼解讀:
1)第21-53行封裝了一個(gè)http請(qǐng)求方法httpRequest(),相信讀過(guò)之前教程的讀者已經(jīng)非常熟悉了。
2)第61-69行封裝了一個(gè)urlEncodeUTF8()方法,用于對(duì)url中的參數(shù)進(jìn)行UTF-8編碼。
3)第81行代碼中的client_id須要替換成自己申請(qǐng)的api key。
4)第83行代碼是對(duì)url中的中文進(jìn)行編碼。以后凡是遇到通過(guò)url傳遞中文參數(shù)的情況,一定要顯示地對(duì)中文進(jìn)行編碼,否則非常可能出現(xiàn)程序在本機(jī)能正常執(zhí)行,但部署到server上卻有問(wèn)題,由于本機(jī)與server的默認(rèn)編碼方式可能不一樣。
5)第88行代碼就是調(diào)用百度翻譯API。
6)第90行代碼是使用Gson工具將json字符串轉(zhuǎn)換成TranslateResult對(duì)象,是不是發(fā)現(xiàn)Gson的使用真的非常easy?另外,前面提到過(guò)調(diào)用百度翻譯API返回的json里假設(shè)有中文是用unicode表示的,形如“\u4eca\u5929”,那為什么這里沒(méi)有做不論什么處理?由于Gson的內(nèi)部實(shí)現(xiàn)已經(jīng)幫我們搞定了。
公眾賬號(hào)后臺(tái)調(diào)用
在公眾賬號(hào)后臺(tái),須要對(duì)接收到的文本消息進(jìn)行推斷,假設(shè)是以“翻譯”兩個(gè)字開(kāi)頭的,就認(rèn)為是在使用智能翻譯功能,然后將“翻譯”兩個(gè)字之后的內(nèi)容作為翻譯對(duì)象,調(diào)用API進(jìn)行翻譯;假設(shè)輸入的唯獨(dú)“翻譯”兩個(gè)字,就提示智能翻譯功能的使用指南。關(guān)鍵代碼例如以下:
//?文本消息???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));?? // 文本消息
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行g(shù)etTranslateUsage()方法得到的就是智能翻譯功能的使用指南,代碼例如以下:
?*?Q譯通使用指南??*?@return?public?static?String?getTranslateUsage()?{??????StringBuffer?buffer?=?new?StringBuffer();??????buffer.append(XiaoqUtil.emoji(0xe148)).append("Q譯通使用指南").append("\n\n");??????buffer.append("Q譯通為用戶提供專(zhuān)業(yè)的多語(yǔ)言翻譯服務(wù),眼下支持以下翻譯方向:").append("\n");??????buffer.append("????中?->?英").append("\n");??????buffer.append("????英?->?中").append("\n");??????buffer.append("????日?->?中").append("\n\n");??????buffer.append("使用演示例子:").append("\n");??????buffer.append("????翻譯我是中國(guó)人").append("\n");??????buffer.append("????翻譯dream").append("\n");??????buffer.append("????翻譯さようなら").append("\n\n");??????buffer.append("回復(fù)“?”顯示主菜單");??????return?buffer.toString();?? /*** Q譯通使用指南* * @return*/
public static String getTranslateUsage() {StringBuffer buffer = new StringBuffer();buffer.append(XiaoqUtil.emoji(0xe148)).append("Q譯通使用指南").append("\n\n");buffer.append("Q譯通為用戶提供專(zhuān)業(yè)的多語(yǔ)言翻譯服務(wù),眼下支持以下翻譯方向:").append("\n");buffer.append(" 中 -> 英").append("\n");buffer.append(" 英 -> 中").append("\n");buffer.append(" 日 -> 中").append("\n\n");buffer.append("使用演示例子:").append("\n");buffer.append(" 翻譯我是中國(guó)人").append("\n");buffer.append(" 翻譯dream").append("\n");buffer.append(" 翻譯さようなら").append("\n\n");buffer.append("回復(fù)“?”顯示主菜單");return buffer.toString();
}
說(shuō)明:希望通過(guò)本例的學(xué)習(xí),除了掌握百度翻譯API的調(diào)用之外,讀者還能夠掌握json字符串的解析方法,這樣就能夠自己學(xué)會(huì)調(diào)用許多其他互聯(lián)網(wǎng)上開(kāi)放的接口。
假設(shè)認(rèn)為文章對(duì)你有所幫助,請(qǐng)通過(guò)留言或關(guān)注微信公眾帳號(hào)xiaoqrobot來(lái)支持柳峰!
轉(zhuǎn)帖請(qǐng)注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),請(qǐng)尊重他人的辛勤勞動(dòng)成果,謝謝!
轉(zhuǎn)載于:https://www.cnblogs.com/mfryf/p/3598792.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的[041] 微信公众帐号开发教程第17篇-应用实例之智能翻译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。