Botkit With Express

孤街醉人 提交于 2021-02-19 04:08:30

问题


The documentation at Botkit (https://github.com/howdyai/botkit/blob/master/readme-facebook.md) is pretty not meaningful at all:

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

Moreover, without a custom webserver (like express), Botkit doesnt provide a way to set the custom local url (instead, it simply chooses 0.0.0.0, which is impractical).

Is anyone successfully assembling app = require('express')(); into the setupWebserver in Botkit (specially for Messenger). If yes, please present the full code.


回答1:


Hostname for the built in express server can be set when creating your controller:

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

controller.setupWebserver and controller.createWebhookEndpoints are helper functions within botkit to do just what they describe, create an express webserver and webhook endpoints, respectively.

To implement your own webserver, you just need to setup a webhook endpoint for the botkit controller to receive message POST data at and perform auth handshakes.

By botkit convention this is /{platform}/receive so for facebook /facebook/receive but you can use whatever you like.


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



回答2:


You can find in github a, MIT-licensed, full Demo of running BotKit for Facebook Messenger on an Express server with MongoDB storage.

Here is the main 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'))
})



回答3:


okay so here goes i was trying the same thing and have been able to start the botkit up with a custom url on express. You dont have to worry about this code at all:

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

This repository has its own code with will work with a mongodb database and a express server.

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

Dont Forget to add your variables to .env file in the directory.

All your traffic on local host will be redirected to the localtunnel, you can get a url using the lt --subdomain name --port 5000

Use this generated url in the webhooks on your page and your bot should be online.



来源:https://stackoverflow.com/questions/41033530/botkit-with-express

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!