• 公众号对接百度翻译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":"u4f60u662fu6211u7684u513fu5b50uff01"}]}

    文档对接口的解释如下:(经过自己测试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;
        }

    微信测试结果如下:

  • 相关阅读:
    ThinkPHP第八天(U函数放置在外部JS不会被解析,错误界面定制,错误信息变量)
    ThinkPHP第七天(F函数使用,项目分组配置,项目分组模板文件放置规则配置)
    thinkphp第二天
    ThinkPHP第五天(提交类型判定常量IS_POST等,错误页面种类,Model实例化方式,模板中使用函数,foreach循环,模板中.语法配置)
    高阶函数、函数嵌套和闭包
    递 归
    函数式编程
    命名空间
    函数的参数
    循环语句
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/11766676.html
Copyright © 2020-2023  润新知