本篇文章为大家演示如何在微信公众帐号上实现“智能翻译”,本例中翻译功能是通过调用“百度翻译API”实现的。智能翻译是指用户任意输入想要翻译的内容(单词或句子),系统能自动识别用户采用的语言,并将其翻译为其他语言,目前支持的翻译方向:中->英、英->中和日->中。下面我们来看看智能翻译最终做出来的效果:

我们通过输入关键词“翻译”或者点击菜单“翻译”能够看到该功能的使用帮助,然后输入“翻译+内容”就能对内容进行翻译了。

百度翻译API介绍

点击查看百度翻译API使用说明,其实这份文档已经说的很详细了,笔者只是将我们调用该接口时最关心的内容摘取出来,主要如下:

1)通过发送HTTP GET请求调用百度翻译API。

2)百度翻译API请求地址:

  1. http://openapi.baidu.com/public/2.0/bmt/translate

3)调用API需要传递from、to、client_id和q四个参数,描述如下:

key value 描述
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)接口返回结果示例如下:

  1. {"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]}

返回结果里的中文是unicode编码,需要通过json_decode进行转换,转换后的示例如下:

  1. {
  2. "from": "en",
  3. "to": "zh",
  4. "trans_result": [
  5. {
  6. "src": "today",
  7. "dst": "今天"
  8. },
  9. {
  10. "src": "tomorrow",
  11. "dst": "明天"
  12. }
  13. ]
  14. }

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类

  1. import java.util.List;
  2. /**
  3. * 调用百度翻译api查询结果
  4. *
  5. * @author liufeng
  6. * @date 2013-10-21
  7. */
  8. public class TranslateResult {
  9. // 实际采用的源语言
  10. private String from;
  11. // 实际采用的目标语言
  12. private String to;
  13. // 结果体
  14. private List<ResultPair> trans_result;
  15. public String getFrom() {
  16. return from;
  17. }
  18. public void setFrom(String from) {
  19. this.from = from;
  20. }
  21. public String getTo() {
  22. return to;
  23. }
  24. public void setTo(String to) {
  25. this.to = to;
  26. }
  27. public List<ResultPair> getTrans_result() {
  28. return trans_result;
  29. }
  30. public void setTrans_result(List<ResultPair> trans_result) {
  31. this.trans_result = trans_result;
  32. }
  33. }

注意:这里的类名可以任意取,但是成员变量的名字应于翻译API返回的JSON字符串中的属性名保持一致,否则将JSON转换成TranslateResult对象时会报错。

TranslateResult类中的trans_result属性是一个ResultPair集合,该类的代码如下:

  1. /**
  2. * 结果对
  3. *
  4. * @author liufeng
  5. * @date 2013-10-21
  6. */
  7. public class ResultPair {
  8. // 原文
  9. private String src;
  10. // 译文
  11. private String dst;
  12. public String getSrc() {
  13. return src;
  14. }
  15. public void setSrc(String src) {
  16. this.src = src;
  17. }
  18. public String getDst() {
  19. return dst;
  20. }
  21. public void setDst(String dst) {
  22. this.dst = dst;
  23. }
  24. }

说明:这两个类的封装是Gson类库所要求的,如果读者不是用Gson解析json字符串,而是用JSON-lib,就没有必要封装这两个类。

2)接口调用 

  1. import java.io.BufferedReader;
  2. import java.io.InputStream;
  3. import java.io.InputStreamReader;
  4. import java.io.UnsupportedEncodingException;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. import com.google.gson.Gson;
  8. /**
  9. *
  10. * @author liufeng
  11. * @date 2013-10-21
  12. */
  13. public class BaiduTranslateService {
  14. /**
  15. * 发起http请求获取返回结果
  16. *
  17. * @param requestUrl 请求地址
  18. * @return
  19. */
  20. public static String httpRequest(String requestUrl) {
  21. StringBuffer buffer = new StringBuffer();
  22. try {
  23. URL url = new URL(requestUrl);
  24. HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
  25. httpUrlConn.setDoOutput(false);
  26. httpUrlConn.setDoInput(true);
  27. httpUrlConn.setUseCaches(false);
  28. httpUrlConn.setRequestMethod("GET");
  29. httpUrlConn.connect();
  30. // 将返回的输入流转换成字符串
  31. InputStream inputStream = httpUrlConn.getInputStream();
  32. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
  33. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
  34. String str = null;
  35. while ((str = bufferedReader.readLine()) != null) {
  36. buffer.append(str);
  37. }
  38. bufferedReader.close();
  39. inputStreamReader.close();
  40. // 释放资源
  41. inputStream.close();
  42. inputStream = null;
  43. httpUrlConn.disconnect();
  44. catch (Exception e) {
  45. }
  46. return buffer.toString();
  47. }
  48. /**
  49. * utf编码
  50. *
  51. * @param source
  52. * @return
  53. */
  54. public static String urlEncodeUTF8(String source) {
  55. String result = source;
  56. try {
  57. result = java.net.URLEncoder.encode(source, "utf-8");
  58. catch (UnsupportedEncodingException e) {
  59. e.printStackTrace();
  60. }
  61. return result;
  62. }
  63. /**
  64. * 翻译(中->英 英->中 日->中 )
  65. *
  66. * @param source
  67. * @return
  68. */
  69. public static String translate(String source) {
  70. String dst = null;
  71. // 组装查询地址
  72. String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";
  73. // 对参数q的值进行urlEncode utf-8编码
  74. requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));
  75. // 查询并解析结果
  76. try {
  77. // 查询并获取返回结果
  78. String json = httpRequest(requestUrl);
  79. // 通过Gson工具将json转换成TranslateResult对象
  80. TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);
  81. // 取出translateResult中的译文
  82. dst = translateResult.getTrans_result().get(0).getDst();
  83. catch (Exception e) {
  84. e.printStackTrace();
  85. }
  86. if (null == dst)
  87. dst = "翻译系统异常,请稍候尝试!";
  88. return dst;
  89. }
  90. public static void main(String[] args) {
  91. // 翻译结果:The network really powerful
  92. System.out.println(translate("网络真强大"));
  93. }
  94. }

代码解读:

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进行翻译;如果输入的只有“翻译”两个字,就提示智能翻译功能的使用指南。关键代码如下:

  1. // 文本消息
  2. if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {
  3. String content = requestMap.get("Content").trim();
  4. if (content.startsWith("翻译")) {
  5. String keyWord = content.replaceAll("^翻译", "").trim();
  6. if ("".equals(keyWord)) {
  7. textMessage.setContent(getTranslateUsage());
  8. else {
  9. textMessage.setContent(BaiduTranslateService.translate(keyWord));
  10. }
  11. out.print(WeixinUtil.textMessageToXml(textMessage));
  12. }
  13. }

第7行getTranslateUsage()方法得到的就是智能翻译功能的使用指南,代码如下:

  1. /**
  2. * Q译通使用指南
  3. *
  4. * @return
  5. */
  6. public static String getTranslateUsage() {
  7. StringBuffer buffer = new StringBuffer();
  8. buffer.append(XiaoqUtil.emoji(0xe148)).append("Q译通使用指南").append("\n\n");
  9. buffer.append("Q译通为用户提供专业的多语言翻译服务,目前支持以下翻译方向:").append("\n");
  10. buffer.append("    中 -> 英").append("\n");
  11. buffer.append("    英 -> 中").append("\n");
  12. buffer.append("    日 -> 中").append("\n\n");
  13. buffer.append("使用示例:").append("\n");
  14. buffer.append("    翻译我是中国人").append("\n");
  15. buffer.append("    翻译dream").append("\n");
  16. buffer.append("    翻译さようなら").append("\n\n");
  17. buffer.append("回复“?”显示主菜单");
  18. return buffer.toString();
  19. }

说明:希望通过本例的学习,除了掌握百度翻译API的调用之外,读者还能够掌握json字符串的解析方法,这样就能够自己学会调用更多互联网上开放的接口。

微信公号开发实战之智能翻译相关推荐

  1. WxJava微信公众号开发实战

    本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:WxJava微信公众号开发实战 之前我们介绍了Java如何进行微信公众号开发,阅读本文前小伙伴们可以先去了解下Java微信公众号开发 之前我们开 ...

  2. 微信公众号开发实战 | 01:环境配置

    文章目录 前言 配置Node开发环境 安装Node.js 安装TypeScript 安装localtunnel 安装IDE 实现一个简单的自动回复功能 前言 在本系列的博客中我们将从零开始搭建一个基于 ...

  3. 微信公号开发之图文消息全攻略

     转载链接:http://mobile.51cto.com/web-416968.htm 图文消息的主要参数说明 通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示: 从图中可以 ...

  4. 从永远到永远-SpringBoot微信公众号开发实战(一)-自用

    项目架构: 角色:买家(手机).卖家(PC) 重点:前后台系统发起的请求均先经过nginx服务器,如果访问的后端接口,再由其对请求进行转发. 跟着视频自学Spring cloud项目,现做下关键遇坑记 ...

  5. CSDN学霸课表——微信公众号开发全部流程

    < 微信公众号开发全部流程> 我是一名php开发菜鸡,目前觉得自己技术不太行了,所以想提高一下自己的技术水平,然而没找到更好的方法,所以我打算将所有的微信接口全部写一遍,一边学习,一边开发 ...

  6. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

  7. springboot实战-微信公众号开发

    sell 基于springboot的微信公众号系统,旨在学习springboot以及微信公众号开发相关知识 包含: springboot:表单验证.统一异常处理.事物管理.restful Api开发 ...

  8. 基于Vue+SpringCloudAlibaba微服务电商项目实战-技术选型-004:快速整合微信公众号开发

    004:快速整合微信公众号开发 1 微信公众号开发项目演示 2 微信公众号开发设计原理 3 基于natapp将本地项目发布到外网 4 对接微信公众号测试平台 5 第三方微信框架快速实现微信开发 6 微 ...

  9. 慕课网_《Java微信公众号开发进阶》学习总结

    时间:2017年08月12日星期六 说明:本文部分内容均来自慕课网.@慕课网:http://www.imooc.com 教学源码:http://img.mukewang.com/down/... 学习 ...

  10. 第一篇:微信公众平台开发实战Java版之了解微信公众平台基础知识以及资料准备...

    相信很多人或多或少听说了微信公众平台的火热.但是开发还是有一点门槛,鉴于挺多朋友问我怎么开发,问多了,自己平时也进行以下总结. 所以下面给大家分享一下我的经验: 第一部分   介绍微信公众号的一些简单 ...

最新文章

  1. Linux下DNS简单部署(主从域名服务器)
  2. 第三讲,我们来谈谈:“二进制的负数”
  3. python不定长参数怎么相加_python函数不定长参数使用方法解析
  4. 【Python】多种方式实现生成验证码
  5. Android华容道之一步一步实现-6-还原状态检测
  6. SAP 对话屏幕长文本编辑框
  7. 分享网页加载速度优化的一些技巧?
  8. linux c之使用#define定义多行函数总结
  9. 〖Android〗存在多个Android设备时,使用Shell脚本选择一个Android设备
  10. android 4.2.1短信接收以及应用接收顺序
  11. 全球与中国激光共焦扫描显微镜市场深度研究分析报告
  12. 自动执行bash被拒绝 提示/bin/sh: /test.sh: Permission denied
  13. SDUT—Python程序设计实验78(函数)
  14. 小武与retinanet的斗争
  15. 4.7开发者日:创业工场麦刚认为创业者活下去最重要
  16. 午睡起来发现了很精美的windows壁纸
  17. Windows Server 2012 R2 IE浏览器安(qi)装(yong)Adobe Flash Player
  18. 数据库之关系模型介绍
  19. BZOJ 4668: 冷战 并查集暴力LCA(雾)
  20. 邮箱密码忘记了怎么办?邮箱密码找回技巧

热门文章

  1. matlab将三相电感进行d-q变换.,永磁同步电机交直轴电感计算
  2. 《勘测定界界址点坐标交换格式》解析
  3. js采集图片批量下载
  4. linux编译 __stdcall,Linux下的stdcall 约定格式
  5. 使用低代码开发的图书管理系统如何使用扫条形码实现图书的录入?
  6. 服务器光纤存储系统,光纤存储服务器 配置
  7. 学会-精湛-应用,一个数据分析师的养成手册
  8. 解决IE浏览器无法访问此页面
  9. UID_PR_01_基础操作
  10. c++取模运算/求余运算