【问题标题】:Botkit With ExpressBotkit 与 Express
【发布时间】:2017-04-23 08:16:51
【问题描述】:

Botkit (https://github.com/howdyai/botkit/blob/master/readme-facebook.md) 的文档毫无意义:

// if you are already using Express, you can use your own server instance...
// see "Use BotKit with an Express web server"
controller.setupWebserver(process.env.port,function(err,webserver) {
  controller.createWebhookEndpoints(controller.webserver, bot, function() {
      console.log('This bot is online!!!');
  });
});

此外,没有自定义网络服务器(如 express),Botkit 不提供设置自定义本地 url 的方法(相反,它只是选择 0.0.0.0,这是不切实际的)。

是否有人成功地将app = require('express')(); 组装到 Botkit 中的setupWebserver 中(专门用于 Messenger)。如果是,请提供完整代码。

【问题讨论】:

  • 如果您的应用程序需要一个唯一的 https URL 地址,您可以使用ngrok.com

标签: express botkit facebook-messenger-bot


【解决方案1】:

你可以在 github 中找到一个,MIT 许可,完整的Demo of running BotKit for Facebook Messenger on an Express server with MongoDB storage

这里是主server.js

// modules =================================================
var express = require('express')     // framework d'appli
var app = express()
var bodyParser = require('body-parser') // BodyParser pour POST
var http = require('http').Server(app)      // préparer le serveur web
var dotenv = require('dotenv')
var path = require('path')

// configuration ===========================================

// load environment variables,
// either from .env files (development),
// heroku environment in production, etc...
dotenv.load()

app.use(express.static(path.join(__dirname, '/public')))

// parsing
app.use(bodyParser.json()) // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })) // for parsing url encoded

// view engine ejs
app.set('view engine', 'ejs')

// routes
require('./app/routes/routes')(app)

// port for Heroku
app.set('port', (process.env.PORT || 5000))

// START ===================================================
http.listen(app.get('port'), function () {
  console.log('listening on port ' + app.get('port'))
})

【讨论】:

    【解决方案2】:

    好的,所以我在尝试同样的事情,并且已经能够使用 express 上的自定义 url 启动 botkit。您完全不必担心这段代码:

    controller.setupWebserver(process.env.port,function(err,webserver) {
    controller.createWebhookEndpoints(controller.webserver, bot, function()     {
      console.log('This bot is online!!!');
     });
    });
    

    此存储库有自己的代码,可与 mongodb 数据库和 express 服务器一起使用。

    git clone https://github.com/mvaragnat/botkit-messenger-express-demo.git
    
    sudo npm install express --save
    sudo npm link body-parser
    sudo npm link dotenv
    sudo npm install --save botkit
    sudo npm install --save monkii
    sudo npm install --save mongodb
    sudo npm install --save request
    sudo npm install --save ejs
    
    
    In all of the above steps you can perform:
    sudo npm link botkit
    etc
    
    Finally run node server.js
    lt --subdomain botkit --port 5000
    restart node server.js
    

    不要忘记将变量添加到目录中的 .env 文件中。

    本地主机上的所有流量都将被重定向到本地隧道,您可以使用 lt --subdomain name --port 5000 获取 url

    在您页面的 webhook 中使用此生成的 url,您的机器人应该在线。

    【讨论】:

      【解决方案3】:

      可以在创建控制器时设置内置快速服务器的主机名:

      var controller = Botkit.facebookbot({
        hostname: 'YOUR_HOST_NAME',
        verify_token: '',
        access_token: ''
      })
      

      controller.setupWebservercontroller.createWebhookEndpoints 是 botkit 中的辅助函数,用于执行它们所描述的操作,分别创建一个 express webserver 和 webhook 端点。

      要实现您自己的网络服务器,您只需为 botkit 控制器设置一个 webhook 端点,以接收消息 POST 数据并执行身份验证握手。

      按照 botkit 约定,这是 /{platform}/receive,所以对于 facebook /facebook/receive,但你可以使用任何你喜欢的东西。


      要在 Botkit 中使用自定义 express 服务器,首先创建一个基本的网络服务器。

      // components/express_webserver.js
      
      var express = require('express');
      var bodyParser = require('body-parser');
      var querystring = require('querystring');
      var debug = require('debug')('botkit:webserver');
      
      module.exports = function(controller, bot) {
      
      
          var webserver = express();
          webserver.use(bodyParser.json());
          webserver.use(bodyParser.urlencoded({ extended: true }));
      
          webserver.use(express.static('public'));
      
          // You can pass in whatever hostname you want as the second argument
          // of the express listen function, it defaults to 0.0.0.0 aka localhost 
          webserver.listen(process.env.PORT || 3000,  null, function() {
      
              console.log('Express webserver configured and listening at ',
                  process.env.HOSTNAME || 'http://localhost/' + ':' + process.env.PORT || 3000);
      
          });
      
          // Register our routes, in this case we're just using one route
          // for all incoming requests from FB
          // We are passing in the webserver we created, and the botkit
          // controller into our routes file so we can extend both of them 
          require('./routes/incoming-webhook')(webserver, controller)
      
          controller.webserver = webserver;
      
          return webserver;
      
      }
      

      接下来您需要为 webhook 端点创建路由,我们在一个单独的文件中执行此操作,这在 express 中很常见

      // components/routes/webhook.js 
      
      module.exports = function(webserver, controller) {
      
          // Receive post data from fb, this will be the messages you receive 
          webserver.post('/facebook/receive', function(req, res) {
      
              // respond to FB that the webhook has been received.
              res.status(200);
              res.send('ok');
      
              var bot = controller.spawn({});
      
              // Now, pass the webhook into be processed
              controller.handleWebhookPayload(req, res, bot);
      
      
          });
      
          // Perform the FB webhook verification handshake with your verify token 
          webserver.get('/facebook/receive', function(req, res) {
              if (req.query['hub.mode'] == 'subscribe') {
                  if (req.query['hub.verify_token'] == controller.config.verify_token) {
                      res.send(req.query['hub.challenge']);
                  } else {
                      res.send('OK');
                  }
              }
          });
      
      }
      

      创建这两个文件后,您将使用 require 并将控制器传递给 express 模块。您的主 bot 文件应如下所示

      // bot.js
      
      var Botkit = require('botkit');
      
      // Create the Botkit controller, which controls all instances of the bot.
      var controller = Botkit.facebookbot({
          debug: true,
          verify_token: process.env.verify_token,
          access_token: process.env.page_token,
      });
      
      // Set up an Express-powered webserver to expose oauth and webhook endpoints
      // We are passing the controller object into our express server module
      // so we can extend it and process incoming message payloads 
      var webserver = require(__dirname + '/components/express_webserver.js')(controller);
      

      【讨论】:

      • 遗憾的是,如果我们在创建控制器时添加require_delivery = true,这个解决方案就会中断。如果没有require_delivery=true,几乎不可能创建复杂的对话结构,因为 bot.say()、bot.ask() 被忽略了。这是我在 github 存储库中打开的 link 问题,介意检查一下吗?
      • @KārlisJanisels 此问题已在后续版本中修复,不记得是哪个,但这应该不再是问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 2017-11-05
      相关资源
      最近更新 更多