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 相关文章推荐
iPhone手机上搭建nodejs服务器步骤方法
Jul 06 NodeJs
Nodejs Express4.x开发框架随手笔记
Nov 23 NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
nodejs中安装ghost出错的原因及解决方法
Oct 23 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 NodeJs
nodejs一个简单的文件服务器的创建方法
Sep 13 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截取后台登陆密码的代码
2012/05/05 PHP
PHP微信分享开发详解
2017/01/14 PHP
php精度计算的问题解析
2019/06/21 PHP
根据分辩率调用不同的CSS.
2007/01/08 Javascript
use jscript Create a SQL Server database
2007/06/16 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
收集json解析的四种方法分享
2014/01/17 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
[46:20]TFT vs Secret Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python操作MySQL数据库的方法分享
2012/05/29 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
基于sklearn实现Bagging算法(python)
2019/07/11 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
编辑找工作求职信分享
2014/01/03 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
优秀会计求职信
2014/07/04 职场文书
教师求职信怎么写
2015/03/20 职场文书
医院员工辞职信范文
2015/05/12 职场文书
2015教师个人德育工作总结
2015/07/22 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
有关花店创业的计划书模板
2019/08/27 职场文书