Install the fb-messenger-app
package in your node server app's local node_modules
folder.
npm install --Save fb-messenger-app
I take for granted that you've already setup your Messenger Platform app:
- Created a Facebook App and Page
- Setup the Webhook
- Got a Page Access Token
- Subscribed the App to the Page
After installing the fb-messenger-app package with npm as shown above, import it in your app
const MessengerApp = require('fb-messenger-app')
Then create a new messenger instance passing your Facebook App page access token (this token will include all messenger permissions)
var messenger = new MessengerApp(MY_PAGE_ACCESS_TOKEN)
You'll have to listen for POST calls at your webhook. Callbacks will be made to this webhook. For this purpose, _handleCallback
will listen and dispatch each callback type by emitting its corresponding event.
app.post('/webhook', function (req, res) {
var data = req.body
messenger._handleCallback(res, data)
})
All messages must be send through the sendApiMessage
method. It'll make POST calls to facebook's Graph API with your app's page access token, and a JSON payload with the 'recipient's id' and the message object to be send. For more information about the payload supported by facebook go ahead an read more here.
messenger.sendApiMessage(USER_ID, {text: 'Howdy!'})
var myImage = {
attachment:
{
type: 'image',
payload: {
url: 'https://petersapparel.com/img/shirt.png'
}
}
}
messenger.sendApiMessage(USER_ID, myImage)
A successful send API request returns a JSON with the identifier of the user and the message.
{
"recipient_id": "1008372609250235",
"message_id": "mid.1456970487936:c34767dfe57ee6e339"
}
On the other hand, a when the send API request fails, a JSON is returned with the corresponding error code and message. Messenger Platform errors are grouped by code, with a different message depending on the error condition. Read more here
{
"error": {
"message": "Invalid OAuth access token.",
"type": "OAuthException",
"code": 190,
"fbtrace_id": "BLBz/WZt8dN"
}
}
Finally, an example would be the following.
messenger.sendApiMessage(USER_ID, myBrandProducts, function (err, body) {
if (err) return console.log('Something went wrong: could not send my brand products')
console.log('Generic message with my brand products where send to %d', USER_ID)
})
Optionally, depending on the case, sometimes you'll want to bring the user attention with a normal push. Other times, a silent notification would be enough, and, why not, it would be appropiate not to bother the user at all. We can achieve this by adding the notificationType parameter.
If missing, a regular push notification will be sent.
- REGULAR : will emit a sound/vibration and a phone notification
- SILENT_PUSH : will just emit a phone notification
- NO_PUSH : will not emit either
messenger.sendTextMessage(USER_ID, 'Hey! Check this out!', 'REGULAR')
messenger.sendTextMessage(USER_ID, "Check this out, there's no hurry...", 'SILENT_PUSH')
messenger.sendTextMessage(USER_ID, 'If you see this message, check this out', 'NO_PUSH')
Set the bot's default notification type when instantiating it.
var messenger = new MessengerApp(MY_PAGE_ACCESS_TOKEN, 'SILENT_PUSH')
Set typing indicators or send read receipts.
- mark_seen : Mark last message as read
- typing_on : Turn typing indicators on
- typing_off : Turn typing indicators off
messenger.senderAction.sendSenderActionRequest(USER_ID, 'typing_on')
You can send specific actions during given time intervals.
messenger.senderAction.sendTypingInterval(USER_ID, 2000)
messenger.senderAction.sendMarkSeenInterval(USER_ID, 1000)
There are two moments where you'll want to verify that things are fine.
app.post('/webhook', function (req, res) {
messenger.verify.webhook(req, res)
})
const app = express()
app.use(bodyParser.json({
verify: messenger.verify.signature.bind(undefined, APP_SECRET)
}))
var messenger = new MessengerApp(token [, options])
The following table describes the properties of the options
object.
Property | Description | Type | Default |
---|---|---|---|
notificationType | Determines how messages will be pushed to the user | String | 'REGULAR' |
apiUrl | Facebook's Graph API | String | 'https//graph.facebook.com/v2.6/' |
messenger.sendApiMessage(recipient, message [, notificationType] [, cb])
messenger.sendSenderAction(recipient, senderAction [, cb])
messenger.getUserProfile(userId [, cb])
messenger.subscribeApp([cb])
messenger.getUserPsid(tokeb [, cb])
messenger.unlinkAccount(psid [, cb])
messenger.threadSetting.setGreetingText(text [, cb])
messenger.threadSetting.setGetStartedButton(payload [, cb])
messenger.threadSetting.setPersistentMenu(menuItems [, cb])
messenger.threadSetting.deleteGetStartedButton([cb])
messenger.threadSetting.deletePersistentMenu([cb])
messenger.threadSetting.sendSettingRequest(method, params [, cb])
messenger.senderAction.sendSenderActionRequest(recipient, senderAction [, cb])
messenger.senderAction.sendTypingInterval(recipient, time [, cb])
messenger.senderAction.sendMarkSeenInterval(recipient, time [, cb])
messenger._handleCallback(res, data)
messenger._handleEvent(type, event)
messenger.verify.webhook(verifyToken, req, res)
messenger.verify.signature(appSecret, req, res, buf)