微信接入智能机器人回复消息

1 寻找智能机器人API

此处我使用的是极速数据

七款不错的聊天机器人API推荐

①登录注册之后,直接搜索机器人

②申请数据

③在个人中心,找到自己的appKey

④编写代码,根据接口地址发起对应的HTTP请求即可

2 编写代码,实现与微信对接

①导入依赖

 <!--dom4j 解析微信发送的XML数据--><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.1</version></dependency><!--xstream构建返回的XML--><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.14</version></dependency><!--发送HTTP请求--><dependency><groupId>com.squareup.okhttp</groupId><artifactId>okhttp</artifactId><version>2.5.0</version></dependency><!--处理json数据--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency>

②编写基础类(返回给微信的XML实体类)

BaseXML:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseMessage {@XStreamAlias("ToUserName")private String toUserName;@XStreamAlias("FromUserName")private String fromUserName;@XStreamAlias("CreateTime")private String createTime;@XStreamAlias("MsgType")private String msgType;@XStreamAlias("MsgId")private String msgId;//初始化默认数据public BaseMessage(Map<String, String> requestMap){//开始是请求方,返回数据的时候,就成为了发送方this.toUserName = requestMap.get("FromUserName");this.fromUserName = requestMap.get("ToUserName");//微信中的时间默认是10位数,java的currentTimeMillis是13位,因此要除以1000this.createTime = System.currentTimeMillis() / 1000 + "";this.msgId = requestMap.get("MsgId");}}

TextMessage:

此处只实现了TextMessage(返回文本消息),其他消息,参考该模式实现
【详细文档,参考官网:https://mp.weixin.qq.com/】

@Data
@AllArgsConstructor
@NoArgsConstructor
@XStreamAlias("xml")
public class TextMessage extends BaseMessage{//文本内容@XStreamAlias("Content")private String content;public TextMessage(Map<String, String> requestMap, String content){super(requestMap);//设置消息类型为文本super.setMsgType("text");//设置文本消息this.content = content;}
}

③编写service,解析微信的XML数据,同时给微信返回XML数据

WxService:

@Service
public class WxService {/*** 解析通过dom4j解析XML数据* @param is* @return map*/public Map<String, String> parseRequest(InputStream is){Map<String, String> map = new HashMap<>();SAXReader reader = new SAXReader();try{//读取输入流,获取文档对象Document document = reader.read(is);//根据文档对象获取根节点Element root = document.getRootElement();//获取根节点的所有子节点List<Element> elements = root.elements();for(Element e : elements){map.put(e.getName(), e.getStringValue());}return map;}catch (Exception e){e.printStackTrace();}return null;}/*** 返回的消息* @param requestMap* @return*/public String getResponse(Map<String, String> requestMap){String msgType = requestMap.get("MsgType");//要返回的消息BaseMessage rtnMsg = null;switch (msgType){//根据消息类型,处理不同消息case "text":rtnMsg = dealTextMessage(requestMap);case "image"://TODObreak;case "voice":break;case "video":break;case "shortvideo":break;case "location":break;case "link":break;default:break;}return beanToXML(rtnMsg);}/*** 将消息对象处理为XML数据包* @param msg* @return*/public String beanToXML(BaseMessage msg){if(msg == null){return "";}        //公众号返回信息XStream stream = new XStream();//设置需要处理XStreamAlias("xml")注解的类stream.processAnnotations(TextMessage.class);stream.processAnnotations(PicMessage.class);String xml = stream.toXML(msg);return xml;}/*** 处理文本消息* @param requestMap* @return*/public BaseMessage dealTextMessage(Map<String, String> requestMap){String returnMsg = "收到消息!!!";TextMessage tm = new TextMessage(requestMap, returnMsg);return tm;}/*** 智能问答机器人根据内容回复文本* @param requestMap* @return 返回XML格式的数据包*/public String getResponseByAI(Map<String, String> requestMap) throws IOException {String content = requestMap.get("Content");//拼接请求URL[appkey填写自己账号的]String baseUrl = "https://api.jisuapi.com/iqa/query?appkey=8033aa4b1f27e290&question=" + content;Request request = new Request.Builder().url(new URL(baseUrl)).get().build();OkHttpClient client = new OkHttpClient();Call call = client.newCall(request);Response response = call.execute();System.out.println("this is response===================");//注意okHttp的response.body().string()只能使用一次,如果重复使用会报java.lang.IllegalStateException: closed//如果想要得到多次string()结果,只有重新构建response对象String responseStr = response.body().string();JSONObject responseObj = JSONObject.parseObject(responseStr);System.out.println(responseObj);//获取结果Object result = responseObj.get("result");String resultStr = JSON.toJSONString(result);//获取数据对象JSONObject resultObj = JSONObject.parseObject(resultStr);//获取回复的内容String respContent = (String) resultObj.get("content");String type = (String) resultObj.get("type");//构建返回结果String returnMsg = "";if("聊天".equals(type) || "重复".equals(type)){returnMsg = respContent;}TextMessage textMessage = new TextMessage(requestMap, returnMsg);String xml = beanToXML(textMessage);return xml;}
}

④编写controller,提供给微信请求地址

@RestController
public class WxController {@Autowiredprivate WxService wxService;@PostMapping("/wx")public void receiveMsg(HttpServletRequest request, HttpServletResponse response){try {//设置编码,防止乱码request.setCharacterEncoding("utf8");response.setCharacterEncoding("utf8");//获取请求信息ServletInputStream is = request.getInputStream();//处理消息和事件推送Map<String, String> requestMap = wxService.parseRequest(is);System.out.println(requestMap);//准备回复的数据包
//            String respXML = wxService.getResponse(requestMap);//测试机器人String respXML = wxService.getResponseByAI(requestMap);System.out.println(respXML);PrintWriter out = response.getWriter();out.print(respXML);out.flush();out.close();} catch (IOException e) {e.printStackTrace();}}
}

提供给微信的请求地址,需要注册自己的开发账号,详情见:
微信接口配置失败、接收微信发送的消息、与微信交互

3 测试功能

在自己的接口测试账号上发送消息,查看结果

微信接入智能机器人回复消息相关推荐

  1. 用WeRoBot和Python编写一个不使用网页版微信且能够回复消息微信群聊机器人

    要用 WeRoBot 和 Python 编写一个不使用网页版微信且能够回复消息的微信群聊机器人,您需要以下步骤: 安装 WeRoBot 和相关依赖: pipinstall werobot 创建一个 P ...

  2. php 微信消息,php实现微信公众号回复消息

    您现在的位置是:网站首页>>微信>>微信公众号 php实现微信公众号回复消息 发布时间:2019-02-28 16:32:52作者:wangjian浏览量:999点赞量:0 一 ...

  3. JAVA实现 springMVC方式的微信接入、实现消息自动回复

    前段时间小忙了一阵,微信公众号的开发,从零开始看文档,踩了不少坑,也算是熬过来了,最近考虑做一些总结,方便以后再开发的时候回顾,也给正在做相关项目的同学做个参考. 思路 微信接入:用户消息和开发者需要 ...

  4. 教程--企业微信接入智能机器人

    如何让你的企业微信快速接入智能机器人,增加和员工互动的趣味性,同时解决员工各种高频问题呢? 1.首先,你需要创建一个属于自己的聊天机器人,直接注册并完成创建就可以了. 2.找到[对接渠道],选择[企业 ...

  5. java微信群自动回复_JAVA实现 springMVC方式的微信接入、实现消息自动回复

    /*** 处理微信发来的请求 * *@paramrequest *@return */ publicString weixinPost(HttpServletRequest request) { St ...

  6. 微信公众号-回复消息触发时间绑定EventKEY

    click和view的请求示例 {"button":[{ "type":"click","name":"今日歌 ...

  7. 关于微信公众号回复消息乱码的问题

    可以把处理消息的文件保存成UTF-8的格式,这样就不会乱码了,但是这里有一个冲突,如果你反过去验证下图这个url你会发现 它是会出现配置错误的,因为你保存的UTF-8的格式微信Token验证这里的ur ...

  8. 微信公众平台回复消息如何换行

    为什么80%的码农都做不了架构师?>>>    方法: 1.使用 \n 2.包含 \n 的消息体必须用双引号(即"",详细可查询php中单引号与双引号的区别) 示 ...

  9. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

最新文章

  1. 白盒测试工具_别再头疼工作效率低!这些超实用的黑盒、白盒测试方法你都用上了吗?...
  2. 语音识别 | GMM-HMM、DNN-HMM等主流算法及前沿技术
  3. 百度网站打不开了,百度被黑了?最新证实:百度遭黑客劫持,手段类似于12月被劫持的twitter(截图)...
  4. POJ 1789248512583026
  5. 《PWA实战:面向下一代的Progressive Web APP》读书笔记
  6. 用JSON-server模拟REST API(一) 安装运行
  7. linux将访问日志切成每天,最简单自动切割 nginx 访问日志示例
  8. jQuery与Ajax的应用——《锋利的jQuery》(第2版)读书笔记3
  9. 华为手机媒体音量自动静音_华为手机还能自动清理垃圾,怪不得手机越用越流畅,学到了...
  10. ubuntu 18.04 vim的安装
  11. JavaScript学习笔记——事件
  12. 天猫二面:内存耗尽后 Redis 会发生什么?
  13. 一些常用的JavaScript的Bookmarket
  14. mysql拼接字符串的方式_mysql 字符串拼接,你知道几种方式?
  15. 西数完善黑盘系列 3TB黑盘终面市
  16. 如何编写Python爬虫
  17. 数据通信之信道与编码
  18. 数据权限框架:一个实现数据权限与业务模块完全分离,让数据权限变成独立功能模块的数据权限框架
  19. 能被4,6,7,8,9,11整除的数
  20. muduo源码剖析——以三个切片浅析muduo库代码设计的严谨性、高效性与灵活性

热门文章

  1. 如何为PDF文件添加注释?
  2. Qt发展历史及其特点简介
  3. 3.4 常用类库-多线程
  4. 【渝粤题库】广东开放大学 电子商务概论 形成性考核
  5. 统计学习方法的概括和补充
  6. 信息安全-五:隐通道
  7. 企业律师事务官方介绍网站源码
  8. 一步步教你微信怎么搭建小程序
  9. 我与陈景润的一次争论
  10. KL变换与PCA的关系