<?php //明文方式 define('TOKEN', 'xxx'); class Message { private $fromUsername; private $toU
顺晟科技
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);
})
});
好,这下算是完成机器人聊天的功能了。只要将代码部署到数据存储里,就算是成功了。