Express 带特快专递的Botkit
Botkit()上的文档毫无意义:Express 带特快专递的Botkit,express,botkit,facebook-messenger-bot,Express,Botkit,Facebook Messenger Bot,Botkit()上的文档毫无意义: // 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(con
// 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!!!');
});
});
此外,如果没有自定义Web服务器(如express),Botkit不会提供设置自定义本地url的方法(相反,它只是选择0.0.0.0,这是不切实际的)
是否有人成功组装
app=require('express')()编码>到Botkit中的setupWebserver
(专门用于Messenger)。如果是,请提供完整的代码。您可以在github a中找到,MIT授权,完整
这是主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'))
})
好了,我也在尝试同样的事情,并且已经能够在express上使用自定义url启动僵尸工具包。您根本不必担心此代码:
controller.setupWebserver(process.env.port,function(err,webserver) {
controller.createWebhookEndpoints(controller.webserver, bot, function() {
console.log('This bot is online!!!');
});
});
该存储库有自己的代码,可以与mongodb数据库和express服务器一起使用
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 name--port 5000获取url
在网页上的webhooks中使用此生成的url,您的机器人应该处于联机状态。创建控制器时,可以设置内置express服务器的主机名:
var controller = Botkit.facebookbot({
hostname: 'YOUR_HOST_NAME',
verify_token: '',
access_token: ''
})
controller.setupWebserver
和controller.createWebhookEndpoints
是botkit中的帮助函数,它们分别用于创建express webserver和webhook端点
要实现您自己的Web服务器,您只需要为botkit控制器设置一个webhook端点,以便在接收消息发布数据并执行身份验证握手
按照botkit约定,这是/{platform}/receive
,所以对于facebook/facebook/receive
,但是你可以使用任何你喜欢的东西
要将自定义express服务器与Botkit一起使用,请先创建一个基本Web服务器。
// 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');
}
}
});
}
// 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);
创建这两个文件后,将使用require并将控制器传递到express模块中。您的主bot文件应该如下所示
// 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');
}
}
});
}
// 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);
如果它是您希望应用程序使用的唯一https URL地址,您可以使用它。如果在创建控制器时添加require\u delivery=true
,此解决方案将失效。如果没有require\u delivery=true
几乎不可能为对话创建复杂的结构,因为bot.say()、bot.ask()被忽略。这是我在github存储库中打开的一个to问题,介意检查一下吗?@KārlisJanisels此问题已在后续版本中修复,不记得是哪个问题,但这应该不再是一个问题。