-
Notifications
You must be signed in to change notification settings - Fork 255
/
Copy pathsetup.js
106 lines (92 loc) · 4.78 KB
/
setup.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
'use strict';
const crypto = require('crypto');
const prompt = require('souffleur');
const rp = require('minimal-request-promise');
const fbReply = require('./reply');
const fbParse = require('./parse');
const validateFbRequestIntegrity = require('./validate-integrity');
const color = require('../console-colors');
module.exports = function fbSetup(api, bot, logError, optionalParser, optionalResponder) {
let parser = optionalParser || fbParse;
let responder = optionalResponder || fbReply;
api.get('/facebook', request => {
if (request.queryString['hub.verify_token'] === request.env.facebookVerifyToken)
return request.queryString['hub.challenge'];
logError(`Facebook can't verify the token. It expected '${request.env.facebookVerifyToken}', but got '${request.queryString['hub.verify_token']}'. Make sure you are using the same token you set in 'facebookVerifyToken' stage env variable.`);
return 'Error';
}, {success: {contentType: 'text/plain'}});
api.post('/facebook', request => {
// We are doing verification if FB Secret exist in env because we don't want to break old bots that forgot to add it
if (request.env.facebookAppSecret && !validateFbRequestIntegrity(request))
return Promise.reject('X-Hub-Signatures does not match');
let arr = [].concat.apply([], request.body.entry.map(entry => entry.messaging));
let fbHandle = parsedMessage => {
if (parsedMessage) {
var recipient = parsedMessage.sender;
return Promise.resolve(parsedMessage).then(parsedMessage => bot(parsedMessage, request))
.then(botResponse => responder(recipient, botResponse, request.env.facebookAccessToken))
.catch(logError);
}
};
return Promise.all(arr.map(message => fbHandle(parser(message))))
.then(() => 'ok');
});
api.addPostDeployStep('facebook', (options, lambdaDetails, utils) => {
return Promise.resolve().then(() => {
return utils.apiGatewayPromise.getStagePromise({
restApiId: lambdaDetails.apiId,
stageName: lambdaDetails.alias
}).then(data => {
if (options['configure-fb-bot']) {
let token, pageAccessToken, pageId, subscribedFields;
return Promise.resolve().then(() => {
if (data.variables && data.variables.facebookVerifyToken)
return data.variables.facebookVerifyToken;
return crypto.randomBytes(8);
})
.then(rawToken => {
token = rawToken.toString('base64').replace(/[^A-Za-z0-9]/g, '');
return utils.apiGatewayPromise.createDeploymentPromise({
restApiId: lambdaDetails.apiId,
stageName: lambdaDetails.alias,
variables: {
facebookVerifyToken: token
}
});
})
.then(() => {
console.log(`\n\n${color.green}Facebook Messenger setup${color.reset}\n`);
console.log(`\nFollowing info is required for the setup, for more info check the documentation.\n`);
console.log(`\nYour webhook URL is: ${color.cyan}${lambdaDetails.apiUrl}/facebook${color.reset}\n`);
console.log(`Your verify token is: ${color.cyan}${token}${color.reset}\n`);
return prompt([
'Facebook page access token',
'Facebook App Secret',
'Facebook page ID',
'Subscribed fields (comma separated)'
]);
})
.then(results => {
console.log('\n');
pageAccessToken = results['Facebook page access token'];
pageId = results['Facebook page ID'];
subscribedFields = results['Subscribed fields (comma separated)'].split(',').map(field => `'${field.trim()}'`).join(',');
const deployment = {
restApiId: lambdaDetails.apiId,
stageName: lambdaDetails.alias,
variables: {
facebookAccessToken: pageAccessToken,
facebookAppSecret: results['Facebook App Secret']
}
};
if (!data.variables || (!data.variables.facebookAppSecret && !results['Facebook App Secret']))
console.log(`\n${color.yellow}Deprecation warning:${color.reset} your bot is not using facebook validation. Please re-run with --configure-fb-bot to set it. This will become mandatory in the next major version. See https://github.com/claudiajs/claudia-bot-builder/blob/master/docs/API.md#message-verification for more information.\n`);
return utils.apiGatewayPromise.createDeploymentPromise(deployment);
})
.then(() => rp.post(`https://graph.facebook.com/v4.0/${pageId}/subscribed_apps?access_token=${pageAccessToken}&subscribed_fields=[${subscribedFields}]`));
}
});
})
.then(() => `${lambdaDetails.apiUrl}/facebook`);
});
};