Receive File, Video, Audio
สำหรับ Facebook แล้วไม่ว่าจะเป็นไฟล์ธรรมดา ไฟล์วิดีโอ หรือไฟล์เสียง Facebook จะมองว่าเป็นไฟล์ทั้งหมด รูปแบบของ message ที่ส่งให้บอทของเราก็เป็นรูปแบบเดียวกันทั้ง 3 อย่าง เพราะฉะนั้นในบทนี้ทำความเข้าใจครั้งเดียวใช้ได้ถึง 3 อย่าง
เป้าประสงค์ของบทนี้คือต้องการให้ท่านเห็นลักษณะของ message ที่ Facebook ส่งมาให้บอท เพื่อที่ท่านจะได้มีไอเดียว่าจะทำอะไรกับมันได้บ้าง ลักษณะ message เมื่อมีคนส่ง File มาให้บอทจะเป็นดังนี้
{
"object": "page",
"entry": [
{
"id": "127997317916506",
"time": 1510126199569,
"messaging": [
{
"sender": {
"id": "1519659551459981"
},
"recipient": {
"id": "127997317916506"
},
"timestamp": 1510126199487,
"message": {
"mid": "mid.$cAAB0afwBne9ly85qv1fmoitLzktH",
"seq": 156769,
"attachments": [
{
"type": "file",
"payload": {
"url": "https:\/\/cdn.fbsbx.com\/v\/t59.2708-21\/20272542_1717216624975128_1119134611796918272_n.pdf\/Pure-React.pdf?oh=aac760d8fda005fb1d9793396241a3ee&oe=5A055991"
}
}
]
}
}
]
}
]
}
ข้อสังเกตุ
- entry เป็นอะเรย์
- messaging เป็นอะเรย์
- message จะมีโหนด attachments ซึ่งเป็นอะเรย์
- attachments เป็นอะเรย์
ทดลองเขียนโค้ด
<?php
$access_token = 'EAAFUz3HsNTEBAFZAeDiZA8ywOtEUZB52ZBLYziFtXjZCZAUZBmqlUtuemBnbbkN3M25NBKutMZCDzngjD0Uxz530fFmIiJHnFDHZBen9KRGvWZBjnti5awKG6a1g4XfaO8ZCKVfG2Cer5nu3W0uvubzk4wYfpsZCc9QfLGe2tiVZA5JGY6QZDZD';
/* validate verify token needed for setting up web hook */
if (isset($_GET['hub_verify_token'])) {
if ($_GET['hub_verify_token'] === $access_token) {
echo $_GET['hub_challenge'];
return;
} else {
echo 'Invalid Verify Token';
return;
}
}
/* receive and send messages */
$input = json_decode(file_get_contents('php://input'), true);
if (isset($input['entry'][0]['messaging'][0]['sender']['id'])) {
$sender = $input['entry'][0]['messaging'][0]['sender']['id']; //sender facebook id
$file_url = $input['entry'][0]['messaging'][0]['message']['attachments'][0]['payload']['url'];
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token='. $access_token;
/*initialize curl*/
$ch = curl_init($url);
/*prepare response*/
$jsonData = '{
"recipient":{
"id":"' . $sender . '"
},
"message":{
"text": "Your file URL is '. $file_url .'"
}
}';
/* curl setting to send a json post data */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$result = curl_exec($ch); // user will get the message
}
อธิบายโค้ด
โค้ดนี้ไว้ใช้สำหรับให้ทาง Facebook ตรวจสอบเรื่อง callback URL ที่ผมเขียนไว้ในบท Facebook เรายังเก็บไว้ในหัวไฟล์โค้ดเราเสมอ
/* validate verify token needed for setting up web hook */
if (isset($_GET['hub_verify_token'])) {
if ($_GET['hub_verify_token'] === $access_token) {
echo $_GET['hub_challenge'];
return;
} else {
echo 'Invalid Verify Token';
return;
}
}
แปลง JSON ที่ Facebook ส่งมาให้ไปเป็นอะเรย์ เพื่อง่ายต่อการเขียนโค้ด
/* receive and send messages */
$input = json_decode(file_get_contents('php://input'), true);
ตรวจสอบว่า message ที่ส่งมานั้นมี id ของผู้ส่งหรือเปล่า อันนี้เป็นการตรวจสอบคร่าวๆว่ามีคนคุยกับบอท ไม่ใช่เรียก URL เว็บขึ้นมาตรงๆ ผมเขียนตรวจสอบไว้เพียงเล็กน้อยเท่านั้น เพื่อไม่ให้โค้ดมันดูยุ่งยากเกินไป เมื่อถึงตอนท่านเขียนโค้ดเพื่อใช้งานจริงๆ ก็อาจจะตรวจสอบให้รัดกุมขึ้นอีกหน่อย
if (isset($input['entry'][0]['messaging'][0]['sender']['id']))
เก็บ URL ของไฟล์ซึ่งเก็บอยู่ที่เซิฟเวอร์ของ Facebook ไว้ในตัวแปร เดี๋ยวจะเอามันไปประกอบเป็นข้อความส่งกลับไปหายูสเซอร์
$file_url = $input['entry'][0]['messaging'][0]['message']['attachments'][0]['payload']['url'];
URL นี้เป็น enpoint api ของ Facebook ที่เราสามารถ POST ข้อความไปให้ Facebook เพื่อให้ Facebook ส่งข้อความต่อไปให้บุคคลที่ระบุ
$url = 'https://graph.facebook.com/v2.6/me/messages?access_token='. $access_token;
เราจะใช้ cURL ยิง POST ไปหา Facebook
/*initialize curl*/
$ch = curl_init($url);
message ที่เราจะยิงไปให้ Facebook จะต้องอยู่ในรูปแบบของ JSON ระบุ id ของผู้รับและข้อความที่เราต้องการส่งไปให้
/*prepare response*/
$jsonData = '{
"recipient":{
"id":"' . $sender . '"
},
"message":{
"text": "Your file URL is '. $file_url .'"
}
}';
สั่ง cURL ยิง JSON ไปยัง endpoint api ของ Facebook ก็เป็นอันเรียบร้อยว่าบอทได้ตอบกลับไปหายูสเซอร์ที่ทักมา
/* curl setting to send a json post data */
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$result = curl_exec($ch); // user will get the message
หลังจาก commit changes โค้ดแล้วให้เข้าไปหน้า Facebook เพจที่เราเตรียมไว้ทำบอท แล้วลองส่งเมสเสจทักบอทไปดู ซึ่งบอทจะต้องตอบกลับมาว่า Your file URL is ตามด้วย URL ของไฟล์ที่คุณทักไป