Боткит С Экспресс
Документация на 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
в ботките (специально для мессенджера). Если да, пожалуйста, предоставьте полный код.
3 ответа
Имя хоста для встроенного экспресс-сервера может быть установлено при создании вашего контроллера:
var controller = Botkit.facebookbot({
hostname: 'YOUR_HOST_NAME',
verify_token: '',
access_token: ''
})
controller.setupWebserver
а также controller.createWebhookEndpoints
являются вспомогательными функциями внутри Botkit, которые выполняют только то, что они описывают, создают экспресс-веб-сервер и конечные точки webhook соответственно.
Чтобы реализовать свой собственный веб-сервер, вам просто нужно настроить конечную точку webhook, чтобы контроллер Botkit получал данные POST сообщения и выполнял аутентификационные рукопожатия.
По соглашению Botkit это /{platform}/receive
так для фейсбука /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;
}
Далее вам нужно создать маршруты для конечных точек 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');
}
}
});
}
Создав эти два файла, вы будете использовать 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);
Вы можете найти в github a, 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'))
})
Хорошо, вот и я, я пытался сделать то же самое и смог запустить боткит с пользовательским 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, вы можете получить URL, используя имя lt --subdomain --port 5000
Используйте этот сгенерированный URL в веб-крючках на своей странице, и ваш бот должен быть онлайн.