Facebook小游戏Messenger 平台智能助手


Facebook小游戏Messenger 平台智能助手

  1. 创建主页
  • 首先需要创建 Facebook 主页

进入下面入口创建:

https://www.facebook.com/pages/creation/

1
2
3
主页类别需要是应用主页
主页名称需要包含应用名称。
主页不能与其他应用关联。

主页 > 设置 > Messager 开放平台 > 通用设置 > 已订阅应用 > 身份 > 选择“Primary Receiver”

  • 设置小游戏

小游戏 > 详情 > 应用主页板块 > 选择创建的主页(注意:如果小游戏未与上述类型的主页正确关联,智能助手将不会收到 messaging_game_plays 事件)

  1. 设置 Webhook
  • 服务器要求:
1
2
3
HTTPS 支持
有效的 SSL 证书(阿里云可以免费申请1年的)
可接收 GET 和 POST 请求的开放端口

==注意:这里申请SSL证书绑定的域名必须是一级域名(xx.xx.com),二级域名(xx.xx.xx.com)nginx配置会有问题!==

  • 新建 Node.js 项目

package.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"name": "messenger-bots",
"version": "1.0.0",
"description": "An webhook for Facebook Messenger.",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"body-parser": "^1.15.0",
"express": "^4.13.4",
"request": "^2.72.0"
},
"engines": {
"node": "~4.1.2"
}
}

app.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

'use strict';

// Imports dependencies and set up http server
const
request = require('request'),
express = require('express'),
body_parser = require('body-parser'),
app = express().use(body_parser.json()); // creates express http server

/** UPDATE YOUR VERIFY TOKEN **/
const VERIFY_TOKEN = 'xxxxxx'; // 这是 在“验证口令”字段中,输入 Webhook 的验证口令

const PAGE_ACCESS_TOKEN = 'xxxxx'; // 这是 “主页访问口令”字段显示的访问口令

// Sets server port and logs message on success
app.listen(process.env.PORT || 1337, () => console.log('webhook is listening'));

// Accepts POST requests at /webhook endpoint
app.post('/webhook', (req, res) => {

// Parse the request body from the POST
let body = req.body;

// Check the webhook event is from a Page subscription
if (body.object === 'page') {

// Iterate over each entry - there may be multiple if batched
body.entry.forEach(function(entry) {

// Get the webhook event. entry.messaging is an array, but
// will only ever contain one event, so we get index 0
let webhook_event = entry.messaging[0];
console.log(webhook_event);

// Get the sender PSID 获得发送者的 PSID
let sender_psid = webhook_event.sender.id;
console.log('Sender PSID: ' + sender_psid);

// 解析 Webhook 事件类型
// Check if the event is a message or postback and
// pass the event to the appropriate handler function
if (webhook_event.message) {
handleMessage(sender_psid, webhook_event.message);
} else if (webhook_event.game_play) {
var senderId = webhook_event.sender.id; // Messenger sender id
var playerId = webhook_event.game_play.player_id; // Instant Games player id
var contextId = webhook_event.game_play.context_id;
handleMessage(senderId, 'hello!' + playerId);
}

});

// Return a '200 OK' response to all events
res.status(200).send('EVENT_RECEIVED');

} else {
// Return a '404 Not Found' if event is not from a page subscription
res.sendStatus(404);
}

});

// Accepts GET requests at the /webhook endpoint
app.get('/webhook', (req, res) => {

// Parse params from the webhook verification request
let mode = req.query['hub.mode'];
let token = req.query['hub.verify_token'];
let challenge = req.query['hub.challenge'];

// Check if a token and mode were sent
if (mode && token) {

// Check the mode and token sent are correct
if (mode === 'subscribe' && token === VERIFY_TOKEN) {

// Respond with 200 OK and 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);
}
}
});


// Handles messages events
function handleMessage(sender_psid, received_message) {
let response;

// Check if the message contains text
if (received_message.text) {

// Create the payload for a basic text message
response = {
"text": `You sent the message: "${received_message.text}". Now send me an image!`
}
}else{
response = {
"text": `You sent the message: "${received_message}". Now send me an image!`
}
}

// Sends the response message
callSendAPI(sender_psid, response);
}

// Sends response messages via the Send API
// 通过发送 API 发送消息
function callSendAPI(sender_psid, response) {
// Construct the message body
let request_body = {
"recipient": {
"id": sender_psid
},
"message": response
}
console.log('request_body :' + JSON.stringify(request_body))
// Send the HTTP request to the Messenger Platform
request({
"uri": "https://graph.facebook.com/v2.6/me/messages",
"qs": { "access_token": PAGE_ACCESS_TOKEN },
"method": "POST",
"json": request_body
}, (err, res, body) => {
if (!err) {
console.log('message sent!')
} else {
console.error("Unable to send message:" + err);
}
});
}

上面实现了一个简单的玩家发消息到主页,则回复玩家消息;玩家玩游戏了,则回复玩家消息。

  • 为了能接收通过 HTTPS 发送的请求,您必须将 webhook 部署到拥有有效 SSL 证书的服务器中。

nginx转http为https

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
server {
listen 443 ssl;
server_name xxx.game.com;
ssl_certificate /data/ssl/214972844030649.pem;
ssl_certificate_key /data/ssl/214972844030649.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
#禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
server_tokens off;
#如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉你的浏览器本网站全站加密,并且强制用 HTTPS 访问
fastcgi_param HTTPS on;
fastcgi_param HTTP_SCHEME https;
access_log /data/log/httpsaccess.log;

location / {
proxy_pass http://localhost:1337;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect http:// $scheme://; #做https跳转
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
  1. 激活智能助手
  • 在 Facebook 小游戏应用中添加 Messenger 平台
1
2
3
- 在应用设置侧边栏的“产品”下,点击“+ 添加产品”。
- 将鼠标悬停在“Messenger”上,显示相关选项。
- 点击“设置”按钮。
  • 为应用配置 Webhook
1
2
3
4
5
- 在 Messenger 设置控制台的“Webhooks”版块中,点击“设置 Webhooks”按钮。
- 在“回调网址”字段中,输入 Webhook 的公开网址。
- 在“验证口令”字段中,输入 Webhook 的验证口令。
- 在“订阅字段”下,选择想要送达 Webhook 的 Webhook 事件。我们建议在开始时至少选择 messages 和 messaging_postbacks。
- 点击“验证并保存”按钮。

Messenger 平台会向 Webhook 发送包含所提供验证口令的 GET 请求。如果 Webhook 有效并正确设置为响应验证请求,Webhook 设置会被保存。

  • 让应用订阅 Facebook 主页
1
2
3
4
- 在 Messenger 设置控制台的“生成口令”版块,点击“选择主页”下拉菜单,然后选择想要让应用订阅的 Facebook 主页。用户与该主页展开 Messenger 聊天时,Webhook 会收到该主页的事件。
- 复制“主页访问口令”字段显示的访问口令。您稍后需要使用此访问口令发送 API 请求。
- 在 Messenger 设置控制台的“Webhook”版块,点击“选择主页”下拉菜单,然后选择您之前生成访问口令的 Facebook 主页。这样,您的应用便会订阅并接收该主页的 Webhook 事件。
- 点击下拉菜单旁边的“订阅”按钮。
  • 测试应用订阅

要测试是否成功设置了应用,可从 facebook.com 或在 Messenger 中发送消息到主页。如果 Webhook 收到 Webhook 事件,则表示已设置好应用!