基于Node.js+Express+编写一个微信订阅号聊天机器人

2022-04-16 23:47:15 浏览数 (1)

写在前面

首先,感谢腾讯云赠送本人一台云服务器。

环境准备

有公网IP的云服务器 系统版本:CentOS 7.6

安装宝塔Linux面板

登录自己的服务器,运行下面的命令,等待安装。

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

若出现下图的结果,代表宝塔Linux面板安装成功。

宝塔Linux面板安装成功截图宝塔Linux面板安装成功截图

创建一个Express项目

WebStorm创建Express项目

WebStorm创建WebStorm创建

脚手架创建Express项目

全局安装express-generator

npm i express-generator -g

生成目录名为weixin的工程

express -e weixin

进入工程根目录

cd weixin

安装依赖

npm install --registry=https://registry.npm.taobao.org

运行项目

npm start

打开浏览器查看
运行项目成功截图运行项目成功截图

代码编写

准备一个机器人API

我这里分享一个免费的机器人API:点我获取~

免费的机器人API免费的机器人API

在项目中安装axios xml2js模块

npm i axios xml2js

修改项目目录/routers/index.js中的代码

修改项目代码2修改项目代码2
代码语言:JavaScript复制
const express = require('express');
const router = express.Router();
const axios = require('axios');
router.get("/", function (req, res, next) {
    const token = "填写微信公众平台后台的token";
    //1.获取微信服务器Get请求的参数 signature、timestamp、nonce、echostr
    let signature = req.query.signature, //微信加密签名
        timestamp = req.query.timestamp, //时间戳
        nonce = req.query.nonce, //随机数
        echostr = req.query.echostr; //随机字符串
    //2.将token、timestamp、nonce三个参数进行字典序排序
    let array = [token, timestamp, nonce];
    array.sort();
    //3.将三个参数字符串拼接成一个字符串进行sha1加密
    let tempStr = array.join("");
    let shaObj = new jsSHA("SHA-1", "TEXT");
    shaObj.update(tempStr);
    let scyptoString = shaObj.getHash("HEX");
    //4.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
    if (signature === scyptoString) {
        console.log("验证成功");
        res.send(echostr);
    } else {
        console.log("验证失败");
        res.send("验证失败");
    }
});
// 响应用户发送来的消息
const xml2js = require('xml2js');
router.post('/', (req, res) => {
    let xml = ''
    req.on('data', (chunk) => {
        xml  = chunk
    })
    req.on('end', () => {
        //将接受到的xml数据转化为json
        xml2js.parseString(xml, {explicitArray: false}, function (err, json) {
            const backTime = new Date().getTime();  //创建发送时间,整数
            if (json.xml.MsgType === 'event') {  //消息为事件类型
                if (json.xml.EventKey === 'clickEvent') {
                    res.send(getXml(json, backTime, '你戳我干啥...'))  //回复用户的消息
                }
            } else if (json.xml.MsgType === 'text') {  //消息为文字类型
                const key = "填写机器人APIKEY"
                const url = "http://api.tianapi.com/robot/index?key="   key   "&question="   encodeURI(json.xml.Content);
                axios.get(url)
                    .then(function (response) {
                        res.send(getXml(json, backTime, response.data.newslist[0].reply))  //回复用户的消息
                    });
            }
        });
    })

    function getXml(json, backTime, word) {
        return `<xml>
					<ToUserName><![CDATA[${json.xml.FromUserName}]]></ToUserName>
					<FromUserName><![CDATA[${json.xml.ToUserName}]]></FromUserName>
					<CreateTime>${backTime}</CreateTime>
					<MsgType><![CDATA[text]]></MsgType>
					<Content><![CDATA[${word}]]></Content>
				</xml>`;
    }
})
module.exports = router;

注意:你需要将上述代码中的token和机器的APIKEY替换成自己的。

将项目部署到服务器

打开宝塔面板

打开宝塔面板打开宝塔面板

安装环境

安装Nginx

安装Nginx安装Nginx

安装Node.js

安装Node.js1安装Node.js1
安装Node.js2安装Node.js2

注意:registry源选择淘宝源,版本最好选稳定版。

安装Node.js3安装Node.js3

上传源码到服务器

上传源码到服务器1上传源码到服务器1
上传源码到服务器2上传源码到服务器2
上传源码到服务器3上传源码到服务器3

添加Node.js项目

添加Node.js项目添加Node.js项目

反向代理

创建网站创建网站
设置反向代理设置反向代理

微信公众平台配置

登录微信公众平台

登录微信公众平台登录微信公众平台

填写服务器配置

微信公众号配置微信公众号配置

注意:此处的token与代码中的token应该保持一致。消息加密方式选兼容模式。填写好相关配置后记得保存,别忘了还要点一下启动!

启用截图启用截图

微信测试截图

Screenshot_2022-04-16-23-17-41-234_com.tencent.mmScreenshot_2022-04-16-23-17-41-234_com.tencent.mm

0 人点赞