nodejs微信开发之自动回复的实现


Posted in NodeJs onMarch 17, 2019

上一篇:接入指南

这部分是实现简单的自动回复,当然也是很大一部分功能的实现基础,这里使用了图灵机器人的接口。

效果图如下:

nodejs微信开发之自动回复的实现

当然,这个机器人的效果如何不是我能管得了的事情了,类似图灵机器人,我们还可以实现段子推送,快递查询等一系列功能,这里不一一实现了。

微信的消息处理

对于公众平台,每一次发消息相当于发出一个post请求,但是需要注意的是不管是发出的请求还是收到的回复,他的数据格式都是xml,但是nodejs本身无法处理xml,所以需要对xml数据进行处理。
仍然使用的是body-parser这个库,但是需要引入body-parser-xml:

//解析xml
app.use(bodyParser.xml({
 limit: '1MB',  // Reject payload bigger than 1 MB
 xmlParseOptions: {
  normalize: true,   // Trim whitespace inside text nodes
  normalizeTags: true, // Transform tags to lowercase
  explicitArray: false // Only put nodes in array if >1
 }
}));

这样req.body.xml就是处理好的数据了。

一般文本消息的格式如下所示:

<xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>

其中ToUserName是接受者的openid,FromUserName是发送者的openid,CreateTime就是一个整型的时间戳。MsgType就是消息类型,一般有文本(text),图片(image),语音(voice),视频(video),小视频(shortvideo),地理位置(location)以及链接消息(link)。下面就以文本消息为例进行编码。

router.post('/', function (req, res) {

 res.writeHead(200, {'Content-Type': 'application/xml'});

 var data = req.body.xml;
 var resMsg = '<xml>' +
  '<ToUserName><![CDATA[' + data.fromusername + ']]></ToUserName>' +
  '<FromUserName><![CDATA[' + data.tousername + ']]></FromUserName>' +
  '<CreateTime>' + parseInt(new Date().valueOf() / 1000) + '</CreateTime>' +
  '<MsgType><![CDATA[text]]></MsgType>' +
  '<Content><![CDATA['+data.content+']]></Content>' +
  '</xml>';
 res.end(resMsg);
});

只需要将header的content-type设置为xml,返回一个xml的响应,那么公众号就会相应的回复一个消息,这里回复的消息是文本格式。(mac的微信一年没更新了--)

nodejs微信开发之自动回复的实现

如上图,发送消息则会回复一个内容一样的消息,一个简单的自动回复就实现了。

图灵机器人

这个接口的使用十分简单,get请求链接,记得带上apikey的头,然后就会返回响应的内容。我这里请求使用的是nodejs request库。

const request = require('request');
const config = require('../../config');

function getTuringResponse(info) {
 if(typeof info !== 'string') {
  info = info.toString();
 }
 var options = {
  method:'GET',
  url: 'http://apis.baidu.com/turing/turing/turing?key=879a6cb3afb84dbf4fc84a1df2ab7319&info='+info,
  headers: {
   'apikey': config.turingKey
  }
 };
 return new Promise((resolve, reject) => {
  request(options, function (err, res, body) {
   if (res) {
    resolve(body);
   } else {
    reject(err);
   }
  });
 })
}

module.exports = getTuringResponse;

使用promise处理异步返回的结果,避免多次回调,记得把apikey设置为header内容。

公众号机器人

好了,上面是二者分开的讲的,如果看到这应该知道一个聊天机器人的实现是非常简单的了。就是将接口响应的内容返回给用户(?如果不是非要自己实现聊天机器人的话。。。),后台这里也就相当于一个跳板。

turingRobot.js

const request = require('request');
const config = require('../../config');

function getTuringResponse(info) {
 if(typeof info !== 'string') {
  info = info.toString();
 }
 var options = {
  method:'GET',
  url: 'http://apis.baidu.com/turing/turing/turing?key=879a6cb3afb84dbf4fc84a1df2ab7319&info='+info,
  headers: {
   'apikey': config.turingKey
  }
 };
 return new Promise((resolve, reject) => {
  request(options, function (err, res, body) {
   if (res) {
    resolve(body);
   } else {
    reject(err);
   }
  });
 })
}

module.exports = getTuringResponse;

这部分代码很简单了,就是将图灵机器人的接口响应消息返回出来。下面要做的就是将消息返回给用户,这里有一点需要注意的是对于发出的响应,该接口不能直接响应中文字符串,需要进行urlencode。

//autoReply.js
const request = require('request');

function autoReply(requestData, info) {
 switch (requestData.msgtype) {
  case 'text':
   var resMsg = '<xml>' +
    '<ToUserName><![CDATA[' + requestData.fromusername + ']]></ToUserName>' +
    '<FromUserName><![CDATA[' + requestData.tousername + ']]></FromUserName>' +
    '<CreateTime>' + parseInt(new Date().valueOf() / 1000) + '</CreateTime>' +
    '<MsgType><![CDATA[text]]></MsgType>' +
    '<Content><![CDATA['+info+']]></Content>' +
    '</xml>';
   break;
 }

 return resMsg;
}

module.exports = autoReply;

自动回复的模块,主要是返回一个xml字符串,方便发送给用户。

//weixin.js

router.post('/', function (req, res) {

 res.writeHead(200, {'Content-Type': 'application/xml'});

 var content = req.body.xml.content;

 turingRobot(encodeURI(content)).then(function (data) {
  var response = JSON.parse(data);
  var resMsg = autoReply(req.body.xml, response.text);
  res.end(resMsg);
 })
});

好,这下算是完成机器人聊天的功能了。只要将代码部署到leancloud里,就算是成功了。

github地址奉上:https://github.com/xiadd/shorthand 欢迎star

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs微信公众号支付开发
Sep 19 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
NodeJS使用七牛云存储上传文件的方法
Jul 24 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
nodejs实现用户登录路由功能
May 22 NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 NodeJs
nodejs微信开发之接入指南
Mar 17 #NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 #NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 #NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 #NodeJs
NodeJs入门教程之定时器和队列
Mar 08 #NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 #NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 #NodeJs
You might like
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
Jquery下EasyUI组件中的DataGrid结果集清空方法
2014/01/06 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
2018/09/29 Javascript
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
python 域名分析工具实现代码
2009/07/15 Python
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python实现文本文件合并
2015/12/29 Python
如何用python整理附件
2018/05/13 Python
python高级特性和高阶函数及使用详解
2018/10/17 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Python 面向对象部分知识点小结
2020/03/09 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
学生出入校管理制度
2014/01/16 职场文书
发展部经理职责规定
2014/02/22 职场文书
新年晚会主持词
2014/03/24 职场文书
家具商场的活动方案
2014/08/16 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
2014年统计工作总结
2014/11/21 职场文书
Python办公自动化解决world文件批量转换
2021/09/15 Python
Python中的程序流程控制语句
2022/02/24 Python
python保存图片的四个常用方法
2022/02/28 Python
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript