公眾號對接百度翻譯API


  有時候在公眾號中需要對接一些翻譯的功能或者其他。最常見的翻譯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;
    }

微信測試結果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM