有時候在公眾號中需要對接一些翻譯的功能或者其他。最常見的翻譯API就是中英互譯,程序員用的最多的也就是中譯英。
1.到百度翻譯官網申請賬號
http://api.fanyi.baidu.com/api/trans/product/desktop
登錄之后就選擇需要開通的服務。到http://api.fanyi.baidu.com/api/trans/product/apichoose 頁面可以選擇開通的服務。比如我已開通的服務:
開通的時候可以選擇版本,對於我個人用戶來說開通一個標准版就可以了,標准版享有的權限為: 可不限調用字符量免費使用(QPS為1,Queries-per-second 也就是每秒鍾1次)。
也可以到管理控制台查看自己開通的服務以及版本,最關心的就是版本。標准版是免費的。
2. 接下來以官方的例子運行即可
http://api.fanyi.baidu.com/api/trans/product/apidoc#joinFile
官方例子的入口類如下:
package cn.qlq.utils.baidutranslate; public class Main { // 在平台申請的APP_ID 詳見 // http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer private static final String APP_ID = ""; private static final String SECURITY_KEY = ""; public static void main(String[] args) { TransApi api = new TransApi(APP_ID, SECURITY_KEY); String query = "you are my son!"; System.out.println(api.getTransResult(query, "auto", "auto")); } }
注釋也說了從網站可以獲取自己的APP_ID和SECURITY_KEY,需要兩個參數就可以接口調用。
更換上面兩個參數之后測試結果如下:
{"from":"en","to":"zh","trans_result":[{"src":"you are my son!","dst":"\u4f60\u662f\u6211\u7684\u513f\u5b50\uff01"}]}
文檔對接口的解釋如下:(經過自己測試from和to都可以設為auto,默認是中英或英中互譯)
輸入參數:
字段名 | 類型 | 必填參數 | 描述 | 備注 |
---|---|---|---|---|
q | TEXT | Y | 請求翻譯query | UTF-8編碼 |
from | TEXT | Y | 翻譯源語言 | 語言列表(可設置為auto) |
to | TEXT | Y | 譯文語言 | 語言列表(不可設置為auto) |
appid | TEXT | Y | APP ID | 可在管理控制台查看 |
salt | TEXT | Y | 隨機數 | |
sign | TEXT | Y | 簽名 | appid+q+salt+密鑰 的MD5值 |
以下字段僅開通了詞典、TTS者需填寫 | ||||
tts | STRING | N | 是否顯示語音合成資源 | tts=0顯示,tts=1不顯示 |
dict | STRING | N | 是否顯示詞典資源 | dict=0顯示,dict=1不顯示 |
返回結果是JSON格式 的數據,參數如下:
字段名 | 類型 | 描述 | 備注 |
---|---|---|---|
from | TEXT | 翻譯源語言 | 返回用戶指定的語言,或自動檢測的語言(源語言設為auto時) |
to | TEXT | 譯文語言 | 返回用戶指定的目標語言 |
trans_result | MIXED LIST | 翻譯結果 | 返回翻譯結果,包含src 和 dst 字段。 |
src | TEXT | 原文 | |
dst | TEXT | 譯文 | |
error_code | Int32 | 錯誤碼 | 僅當出現錯誤時顯示 |
以下字段僅開通詞典、TTS資源者可見 | |||
src_tts | 原文tts | mp3格式,暫時無法指定發音 | |
dst_tts | 譯文tts | mp3格式,暫時無法指定發音 | |
dict | 中英詞典資源 | 返回中文或英文詞典資源,包含音標、簡明釋義等內容 |
支持的語言列表如下:
源語言語種不確定時可設置為 auto,目標語言語種不可設置為auto。但對於非常用語種,語種自動檢測可能存在誤差。
語言簡寫 | 名稱 |
---|---|
auto | 自動檢測 |
zh | 中文 |
en | 英語 |
yue | 粵語 |
wyw | 文言文 |
jp | 日語 |
kor | 韓語 |
fra | 法語 |
spa | 西班牙語 |
th | 泰語 |
ara | 阿拉伯語 |
ru | 俄語 |
pt | 葡萄牙語 |
de | 德語 |
it | 意大利語 |
el | 希臘語 |
nl | 荷蘭語 |
pl | 波蘭語 |
bul | 保加利亞語 |
est | 愛沙尼亞語 |
dan | 丹麥語 |
fin | 芬蘭語 |
cs | 捷克語 |
rom | 羅馬尼亞語 |
slo | 斯洛文尼亞語 |
swe | 瑞典語 |
hu | 匈牙利語 |
cht | 繁體中文 |
vie | 越南語 |
3. 接下來編寫為工具類對接微信公眾號
修改TransApi類為翻譯的入口類,靜態方法提供翻譯
package cn.qlq.utils.baidutranslate; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang3.StringUtils; import com.alibaba.fastjson.JSONObject; public class TransApi { private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate"; // 在平台申請的APP_ID 詳見 // http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer private static final String APP_ID = "yourId"; private static final String SECURITY_KEY = "yourKey"; public static String translate(String keyWords) { return translate(keyWords, "auto", "auto"); } public static String translate(String keyWords, String from, String to) { String transResult = getTransResult(keyWords, from, to); if (StringUtils.isBlank(transResult)) { return ""; } JSONObject parseObject = JSONObject.parseObject(transResult); if (parseObject != null && parseObject.containsKey("trans_result") && parseObject.get("trans_result") != null) { return parseObject.get("trans_result").toString(); } return ""; } private static String getTransResult(String query, String from, String to) { Map<String, String> params = buildParams(query, from, to); return HttpGet.get(TRANS_API_HOST, params); } private static Map<String, String> buildParams(String query, String from, String to) { Map<String, String> params = new HashMap<String, String>(); params.put("q", query); params.put("from", from); params.put("to", to); params.put("appid", APP_ID); // 隨機數 String salt = String.valueOf(System.currentTimeMillis()); params.put("salt", salt); // 簽名 String src = APP_ID + query + salt + SECURITY_KEY; // 加密前的原文 params.put("sign", MD5.md5(src)); return params; } }
修改公眾號處理文字消息處理翻譯信息:修改前面MessageHandler的處理文字消息的方法,如下:(如果接受到的消息是以翻譯開始就代表是想翻譯句子,將開頭的翻譯替換掉之后進行翻譯)
/** * 處理文本消息 * * @param message * @return */ private static AbstractResponseMessage handleTextMessage(Map<String, Object> message) { TextMessage textMessage = BeanUtils.map2Bean(message, TextMessage.class, true); String content = textMessage.getContent(); // 可以根據文本消息去查庫或者進行其他操作 if (StringUtils.isNotBlank(content)) { System.out.println("您接收到的文本消息內容為: " + content); } // 設置回傳的消息內容 TextResponseMessage responseMessage = new TextResponseMessage(); responseMessage.setContent("服務器已接收到您的消息,內容為: " + content); responseMessage.setCreateTime(new Date().getTime()); responseMessage.setFromUserName(textMessage.getToUserName()); responseMessage.setToUserName(textMessage.getFromUserName()); responseMessage.setMsgType(MESSAGE_TEXT); // 如果文字消息以翻譯開頭調用百度API翻譯 if (StringUtils.startsWith(content, "翻譯")) { String translateResult = TransApi.translate(content.replaceAll("^翻譯", "")); translateResult = StringUtils.defaultIfBlank(translateResult, "未正確翻譯"); responseMessage.setContent(translateResult); } return responseMessage; }
微信測試結果如下: