使用微信公众号搭建一个 AI 机器人
实验平台:
CentOS Linux release 7.6.1810 (Core)
node Version:
node v14.15.3
npm Version:
npm 6.14.9
公众号申请步骤省略,建议先注册一个账号,类型选择订阅号。再进行下面的步骤
一、搭建环境
1.nodejs
官网
https://nodejs.org/en/download/
2.下载最新安装包
$ wget https://nodejs.org/dist/v14.15.3/node-v14.15.3-linux-x64.tar.xz
3.解压安装
$ tar xf node-v14.15.3-linux-x64.tar.xz
$ sudo mv node-v14.15.3-linux-x64 /usr/local/node
$ sudo ln -s /usr/local/node/bin/node /usr/local/bin/node
$ sudo ln -s /usr/local/node/bin/npm /usr/local/bin/npm
$ export PATH=/usr/local/node/bin:$PATH
#创建临时环境变量
4.验证版本
$ node -v
v14.15.3
$ npm -v
6.14.9
5.安装 express
$ sudo npm install express-generator -g
#会向 node/lib/ 目录下写入 express-generator 模板
6.创建一个自定义项目
$ sudo express weixin
# weixin 为自定义项目
warning: the default view engine will not be jade in future releases
warning: use `--view=jade' or `--help' for additional options
create : weixin/
create : weixin/public/
create : weixin/public/javascripts/
create : weixin/public/images/
create : weixin/public/stylesheets/
create : weixin/public/stylesheets/style.css
create : weixin/routes/
create : weixin/routes/index.js
create : weixin/routes/users.js
create : weixin/views/
create : weixin/views/error.jade
create : weixin/views/index.jade
create : weixin/views/layout.jade
create : weixin/app.js
create : weixin/package.json
create : weixin/bin/
create : weixin/bin/www
change directory:
$ cd weixin
install dependencies:
$ npm install
run the app:
$ DEBUG=weixin:* npm star
7.安装及启动
$ cd weixin
$ npm install
$ npm start
8.访问测试
IP:3000
二、配置及验证微信公众号的开发者模式
由于微信平台会去验证你填写的服务器的有效性,所以配置服务器前要先编写服务器有效性验证的代码
1.安装所需依赖
$ npm install xml2js sha1 querystring
2.编辑 app.js
$ vim /data/weixin/app.js
var express = require('express');
var app = express();
var http = require('http');
var sha1 = require('sha1');
var xml2js = require('xml2js');
var querystring = require('querystring');
process.env.PORT = '80';
function checkSignature(req) {
// 获取校验参数
var signature = req.query.signature;
var timestamp = req.query.timestamp;
var nonce = req.query.nonce;
// 此处为实验随机分配了一个 token,也可以修改为自己的 token
var token = 'redhat';
// 按照字典排序
var params = [token, timestamp, nonce];
params.sort();
// 连接
var str = sha1(params.join(""));
// 返回签名是否一致
return str == signature;
}
// 接入验证
app.get('/', function(req, res) {
// 签名成功
if (checkSignature(req)) {
res.send(200, req.query.echostr);
} else {
res.send(200, 'fail');
}
});
module.exports = app;
#可以先备份原文件,再新建 app.js
3.公众号后台配置
登录公众号后台 -> 左侧菜单开发 -> 基本配置 -> 服务器配置 -> 修改配置 -> 启用
- 服务器地址
(URL)
:填写http://< 服务器IP 地址>
- 令牌
(Token)
:填写上面代码中使用到的Token
,如无修改,直接使用redhat
- 消息加解密密钥
(EncodingAESKey)
:随机字符串。可以自动生成。 - 消息加解密方式:选择明文方式。
启用后用户给公众号发送的信息,会由微信平台转发给您的服务器,然后您的服务器进行处理后返回给用户
三、机器人配置
1.图灵官网
http://www.tuling123.com/
2.购买套餐
个人套餐一个月 19.9
3.套餐购买好之后会有一个 Key
$ vim /data/weixin/app.js
var express = require('express');
var app = express();
var http = require('http');
var sha1 = require('sha1');
var xml2js = require('xml2js');
var querystring = require('querystring');
process.env.PORT = '80';
function checkSignature(req) {
// 获取校验参数
var signature = req.query.signature;
var timestamp = req.query.timestamp;
var nonce = req.query.nonce;
// 此处为实验分配了一个 token,也可以修改为自己的 token
var token = 'Password';
// 按照字典排序
var params = [token, timestamp, nonce];
params.sort();
// 连接
var str = sha1(params.join(""));
// 返回签名是否一致
return str == signature;
}
// 接入验证
app.get('/', function(req, res) {
// 签名成功
if (checkSignature(req)) {
res.send(200, req.query.echostr);
} else {
res.send(200, 'fail');
}
});
function handler(req, res) {
let buf = '';
// 获取XML内容
req.setEncoding('utf8');
req.on('data', function(chunk) {
buf += chunk;
});
// 内容接收完毕
req.on('end', function() {
xml2js.parseString(buf, function(err, json) {
if (err) {
err.status = 400;
} else {
req.body = json;
}
});
let data = req.body.xml;
var msg = {
"toUserName" : data.FromUserName[0],
"fromUserName" : data.ToUserName[0],
"createTime" : data.CreateTime[0],
"msgType" : data.MsgType[0],
"content" : data.Content[0],
"msgId" : data.MsgId[0]
};
request(msg, req, res)
});
}
function request(data, req, res) {
var msg = {
"key":'6d76234cf7ee488d84aa1a54397ae866', // 可以填入自己申请的机器人的apiKey
"info": data.content,
"userid": ~~(Math.random() * 99999)
};
var text = querystring.stringify(msg);
var options = {
hostname: 'www.tuling123.com',
path: '/openapi/api',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
}
};
var requestObj = http.request(options, function (response) {
var result = '';
response.setEncoding('utf8');
response.on('data', function (chunk) {
result += chunk;
});
response.on('end',function() {
try{
var obj = JSON.parse(result);
}
catch(e){
data.content = e.message;
echo(data, res);
return;
}
data.content = obj.text;
echo(data, res);
})
});
requestObj.on('error', function (e) {
console.log('problem with request: ' + e.message);
data.content = e.message;
echo(data, res);
});
requestObj.write(text);
requestObj.end();
}
function echo(data, res) {
var time = Math.round(new Date().getTime() / 1000);
var output = "" +
"<xml>" +
"<ToUserName><![CDATA[" + data.toUserName + "]]></ToUserName>" +
"<FromUserName><![CDATA[" + data.fromUserName + "]]></FromUserName>" +
"<CreateTime>" + time + "</CreateTime>" +
"<MsgType><![CDATA[" + data.msgType + "]]></MsgType>" +
"<Content><![CDATA[" + data.content + "]]></Content>" +
"</xml>";
res.type('xml');
res.send(output);
}
// Start
app.post('/', function(req, res) {
handler(req, res);
});
module.exports = app;
4.启动
$ npm start
5.验证结果
使用这个 Key
每天有免费 10
次的调用。
Over~
版权协议须知!
本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
1304 0 2020-12-30
博主卡片
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。
现在时间 2024-12-28
今日天气
站点统计
- 文章总数:241篇
- 分类总数:29个
- 评论总数:12条
- 本站总访问量 353174 次
@xiaozi 最后的分享的镜像下载地址打不开 服务器没有开机吗?
@yuanyuan 为什么我的4b安装centos7.9 插上tf卡 显示不兼...
@Wong arrhenius 牛比
@MakerFace 厉害了!
@TongSir 老哥 更新下我的友链链接 https://blog.ton...