18910140161

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

顺晟科技

2021-06-16 10:28:18

262

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

效果图如下:

当然,这个机器人的效果不是我能控制的。和图灵机器人一样,我们也可以实现一系列的功能,比如片段推送、快速查询等等,这些都是这里没有实现的。

微信的消息处理

对于公共平台来说,每次发送一条消息相当于发送一个post请求,但是需要注意的是nodejs的数据格式是xml,但是NodeJs本身无法处理xml,所以需要处理xml数据。

库体解析器仍然在使用,但是它需要引入体解析器xml:

//解析xml

app.use(bodyParser.xml({

限制: '1MB ',//拒绝大于1MB的有效负载

xmlParseOptions: {

normalize: true,//修剪文本节点内的空白

规格化标签:为真,//将标签转换为小写

explicitArray: false //只有在1

}

}));

这样,req.body.xml就是处理过的数据。

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

可扩展标记语言

ToUserName![CData[用户名]]/用户名

来自用户名![CData[来自用户]]/来自用户名

创建时间1348831860/创建时间

MsgType![CData[文本]]/MsgType

内容![CData[这是一项测试]]/内容

MsgId1234567890123456/MsgId

/xml

其中ToUserName是接收方的openid,FromUserName是发送方的openid,CreateTime是整数时间戳。MsgType是一种消息类型,一般包括文本、图像、语音、视频、短视频、位置和链接消息。文本消息被编码为示例。

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

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

var data=req . body . XML;

var resMsg='xml '

ToUserName![CData[' data . from username ']]/Touseername '

来自用户名![CData[' data . touser name ']]/from username '

“创建时间”参数(新日期()。valueOf()/1000) '/CreateTime '

MsgType![CData[文本]]/MsgType '

内容![CDATA['数据.内容']]/内容'

/XML ';

RES . end(ResMSg);

});

只需将标题的内容类型设置为xml,并返回一个xml响应,然后微信官方帐户将相应地回复一条消息,其中回复消息是文本格式的。(mac的微信一年没更新了-)

如上图,发送一条消息会回复一条内容相同的消息,实现简单的自动回复。

图灵机器人

这个界面的使用非常简单。get请求一个链接,记得带上apikey头,然后返回响应的内容。我请求在这里使用nodejs请求库。

const request=require(' request ');

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

函数getTuringResponse(信息){

if(信息类型!=='string') {

info=info . ToString();

}

var选项={

方法:'GET ',

URL : ' http://APIs . Baidu.com/turing/turing/turing?key=879 a6 CB 3 AFB 84 DBF 4 fc 84 a1 df 2 ab 7319 info=' info,

headers: {

apikey': config.turingKey

}

};

返回新承诺((解决,拒绝)={

请求(选项,函数(err,res,body) {

if (res) {

resolve(正文);

} else {

拒绝(err);

}

});

})

}

module . exports=getTuringResponse;

使用promise来处理异步返回的结果,避免多次回调,并记住将apikey设置为头内容。

微信官方账号机器人

好了,以上是两者分开的。如果看到这个,应该知道一个聊天机器人的实现非常简单。是向用户返回界面响应的内容(?如果不用实现自己的聊天机器人。),这里的背景相当于一个跳板。

turingRobot.js

const request=require(' request ');

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

函数getTuringResponse(信息){

if(信息类型!=='string') {

info=info . ToString();

}

var选项={

方法:'GET ',

URL : ' http://APIs . Baidu.com/turing/turing/turing?key=879 a6 CB 3 AFB 84 DBF 4 fc 84 a1 df 2 ab 7319 info=' info,

headers: {

apikey': config.turingKey

}

};

返回新承诺((解决,拒绝)={

请求(选项,函数(err,res,body) {

if (res) {

解析(正文);

} else {

拒绝(err);

}

});

})

}

模块。exports=getTuringResponse

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

//自动播放。射流研究…

const request=require(' request ');

功能自动回复(请求数据,信息){

switch (requestData.msgtype) {

case 'text':

var resMsg='xml '

ToUserName![CData['请求数据。来自用户名“]/Tousername”

来自用户名![CData['请求数据。' touser name ']]/FrOm username '

"创建时间"参数(新日期()。valueOf()/1000) '/CreateTime '

MsgType![CData[文本]]/MsgType '

内容![CDATA['信息']/内容'

/XML ';

打破;

}

返回resMsg

}

模块。导出=自动恢复

自动回复的模块,主要是返回一个可扩展标记语言字符串,方便发送给用户。

//weixin.js

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

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

var content=req。尸体。XML。内容;

turingRobot(encodeURI(content)).然后(函数(数据){

var response=JSON.parse(数据);

var Resmsg=AutoReply(请求。尸体。XML,响应。文本);

RES . end(ResMSg);

})

});

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

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航