botium-core
Version:
The Selenium for Chatbots
148 lines (131 loc) • 4.06 kB
JavaScript
// This is still work in progress
/*
Please report any bugs to nicomwaks@gmail.com
i have added console.log on line 48
*/
const express = require('express')
const bodyParser = require('body-parser')
const request = require('request')
const app = express()
app.set('port', (process.env.PORT || 5000))
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({extended: false}))
// parse application/json
app.use(bodyParser.json())
// index
app.get('/', function (req, res) {
res.send('hello world i am a secret bot')
})
// for facebook verification
app.get('/webhook/', function (req, res) {
if (req.query['hub.verify_token'] === 'my_voice_is_my_password_verify_me') {
res.send(req.query['hub.challenge'])
} else {
res.send('Error, wrong token')
}
})
app.get('/health/', function (req, res) {
res.status(201).send('Chatbot is ready')
})
// to post data
app.post('/webhook/', function (req, res) {
if (!req.body || !req.body.entry || !req.body.entry.length > 0) { return res.sendStatus(200) }
let messagingEvents = req.body.entry[0].messaging
for (let i = 0; i < messagingEvents.length; i++) {
let event = req.body.entry[0].messaging[i]
let sender = event.sender.id
if (event.message && event.message.text) {
let text = event.message.text
if (text === 'Generic') {
console.log('welcome to chatbot')
sendGenericMessage(sender)
continue
}
sendTextMessage(sender, 'Text received, echo: ' + text.substring(0, 200))
}
if (event.postback) {
let text = JSON.stringify(event.postback)
sendTextMessage(sender, 'Postback received: ' + text.substring(0, 200), token)
continue
}
}
res.sendStatus(200)
})
// recommended to inject access tokens as environmental variables, e.g.
// const token = process.env.FB_PAGE_ACCESS_TOKEN
const token = '<FB_PAGE_ACCESS_TOKEN>'
function sendTextMessage (sender, text) {
let messageData = { text: text }
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {access_token: token},
method: 'POST',
json: {
recipient: {id: sender},
message: messageData
}
}, function (error, response, body) {
if (error) {
console.log('Error sending messages: ', error)
} else if (response.body.error) {
console.log('Error: ', response.body.error)
} else {
console.log('Bot Sent Message: ', messageData)
}
})
}
function sendGenericMessage (sender) {
let messageData = {
'attachment': {
'type': 'template',
'payload': {
'template_type': 'generic',
'elements': [{
'title': 'First card',
'subtitle': 'Element #1 of an hscroll',
'image_url': 'http://messengerdemo.parseapp.com/img/rift.png',
'buttons': [{
'type': 'web_url',
'url': 'https://www.messenger.com',
'title': 'web url'
}, {
'type': 'postback',
'title': 'Postback',
'payload': 'Payload for first element in a generic bubble'
}]
}, {
'title': 'Second card',
'subtitle': 'Element #2 of an hscroll',
'image_url': 'http://messengerdemo.parseapp.com/img/gearvr.png',
'buttons': [{
'type': 'postback',
'title': 'Postback',
'payload': 'Payload for second element in a generic bubble'
}]
}]
}
}
}
request({
url: 'https://graph.facebook.com/v2.6/me/messages',
qs: {access_token: token},
method: 'POST',
json: {
recipient: {id: sender},
message: messageData
}
}, function (error, response, body) {
if (error) {
console.log('Error sending messages: ', error)
} else if (response.body.error) {
console.log('Error: ', response.body.error)
} else {
console.log('Bot Sent Message: ', messageData)
}
})
}
// spin spin sugar
app.listen(app.get('port'), function () {
console.log('running on port', app.get('port'))
})