搭建微信 AI 机器人-云服务器玩法免费在线实验

[复制链接]
查看: 785|回复: 0
发表于 2020-4-7 16:28:44 | 显示全部楼层 |阅读模式
实验内容本实验带您一步一步实现微信AI机器人,期间介绍了申请公众号、申请机器人、如何配置公众号后台、如何调用机器人 API 等内容。

首次可免费使用云主机 1 小时 ,到期后云主机将被重置并退库,若想保留成果请及时留用。


免费在线实验地址:
点击进入
实验资源:云服务器,没有云服务器的朋友推荐1折抢购:69元/年的阿里云服务器、或者99元/年的腾讯云服务器

软件环境CentOS 7.2 64 位


一、公众号申请

注册一个公众号


首先进入微信公众号平台,然后注册一个账号,类型选择订阅号,然后根据相应的提示完成信息的填写和验证。


二、后台服务器的搭建

安装 NodeJS


首先执行以下命令

  1. sudo su
复制代码
下载最新的稳定版 v6.10.3 到本地
  1. wget https://nodejs.org/dist/v6.10.3/node-v6.10.3-linux-x64.tar.xz
复制代码
下载完成后, 将其解压
  1. tar xvJf node-v6.10.3-linux-x64.tar.xz
复制代码
将解压的 Node.js 目录移动到 /usr/local 目录下
  1. mv node-v6.10.3-linux-x64 /usr/local/node-v6
复制代码
配置 node 软链接到 /bin 目录
  1. ln -s /usr/local/node-v6/bin/node /bin/node
复制代码
配置 NPM
NPM 是 Node.js 的包管理和分发工具。它可以让 Node.js 开发者能够更加轻松的共享代码和共用代码片段

下载 node 的压缩包中已经包含了 npm , 我们只需要将其软链接到 bin 目录下即可
  1. ln -s /usr/local/node-v6/bin/npm /bin/npm
复制代码
配置环境变量
将 /usr/local/node-v6/bin 目录添加到 $PATH 环境变量中可以方便地使用通过 npm 全局安装的第三方工具
  1. echo 'export PATH=/usr/local/node-v6/bin:$PATH' >> /etc/profile
复制代码
生效环境变量
  1. source /etc/profile
复制代码
安装 Express
安装 Express 应用脚手架:
  1. npm install express-generator -g
复制代码
创建新的项目
执行
  1. cd /data/
  2. express yourApp
复制代码
这时候会在 /data 生成应用目录 /yourApp,继续执行以下命令
  1. cd yourApp
  2. npm install
  3. npm start
复制代码
此时服务已经在 http://<您的 CVM IP 地址>:3000 上启动,可以在浏览器中浏览测试。

三、进入开发者模式
配置服务器信息,进入开发者模式
微信平台会去验证你填写的服务器的有效性,所以配置服务器前要先编写服务器有效性验证的代码。

在终端使用 Ctrl + C 终止刚才启动的服务,然后执行以下命令安装依赖的文件:
  1. npm install xml2js sha1 querystring
复制代码
编辑 app.js,参考下面的代码:
示例代码:/data/yourApp/app.js
  1. var express = require('express');
  2. var app = express();
  3. var http = require('http');
  4. var sha1 = require('sha1');
  5. var xml2js = require('xml2js');
  6. var querystring  = require('querystring');

  7. process.env.PORT = '80';
  8. function checkSignature(req) {
  9.   // 获取校验参数
  10.   var signature = req.query.signature;
  11.   var timestamp = req.query.timestamp;
  12.   var nonce = req.query.nonce;

  13.   // 此处为实验分配了一个 token,也可以修改为自己的 token
  14.   var token = 'Password';

  15.   // 按照字典排序
  16.   var params = [token, timestamp, nonce];
  17.   params.sort();

  18.   // 连接
  19.   var str = sha1(params.join(""));

  20.   // 返回签名是否一致
  21.   return str == signature;
  22. }

  23. // 接入验证
  24. app.get('/', function(req, res) {
  25.   // 签名成功
  26.   if (checkSignature(req)) {
  27.     res.send(200, req.query.echostr);
  28.   } else {
  29.     res.send(200, 'fail');
  30.   }
  31. });

  32. module.exports = app;
复制代码
启动服务:
  1. npm start
复制代码
登录微信公众号平台,然后拉到页面的最下面,点击基本配置菜单。填写以下信息:

  • 服务器地址(URL):填写 http://<您的 CVM IP 地址> [?]
  • 令牌(Token):填写上面代码中使用到的 Token,如无修改,直接使用 Password
  • 消息加解密密钥(EncodingAESKey):随机字符串。可以让平台生成。
  • 消息加解密方式:选择明文方式。


配置完毕后点击提交,提交成功后,在基本配置菜单页面点击启用。

此时,微信用户给公众号发送的信息,会由微信平台转发给您的服务器,然后您的服务器进行处理后返回给用户。

在页面点击提交,检查是否可以提交成功。

四、机器人的实现
实现机器人功能
首先在图灵机器人官网注册和申请一个机器人
申请之后,我们来调用 API 实现机器人的功能。

编辑 app.js,参考下面的代码:

示例代码:/data/yourApp/app.js

这是您的服务器地址,服务器主要是用于实现机器人的逻辑。主机部分必须是公网 IP 或者可解析到公网 IP 的域名。
  1. var express = require('express');
  2. var app = express();
  3. var http = require('http');
  4. var sha1 = require('sha1');
  5. var xml2js = require('xml2js');
  6. var querystring  = require('querystring');

  7. process.env.PORT = '80';
  8. function checkSignature(req) {
  9.   // 获取校验参数
  10.   var signature = req.query.signature;
  11.   var timestamp = req.query.timestamp;
  12.   var nonce = req.query.nonce;

  13.   // 此处为实验分配了一个 token,也可以修改为自己的 token
  14.   var token = 'Password';

  15.   // 按照字典排序
  16.   var params = [token, timestamp, nonce];
  17.   params.sort();

  18.   // 连接
  19.   var str = sha1(params.join(""));

  20.   // 返回签名是否一致
  21.   return str == signature;
  22. }

  23. // 接入验证
  24. app.get('/', function(req, res) {
  25.   // 签名成功
  26.   if (checkSignature(req)) {
  27.     res.send(200, req.query.echostr);
  28.   } else {
  29.     res.send(200, 'fail');
  30.   }
  31. });

  32. function handler(req, res) {
  33.   let  buf = '';
  34.   // 获取XML内容
  35.   req.setEncoding('utf8');
  36.   req.on('data', function(chunk) {
  37.     buf += chunk;
  38.   });
  39.   // 内容接收完毕
  40.   req.on('end', function() {
  41.     xml2js.parseString(buf, function(err, json) {
  42.       if (err) {
  43.         err.status = 400;
  44.       } else {
  45.         req.body = json;
  46.       }
  47.     });

  48.     let data = req.body.xml;
  49.     var msg = {
  50.       "toUserName" : data.FromUserName[0],
  51.       "fromUserName" : data.ToUserName[0],
  52.       "createTime" : data.CreateTime[0],
  53.       "msgType" : data.MsgType[0],
  54.       "content" : data.Content[0],
  55.       "msgId" : data.MsgId[0]
  56.     };
  57.     request(msg, req, res)

  58.   });
  59. }

  60. function request(data, req, res) {
  61.   var msg = {            
  62.     "key":'6d76234cf7ee488d84aa1a54397ae866',   // 可以填入自己申请的机器人的apiKey            
  63.     "info": data.content,            
  64.     "userid": ~~(Math.random() * 99999)
  65.   };  
  66.   var text = querystring.stringify(msg);   
  67.   var options = {  
  68.       hostname: 'www.tuling123.com',  
  69.       path: '/openapi/api',  
  70.       method: 'POST',
  71.       headers: {  
  72.         'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'  
  73.     }  
  74.   };  

  75.   var requestObj = http.request(options, function (response) {  
  76.       var result = '';
  77.       response.setEncoding('utf8');  
  78.       response.on('data', function (chunk) {  
  79.          result +=  chunk;
  80.       });  
  81.       response.on('end',function() {  
  82.       try{
  83.           var obj = JSON.parse(result);
  84.         }
  85.           catch(e){
  86.               data.content = e.message;
  87.           echo(data, res);
  88.           return;
  89.             }
  90.         data.content = obj.text;
  91.         echo(data, res);
  92.       })
  93.   });  

  94.   requestObj.on('error', function (e) {
  95.       console.log('problem with request: ' + e.message);  
  96.       data.content = e.message;  
  97.       echo(data, res);
  98.   });  
  99.   requestObj.write(text);
  100.   requestObj.end();  
  101. }
  102. function echo(data, res) {
  103.   var time = Math.round(new Date().getTime() / 1000);
  104.   var output = "" +
  105.               "<xml>" +
  106.                  "<ToUserName><![CDATA[" + data.toUserName + "]]></ToUserName>" +
  107.                  "<FromUserName><![CDATA[" + data.fromUserName + "]]></FromUserName>" +
  108.                  "<CreateTime>" + time + "</CreateTime>" +
  109.                  "<MsgType><![CDATA[" + data.msgType + "]]></MsgType>" +
  110.                  "<Content><![CDATA[" + data.content + "]]></Content>" +
  111.               "</xml>";

  112.   res.type('xml');
  113.   res.send(output);
  114. }
  115. // Start
  116. app.post('/', function(req, res) {
  117.   handler(req, res);
  118. });

  119. module.exports = app;
复制代码
操作键盘按下 Ctrl + C 终止之前的服务,然后重新启动:
  1. npm start
复制代码
您可用对比模式查看新增的部分
五、部署完成
访问服务
在微信公众号中关注自己的公众号,然后发送信息给公众号,测试是否有返回。在微信公众号平台可以对公众号信息进行管理。更复杂的逻辑可以参考微信公众号平台开发者文档和图灵机器人开发文档。

大功告成
恭喜您已经完成了搭建微信 AI 机器人的学习,您可以留用或者购买 Linux 版本的 CVM继续学习。

腾讯云
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文



在线客服(工作时间:9:00-22:00)
400-600-6565

内容导航

微信客服

Copyright   ©2015-2019  云服务器社区  Powered by©Discuz!  技术支持:尊托网络     ( 湘ICP备15009499号-1 )