Botkit With Express

hir*_*iro 3 express botkit facebook-messenger-bot

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!!!');
  });
});
Run Code Online (Sandbox Code Playgroud)

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

是否有人成功组装app = require('express')();setupWebserverBotkit(特别是Messenger).如果是,请提供完整的代码.

Jon*_*rch 10

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

var controller = Botkit.facebookbot({
  hostname: 'YOUR_HOST_NAME',
  verify_token: '',
  access_token: ''
})
Run Code Online (Sandbox Code Playgroud)

controller.setupWebserver并且controller.createWebhookEndpoints是botkit中的辅助函数,可以完成他们描述的内容,分别创建一个快速的Web服务器和webhook端点.

要实现自己的Web服务器,您只需要为botkit控制器设置webhook端点,以便接收消息POST数据并执行auth握手.

通过botkit约定,这/{platform}/receive对于facebook来说是如此,/facebook/receive但你可以使用你喜欢的任何东西.


要将自定义快速服务器与Botkit一起使用,请首先创建一个基本的Web服务器.

// 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;

}
Run Code Online (Sandbox Code Playgroud)

接下来,您需要为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');
            }
        }
    });

}
Run Code Online (Sandbox Code Playgroud)

创建这两个文件后,您将使用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);
Run Code Online (Sandbox Code Playgroud)