Имя хоста для встроенного экспресс-сервера можно задать при создании контроллера:
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