UNPKG

ht-messenger

Version:
247 lines (227 loc) 6.83 kB
var https = require('https'), express = require('express'), request = require('request'), fs = require('fs'), bodyParser = require('body-parser'), crypto = require('crypto'), configF = require(__dirname+'/../../config'); var config = configF.config; const APP_SECRET = config.appSecret, VERIFY_TOKEN = config.webhookToken, PAGE_ACCESS_TOKEN = config.pageToken, VERIFY_CODE = config.code, URL = config.url; var app = express(); app.use(bodyParser.json({ verify: verifyRequestSignature })); app.use(express.static('public')); var port = process.env.PORT || 9000; var opts = { key: fs.readFileSync('cert/wsskey.pem'), cert: fs.readFileSync('cert/wsscert.pem'), ca: fs.readFileSync('cert/cacert.pem') } app.get('/', function (req, res){ res.sendFile( __dirname + '/public/error.html'); }); app.get('/webhook', function(req, res) { if (req.query['hub.mode'] === 'subscribe' && req.query['hub.verify_token'] === VERIFY_TOKEN) { console.log("Validating webhook"); res.status(200).send(req.query['hub.challenge']); } else { console.error("Failed validation. Make sure the validation tokens match."); res.sendStatus(403); } }); app.post('/webhook', function (req, res) { var data = req.body; if (data.object === 'page') { data.entry.forEach(function(entry) { var pageID = entry.id; var timeOfEvent = entry.time; entry.messaging.forEach(function(event) { if (event.message) { receivedMessage(event); } else if (event.postback) { receivedPostback(event); } else if (event.delivery) { receivedDeliveryConfirmation(event); } else { console.log("Webhook received unknown event: ", event); } }); }); res.sendStatus(200); } }); function onPostback(senderID, payload){ } function onMsg(senderID, messageText){ var command = messageText.toLowerCase(); switch(command){ case 'data': case 'last': case 'latest': request({ method: 'POST', uri: URL + '/getData', json: { user: senderID, verify: VERIFY_CODE, mode: 'lastData' } }, function(err, response, body){ if(!err){ var uData = body.data; var msg = "Your last " + uData.length + " measurements:\n" + uData[0].date + ": " + uData[0].result; if(uData.length > 1){ for(var i = 1; i < uData.length; i++){ msg+="\n" + uData[i].date + ": " + uData[i].result; } createMessage('text', senderID, msg, function(messageTS){ callSendAPI(messageTS); }); } } else { console.log("Error getting user data:", err); createMessage('text', senderID, "Error getting your data. Try again later", function(messageTS){ callSendAPI(messageTS); }); } }); break; default: var help = "Unknown command. To ask for your latest data send:\nlast"; createMessage('text', senderID, help, function(messageTS){ callSendAPI(messageTS); }); break; } } function receivedPostback(event) { var senderID = event.sender.id; var recipientID = event.recipient.id; var timeOfPostback = event.timestamp; var payload = event.postback.payload; console.log("Received postback for user %d and page %d with payload '%s' " + "at %d", senderID, recipientID, payload, timeOfPostback); onPostback(senderID, payload); } function receivedMessage(event) { var senderID = event.sender.id; var recipientID = event.recipient.id; var timeOfMessage = event.timestamp; var message = event.message; console.log("Received message for user %d and page %d at %d with message:", senderID, recipientID, timeOfMessage); console.log(JSON.stringify(message)); var messageId = message.mid; var messageText = message.text; var messageAttachments = message.attachments; var help = 'Nie przyjmujemy załączników'; if (messageText) { onMsg(senderID, messageText); } else { createMessage('text', senderID, help, function(messageTS){ callSendAPI(messageTS); }); } } function verifyRequestSignature(req, res, buf) { var signature = req.headers["x-hub-signature"]; if (!signature) { console.error("Couldn't validate the signature."); } else { var elements = signature.split('='); var method = elements[0]; var signatureHash = elements[1]; var expectedHash = crypto.createHmac('sha1', APP_SECRET) .update(buf) .digest('hex'); if (signatureHash != expectedHash) { throw new Error("Couldn't validate the request signature."); } } } function receivedDeliveryConfirmation(event) { var senderID = event.sender.id; var recipientID = event.recipient.id; var delivery = event.delivery; var messageIDs = delivery.mids; var watermark = delivery.watermark; var sequenceNumber = delivery.seq; if (messageIDs) { messageIDs.forEach(function(messageID) { console.log("Received delivery confirmation for message ID: %s", messageID); }); } console.log("All message before %d were delivered.", watermark); } function createMessage(type, id, content, callback){ var message = { recipient: { id: id } }; console.log(content); if(type == 'text'){ message['message']={text: content}; }else{ message['message']={ attachment:{ type: 'template', payload:{ template_type: 'button', text: content['text'], buttons: content['buttons'] } } } } setImmediate(function(){ callback(message); }); } function createButtons(tab, callback){ var buttons=[]; for(var i = 0; i < tab.length; i++){ var btn = tab[i]; var singleBTN={}; singleBTN['type']=btn[0]; singleBTN['title']=btn[2]; if(btn[0]=='web_url'){ singleBTN['url']=btn[1]; } else if(btn[0]=='postback'){ singleBTN['payload']=btn[1]; } console.log(singleBTN); console.log(JSON.stringify(singleBTN)); buttons.push(singleBTN); } setImmediate(function(){ console.log(buttons); callback(buttons); }); } function callSendAPI(messageData) { request({ uri: 'https://graph.facebook.com/v2.6/me/messages', qs: { access_token: PAGE_ACCESS_TOKEN }, method: 'POST', json: messageData }, function (error, response, body) { if (!error && response.statusCode == 200) { var recipientId = body.recipient_id; var messageId = body.message_id; if (messageId) { console.log("Successfully sent message with id %s to recipient %s", messageId, recipientId); } else { console.log("Successfully called Send API for recipient %s", recipientId); } } else { console.error("Failed calling Send API", response.statusCode, response.statusMessage, body.error); } }); } function run(){ https.createServer(opts, app).listen(9000); console.log('Started'); } exports.mess = run;