首页 文章

Botkit With Express

提问于
浏览
3

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!!!');
  });
});

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

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

3 回答

  • 0

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

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

    controller.setupWebservercontroller.createWebhookEndpoints 是botkit中的辅助函数,可以完成他们描述的内容,分别创建快速Web服务器和webhook endpoints .

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

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


    To use a custom express server with Botkit, first create a basic webserver.

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

    Next you need to create the routes for webhook endpoints, we're doing this in a separate file as is common with 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');
                }
            }
        });
    
    }
    

    Once you have created these two files, you will use require and pass your controller into the express module. Your main bot file should look something like this

    // 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);
    
  • 10

    你可以在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'))
    })
    
  • 0

    好吧所以这里我正在尝试相同的事情,并已能够启动botkit与快递上的自定义URL . 您根本不必担心此代码:

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

    此存储库有自己的代码,可以使用mongodb数据库和快速服务器 .

    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文件中 .

    您在本地主机上的所有流量都将重定向到localtunnel,您可以使用lt --subdomain名称获取网址--port 5000

    在页面上的webhook中使用此生成的URL,您的机器人应该在线 .

相关问题