一篇很基礎入門的Messenger開發文檔,開發語言基於node.js,初學者建議你認真閱讀這篇文章,一篇文章學會Messenger開發 node
Messenger是Facebook的聊天軟件,相似於微信,基於Messenger的開發就至關於公衆號的開發,瞭解更多,請點擊 官方文檔web
mkdir messenger-webhook // Creates a project directory
cd messenger-webhook // Navigates to the new directory
touch index.js // Creates empty index.js file.
npm init // Creates package.json. Accept default for all questions.
npm install express body-parser --save // Installs the express.js http server framework module,
// and then adds them to the dependencies section of package.json file
複製代碼
比較簡單,新建完,項目目錄以下:express
index.js
node_modules
package.json
複製代碼
'use strict';
// Imports dependencies and set up http server
const
express = require('express'),
bodyParser = require('body-parser'),
app = express().use(bodyParser.json()); // creates express http server
require('dotenv').config();
// Sets server port and logs message on success
app.listen(process.env.PORT, () => console.log('webhook is listening'));
複製代碼
此代碼用於監聽服務器請求,本次項目開發,用的node.js的express框架,其中require('dotenv').config() 做用是加載環境變量.envnpm
app.post('/webhook', (req, res) => {
let body = req.body;
// Checks this is an event from a page subscription
if (body.object === 'page') {
// Iterates over each entry - there may be multiple if batched
body.entry.forEach(function(entry) {
entry.messaging.forEach(messagingEvent => {
if (messagingEvent.message) {
//message爲用戶向平臺發送消息事件
} else if (messagingEvent.postback) {
//postback爲用戶點擊開始按鈕,點擊固定菜單等回調事件
} else if (messagingEvent.referral) {
//m.me連接,廣告,印章等
} else {
console.log("Webhook received unknown messagingEvent: ", messagingEvent);
}
})
});
// Returns a '200 OK' response to all requests
res.status(200).send('EVENT_RECEIVED');
} else {
// Returns a '404 Not Found' if event is not from a page subscription
res.sendStatus(404);
}
});
複製代碼
此代碼將建立一個 /webhook 端點,用於接收 POST 請求,驗證請求是否爲 webhook 事件,而後解析消息。Messenger 平臺會經過該端點發送全部 webhook 事件。 用戶在messenger發消息,監聽到的body.object是'page',entry爲包含事件數據的陣列,我這裏開發了entry.messaging的三種用戶基本事件json
// Adds support for GET requests to our webhook
app.get('/webhook', (req, res) => {
// Your verify token. Should be a random string.
let VERIFY_TOKEN = PAGE_ACCESS_TOKEN;
// Parse the query params
let mode = req.query['hub.mode'];
let token = req.query['hub.verify_token'];
let challenge = req.query['hub.challenge'];
// Checks if a token and mode is in the query string of the request
if (mode && token) {
// Checks the mode and token sent is correct
if (mode === 'subscribe' && token === VERIFY_TOKEN) {
// Responds with the challenge token from the request
console.log('WEBHOOK_VERIFIED');
res.status(200).send(challenge);
} else {
// Responds with '403 Forbidden' if verify tokens do not match
res.sendStatus(403);
}
}
});
複製代碼
node index.js
複製代碼
curl -X GET "localhost:1337/webhook?hub.verify_token=<YOUR_VERIFY_TOKEN>&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"
複製代碼
curl -H "Content-Type: application/json" -X POST "localhost:1337/webhook" -d '{"object": "page", "entry": [{"messaging": [{"message": "TEST_MESSAGE"}]}]}'
複製代碼
爲了能接收經過 HTTPS 發送的請求,必須將 webhook 部署到擁有有效 SSL 證書的服務器中數組
到如今,準備工做已經完成,可是尚未app接收webhook事件,最後一步,要將webhook訂閱到facebook應用,官方文檔很詳細,這裏再也不作教程,官方文檔入口bash
捕捉到用戶的事件,用於自動回覆預約義信息,消息模板的做用是結構化消息,呈現用戶更好更豐富的體驗。消息模板的使用是開發Messenger的基礎,也是Messenger開發中應用最多的。Messenger預約義支持如下模板:服務器
模板的標準格式以下,其中 message.attachment.payload 屬性包含針對各種具體模板的類型和內容詳情微信
{
"recipient":{
"id":"<PSID>" // 發消息用戶的psid
},
"message":{
"attachment":{
"type":"template",
"payload":{
"template_type":"<TEMPLATE_TYPE>",
...
}
}
}
}
複製代碼
常規模板是一種簡單的結構化消息,其中包含標題、副標題、圖片和最多三個按鈕:您還能夠指定 default_action 對象(可選),設置用戶輕觸模板後將在 Messenger 網頁視圖中打開的網址。重點介紹常規模板,其餘模板的內容大同小異,不一樣就在於,不同的模板設置的屬性不同。 app
"payload": {
"template_type":"generic",
"elements":[
{
"title":"<TITLE_TEXT>",//消息title
"image_url":"<IMAGE_URL_TO_DISPLAY>",//消息圖片
"subtitle":"<SUBTITLE_TEXT>",//消息內容
"default_action": {//默認點擊消息跳轉,type只能是web_url
"type": "web_url",
"url": "<DEFAULT_URL_TO_OPEN>",
"messenger_extensions": <TRUE | FALSE>,
"webview_height_ratio": "<COMPACT | TALL | FULL>"
},
"buttons":[<BUTTON_OBJECT>, ...] //按鈕
},
...
]
}
複製代碼
發送模板輪播
"payload": {
"template_type":"generic",
"elements":[
<GENERIC_TEMPLATE>,
<GENERIC_TEMPLATE>,
...
]
}
複製代碼
即發送模板輪播,要在 payload 的 elements 數組中添加最多 10 個常規模板,注意最多10個常規模板 。
curl -X POST -H "Content-Type: application/json" -d '{ "recipient":{ "id":"<PSID>" }, "message":{ "attachment":{ "type":"template", "payload":{ "template_type":"generic", "elements":[ { "title":"Welcome!", "image_url":"https://petersfancybrownhats.com/company_image.png", "subtitle":"We have the right hat for everyone.", "default_action": { "type": "web_url", "url": "https://petersfancybrownhats.com/view?item=103", "messenger_extensions": false, "webview_height_ratio": "tall", "fallback_url": "https://petersfancybrownhats.com/" }, "buttons":[ { "type":"web_url", "url":"https://petersfancybrownhats.com", "title":"View Website" },{ "type":"postback", "title":"Start Chatting", "payload":"DEVELOPER_DEFINED_PAYLOAD" } ] } ] } } } }' "https://graph.facebook.com/v2.6/me/messages?access_token=<PAGE_ACCESS_TOKEN>"
複製代碼
{
"recipient_id": "1254477777772919",
"message_id": "m_AG5Hz2Uq7tuwNEhXfYYKj8mJEM_QPpz5jdCK48PnKAjSdjfipqxqMvK8ma6AC8fplwlqLP_5cgXIbu7I3rBN0P"
}
複製代碼
在此介紹一下按鈕的模板
網址按鈕
{ "type": "web_url", "url": "<URL_TO_OPEN_IN_WEBVIEW>", "title": "<BUTTON_TEXT>", } 複製代碼
回傳按鈕
{ "type": "postback", "title": "<BUTTON_TEXT>", "payload": "<STRING_SENT_TO_WEBHOOK>" } 複製代碼
分享按鈕
{ "type": "element_share", "share_contents": { "attachment": { "type": "template", "payload": {//對於使用 element_share 功能的分享按鈕,僅支持包含一個網址按鈕的常規模板,即分享的內容中,button的type只能是web_url <GENERIC_TEMPLATE_OBJECT> } } } } 複製代碼
購買按鈕(僅向美國用戶開放)
{ "type":"payment", "title":"<BUTTON_TEXT>", "payload":"<STRING_SENT_TO_WEBHOOK>", "payment_summary":{ "currency":"<CURRENCY_ABBREVIATION>", "payment_type":"<FIXED_AMOUNT | FLEXIBLE_AMOUNT>", "is_test_payment" : <TRUE | FALSE >, "merchant_name":"<YOUR_BUSINESS_NAME>", "requested_user_info":[ "shipping_address", "contact_name", "contact_phone", "contact_email" ], "price_list":[ { "label":"<ITEM_NAME>", "amount":"<ITEM_PRICE>" }, ... ] } } 複製代碼
呼叫按鈕
{ "type":"phone_number", "title":"<BUTTON_TEXT>", "payload":"<PHONE_NUMBER>" } 複製代碼
登錄按鈕
{ "type": "account_link", "url": "<YOUR_LOGIN_URL>" } 複製代碼
退出按鈕
{ "type": "account_unlink" } 複製代碼
玩遊戲按鈕
{ "type":"game_play", "title":"Play", "payload":"{<SERIALIZED_JSON_PAYLOAD>}", "game_metadata": { // Only one of the below "player_id": "<PLAYER_ID>", "context_id": "<CONTEXT_ID>" } } 複製代碼
列表模板是 2-4 個結構化項目組成的列表,可在底部選擇性地顯示全局按鈕。每一個項目可包含一個縮略圖、標題、副標題和一個按鈕。一樣也能夠指定 default_action 對象,設置用戶輕觸項目後將在 Messenger 網頁視圖中打開的網址。
"payload": {
"template_type": "list",
"top_element_style": "<LARGE | COMPACT>",
"elements": [
{
"title": "<TITLE_TEXT>",
"subtitle": "<SUBTITLE_TEXT>",
"image_url": "<IMAGE_URL_FOR_THUMBNAIL>",
"buttons": [<BUTTON_OBJECT>],
"default_action": {
"type": "web_url",
"url": "<URL_TO_OPEN_WHEN_ITEM_IS_TAPPED>",
"messenger_extensions": <TRUE | FALSE>,
"webview_height_ratio": "<COMPACT | TALL | FULL>"
}
},
...
],
"buttons": [<BUTTON_OBJECT>]
}
複製代碼
這裏指的注意的是默認狀況下,列表中的第一個項目將做爲包含疊加文本的封面圖片顯示。能夠經過設置 "top_element_style": "compact",將第一個項目顯示爲標準的列表項目。
請求示例大同小異,見常規模板
回傳示例也同樣,見常規模板
按鈕模板可發送最多能包含三個按鈕的文本消息。這種模板適用於爲消息接收人提供可選擇的選項,如預約義的問題回覆或能夠採起的操做。
"payload": {
"template_type":"button",
"text":"<MESSAGE_TEXT>",
"buttons":[
<BUTTON_OBJECT>,
<BUTTON_OBJECT>,
...
]
}
複製代碼
按鈕模板比較簡單
由於請求示例和回傳示例都類似,下文將再也不作介紹,能夠直接參考官方文檔
開放圖譜模板能夠發送結構化消息,並在其中添加開放圖譜網址和可選按鈕。目前,這種模板僅支持分享歌曲。歌曲會以聊天氣泡的方式顯示,消息接收人能夠在這個氣泡中看到專輯封面和歌曲預覽。
"payload": {
"template_type":"open_graph",
"elements":[
{
"url":"<OPEN_GRAPH_URL>",
"buttons":[<BUTTON_OBJECT>]
}
]
}
複製代碼
媒體模板,回執模板,航班信息模板開發中用的比較少,再次就再也不贅述,想要深刻了解請參考官方文檔
未完待續