Боткит с экспрессом

Документация на 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 не предоставляет возможности установить собственный локальный URL-адрес (вместо этого он просто выбирает 0.0.0.0, что нецелесообразно).

Кто-нибудь успешно собирает app = require('express')(); в setupWebserver в Botkit (специально для Messenger). Если да, предоставьте полный код.


person hiro    schedule 08.12.2016    source источник
comment
Если вам нужен уникальный URL-адрес https для вашего приложения, вы можете использовать ngrok.com.   -  person pourmesomecode    schedule 24.01.2017


Ответы (3)


Имя хоста для встроенного экспресс-сервера можно задать при создании контроллера:

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

controller.setupWebserver и controller.createWebhookEndpoints — это вспомогательные функции в ботките, которые делают именно то, что они описывают, создают конечные точки экспресс-веб-сервера и веб-перехватчика соответственно.

Чтобы реализовать свой собственный веб-сервер, вам просто нужно настроить конечную точку веб-перехватчика для контроллера боткита, чтобы получать данные сообщения POST и выполнять рукопожатия аутентификации.

По соглашению боткита это /{platform}/receive, поэтому для facebook /facebook/receive, но вы можете использовать все, что захотите.


Чтобы использовать собственный экспресс-сервер с Botkit, сначала создайте базовый веб-сервер.

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

}

Далее вам нужно создать маршруты для конечных точек веб-перехватчиков, мы делаем это в отдельном файле, как это обычно бывает в 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 и передать свой контроллер в экспресс-модуль. Ваш основной файл бота должен выглядеть примерно так

// 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);
person Jon Church    schedule 27.04.2017
comment
К сожалению, это решение не работает, если мы добавим require_delivery = true при создании контроллера. Без require_delivery=true практически невозможно создать сложную структуру для диалога, потому что bot.say(), bot.ask() игнорируются. Вот ссылка на задачу, которую я открыл в репозитории github, не могли бы вы ее проверить? - person Kārlis Janisels; 16.06.2017
comment
@KārlisJanisels эта проблема была исправлена ​​в следующем выпуске, не помню в каком, но это больше не должно быть проблемой. - person Jon Church; 18.08.2018

Вы можете найти на github, под лицензией MIT, полную демонстрацию запуска BotKit для Facebook Messenger на сервер Express с хранилищем MongoDB.

Вот основной 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'))
})
person Ortomala Lokni    schedule 17.12.2016

Итак, вот, я пытался сделать то же самое и смог запустить боткит с пользовательским URL-адресом в Express. Вам вообще не нужно беспокоиться об этом коде:

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 в каталоге.

Весь ваш трафик на локальном хосте будет перенаправлен на локальный туннель, вы можете получить URL-адрес, используя lt --subdomain name --port 5000

Используйте этот сгенерированный URL-адрес в веб-перехватчиках на своей странице, и ваш бот должен быть в сети.

person shabbzy    schedule 11.02.2017