生活随笔
收集整理的這篇文章主要介紹了
微信公众帐号开发教程第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":"\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類
import?java.util.List;???????????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集合,該類的代碼如下:
???????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)接口調用?
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;??????????public?class?BaiduTranslateService?{?????????????????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();??????}???????????????????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;??????}???????????????????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";????????????????????requestUrl?=?requestUrl.replace("{keyWord}",?urlEncodeUTF8(source));??????????????????????try?{????????????????????????????String?json?=?httpRequest(requestUrl);????????????????????????????TranslateResult?translateResult?=?new?Gson().fromJson(json,?TranslateResult.class);????????????????????????????dst?=?translateResult.getTrans_result().get(0).getDst();??????????}?catch?(Exception?e)?{??????????????e.printStackTrace();??????????}????????????if?(null?==?dst)??????????????dst?=?"翻譯系統異常,請稍候嘗試!";??????????return?dst;??????}????????public?static?void?main(String[]?args)?{????????????????????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))?{??????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()方法得到的就是智能翻譯功能的使用指南,代碼如下:
[java]?view plaincopy
??????public?static?String?getTranslateUsage()?{??????StringBuffer?buffer?=?new?StringBuffer();??????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("回復“?”顯示主菜單");??????return?buffer.toString();??}??
說明:希望通過本例的學習,除了掌握百度翻譯API的調用之外,讀者還能夠掌握json字符串的解析方法,這樣就能夠自己學會調用更多互聯網上開放的接口
總結
以上是生活随笔為你收集整理的微信公众帐号开发教程第17篇-应用实例之智能翻译的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。