使用微信公众号搭建一个 AI 机器人

文章
林里克斯

使用微信公众号搭建一个 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

使用微信公众号搭建一个 AI 机器人


二、配置及验证微信公众号的开发者模式


由于微信平台会去验证你填写的服务器的有效性,所以配置服务器前要先编写服务器有效性验证的代码

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.公众号后台配置

登录公众号后台 -> 左侧菜单开发 -> 基本配置 -> 服务器配置 -> 修改配置 -> 启用

使用微信公众号搭建一个 AI 机器人

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

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


三、机器人配置


1.图灵官网

http://www.tuling123.com/

2.购买套餐

个人套餐一个月 19.9

使用微信公众号搭建一个 AI 机器人

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.验证结果

使用微信公众号搭建一个 AI 机器人

使用这个 Key 每天有免费 10 次的调用。


Over~

版权协议须知!

本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

1304 0 2020-12-30


分享:
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
博主卡片
林里克斯 博主大人
一个致力于Linux的运维平台
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。

现在时间 2024-12-28

今日天气
站点统计
  • 文章总数:241篇
  • 分类总数:29个
  • 评论总数:12条
  • 本站总访问量 353174 次

@奥奥

@Wong arrhenius 牛比

@MakerFace 厉害了!