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

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. Java EE---Spring AOP
  2. C数据类型之基本类型
  3. linux bin文件制作
  4. 这些基因的名字太有才了,研究一下都可以发10分文章
  5. IOS UI 第三篇:基本UI
  6. android stagefright框架
  7. 油猴脚本使用方法与管理插件方法+开发插件与安装插件的方法
  8. 奇迹mu开服教程:开服服务端的架设及服务器推荐需要那些东西
  9. .Net -- EF Core详解
  10. kubernetes Auditing 实战
  11. 欠阻尼二阶系统的单位阶跃响应分析
  12. iOS 14上全面屏iPhone的状态栏高度
  13. PT100热电阻温度阻值对应表
  14. Element-Ui记录(三)——字体色彩按钮边框
  15. 做了3年半测试员,薪资不到20K,今天,我辞职了…
  16. 自然数幂和伯努利数(Bernoulli)
  17. 自动化立体仓库系统(Automated Storage and Retrieval System)
  18. 奋起之时,Ceph之父Sage Weil来华:产品化是唯一出路
  19. CSS 表格制作日历
  20. (毕业设计资料)基于单片机FM数字收音机电路系统

热门文章

  1. GitHub 上最酷的 8 个简历模板
  2. 第1章 android发展史
  3. SVM支持向量机的应用
  4. C/C++学习日记:C语言栈区与堆区浅谈
  5. jquery 向html body 元素内添加子元素并设置样式知识点.txt
  6. 完整企业官网源码,前端基于Vue+ElementUI,后台基于基于core3 webapi,含数据库文件,含详情安装部署文档
  7. 2013-3-15.3
  8. TMS320C6678开发板( DSP+Zynq )RTOS综合功能案例,嵌入式必看!
  9. [ZT]Windows 2000/03域和活动目录上手概述
  10. win10wifi多了数字_win10和周年版的WIFI都喜欢断断续续