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中的非阻塞方法介绍
Jun 05 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
Windows系统中安装nodejs图文教程
Feb 28 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
NodeJS基础API搭建服务器详细过程记录
Apr 01 NodeJs
nodejs body-parser 解析post数据实例
Jul 26 NodeJs
nodejs前端自动化构建环境的搭建
Jul 26 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
NodeJS 将文件夹按照存放路径变成一个对应的JSON的方法
Oct 17 NodeJs
nodejs 使用http进行post或get请求的实例(携带cookie)
Jan 03 NodeJs
详解nodejs http请求相关总结
Mar 31 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 数据结构 算法 三元组 Triplet
2011/07/02 PHP
教你如何在CI框架中使用 .htaccess 隐藏url中index.php
2014/06/09 PHP
CMS中PHP判断系统是否已经安装的方法示例
2014/07/26 PHP
利用php_imagick实现复古效果的方法
2016/10/18 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
jQuery 鼠标经过(hover)事件的延时处理示例
2014/04/14 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
JavaScript的removeChild()函数用法详解
2015/12/27 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
在Lighttpd服务器中运行Django应用的方法
2015/07/22 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
Python模拟百度登录实例详解
2016/01/20 Python
详解 Python 与文件对象共事的实例
2017/09/11 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python单元测试与测试用例简析
2019/11/09 Python
Python的缺点和劣势分析
2019/11/19 Python
python目标检测给图画框,bbox画到图上并保存案例
2020/03/10 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
读书演讲主持词
2014/03/18 职场文书
七夕相亲活动策划方案
2014/08/31 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
城镇居民医疗保险工作总结
2015/08/10 职场文书
vue如何清除浏览器历史栈
2022/05/25 Vue.js