การบันทึกไฟล์รูปภาพ เสียง และวิดีโอ จากผู้ใช้ ใน LINE Messaging API ตอนที่ 4

เขียนเมื่อ 6 ปีก่อน โดย Ninenik Narkdee
line bot sdk php line line messaging api line bot

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ line bot sdk php line line messaging api line bot

ดูแล้ว 18,304 ครั้ง


สำหรับเนื้อหาในตอนต่อไปนี้ จะเป็นแนวทางการใช้งาน LINE bot sdk php ในการจัดการกับ
ไฟล์รูปภาพ เสียง และไฟล์วิดีโอ ที่ผู้ใช้ส่งมา โดยเราจะทำการบันทึกไฟล์ต่างๆ เหล่านี้ไว้ที่ฝั่ง 
server ของเรา เราจะประยุกต์จากเนื้อหาโค้ดตอนที่แล้ว
    การใช้งาน Template Message ใน LINE Messaging API ตอนที่ 3 http://niik.in/836 
 
โดยเราจะตัดส่วนของโค้ดทดสอบ template message ออกก่อน คงเหลือไว้เฉพาะในส่วนของ
การกำหนดเงื่อนไข switch 
    ก่อนลงรายละเอียดเกี่ยวกับการบันทึกรูปภาพ เสียง และวิดีโอ จากผู้ใช้ ใน LINE ขอเพิ่มเนื้อหา
เกี่ยวกับการใช้คำสั่ง เพื่อเรียกดูข้อมูลของผู้ใช้ LINE หรือก็คือดูโพรไฟล์ ซึ่งค่าที่ได้กลับมาก็จะไม่ได้
มีอะไรมาก จะไอดีผู้ใช้ LINE ชื่อที่แสดง url รูปโพรไฟล์ และก็ข้อความสถานะ ที่ผู้ใช้ตั้ง

การเรียกดูโพรไฟล์ผู้ใช้ LINE

    เราจะเพิ่มเงื่อนไขสำหรับทดสอบ โดยเมื่อถ้าผู้ใช้พิมพ์ตัว "P" ก็จะให้ bot ไปดึงข้อมูลของผู้ใช้ โดย
อาศัย userId ของ ผู้ใช้ และถ้าผู้ใช้พิมพ์คำว่า "สวัสดี" เราก็จะให้ bot ทักทายกลับไปว่า "สวัสดีครับ คุณ xxxx"
โดยแทน xxx เป็นชื่อที่แสดงของผู้ใช้ LINE
 
ไฟล์ bot.php 
 
<?php
// กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// include composer autoload
require_once '../vendor/autoload.php';

// การตั้งเกี่ยวกับ bot
require_once 'bot_settings.php';

// กรณีมีการเชื่อมต่อกับฐานข้อมูล
//require_once("dbconnect.php");

///////////// ส่วนของการเรียกใช้งาน class ผ่าน namespace
use LINE\LINEBot;
use LINE\LINEBot\HTTPClient;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
//use LINE\LINEBot\Event;
//use LINE\LINEBot\Event\BaseEvent;
//use LINE\LINEBot\Event\MessageEvent;
use LINE\LINEBot\MessageBuilder;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;
use LINE\LINEBot\MessageBuilder\StickerMessageBuilder;
use LINE\LINEBot\MessageBuilder\ImageMessageBuilder;
use LINE\LINEBot\MessageBuilder\LocationMessageBuilder;
use LINE\LINEBot\MessageBuilder\AudioMessageBuilder;
use LINE\LINEBot\MessageBuilder\VideoMessageBuilder;
use LINE\LINEBot\ImagemapActionBuilder;
use LINE\LINEBot\ImagemapActionBuilder\AreaBuilder;
use LINE\LINEBot\ImagemapActionBuilder\ImagemapMessageActionBuilder ;
use LINE\LINEBot\ImagemapActionBuilder\ImagemapUriActionBuilder;
use LINE\LINEBot\MessageBuilder\Imagemap\BaseSizeBuilder;
use LINE\LINEBot\MessageBuilder\ImagemapMessageBuilder;
use LINE\LINEBot\MessageBuilder\MultiMessageBuilder;
use LINE\LINEBot\TemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\DatetimePickerTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\UriTemplateActionBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ButtonTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselColumnTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ConfirmTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ImageCarouselTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ImageCarouselColumnTemplateBuilder;


$httpClient = new CurlHTTPClient(LINE_MESSAGE_ACCESS_TOKEN);
$bot = new LINEBot($httpClient, array('channelSecret' => LINE_MESSAGE_CHANNEL_SECRET));

// คำสั่งรอรับการส่งค่ามาของ LINE Messaging API
$content = file_get_contents('php://input');

// แปลงข้อความรูปแบบ JSON  ให้อยู่ในโครงสร้างตัวแปร array
$events = json_decode($content, true);
if(!is_null($events)){
	// ถ้ามีค่า สร้างตัวแปรเก็บ replyToken ไว้ใช้งาน
	$replyToken = $events['events'][0]['replyToken'];
	$userID = $events['events'][0]['source']['userId'];
	$sourceType = $events['events'][0]['source']['type'];
	$is_postback = NULL;
	$is_message = NULL;
	if(isset($events['events'][0]) && array_key_exists('message',$events['events'][0])){
		$is_message = true;
		$typeMessage = $events['events'][0]['message']['type'];
		$userMessage = $events['events'][0]['message']['text'];		
		$idMessage = $events['events'][0]['message']['id'];	
	}
	if(isset($events['events'][0]) && array_key_exists('postback',$events['events'][0])){
		$is_postback = true;
		$dataPostback = NULL;
		parse_str($events['events'][0]['postback']['data'],$dataPostback);;
		$paramPostback = NULL;
		if(array_key_exists('params',$events['events'][0]['postback'])){
			if(array_key_exists('date',$events['events'][0]['postback']['params'])){
				$paramPostback = $events['events'][0]['postback']['params']['date'];
			}
			if(array_key_exists('time',$events['events'][0]['postback']['params'])){
				$paramPostback = $events['events'][0]['postback']['params']['time'];
			}
			if(array_key_exists('datetime',$events['events'][0]['postback']['params'])){
				$paramPostback = $events['events'][0]['postback']['params']['datetime'];
			}						
		}
	}	
	if(!is_null($is_postback)){
		$textReplyMessage = "ข้อความจาก Postback Event Data = ";
		if(is_array($dataPostback)){
			$textReplyMessage.= json_encode($dataPostback);
		}
		if(!is_null($paramPostback)){
			$textReplyMessage.= " \r\nParams = ".$paramPostback;
		}
		$replyData = new TextMessageBuilder($textReplyMessage);		
	}
	if(!is_null($is_message)){
		switch ($typeMessage){
			case 'text':
				$userMessage = strtolower($userMessage); // แปลงเป็นตัวเล็ก สำหรับทดสอบ
				switch ($userMessage) {
					case "p":
						// เรียกดูข้อมูลโพรไฟล์ของ Line user โดยส่งค่า userID ของผู้ใช้ LINE ไปดึงข้อมูล
						$response = $bot->getProfile($userID);
						if ($response->isSucceeded()) {
							// ดึงค่ามาแบบเป็น JSON String โดยใช้คำสั่ง getRawBody() กรณีเป้นข้อความ text
							$textReplyMessage = $response->getRawBody(); // return string			
							$replyData = new TextMessageBuilder($textReplyMessage);			
							break;				
						}
						// กรณีไม่สามารถดึงข้อมูลได้ ให้แสดงสถานะ และข้อมูลแจ้ง ถ้าไม่ต้องการแจ้งก็ปิดส่วนนี้ไปก็ได้
						$failMessage = json_encode($response->getHTTPStatus() . ' ' . $response->getRawBody());
						$replyData = new TextMessageBuilder($failMessage);
						break;				
					case "สวัสดี":
						// เรียกดูข้อมูลโพรไฟล์ของ Line user โดยส่งค่า userID ของผู้ใช้ LINE ไปดึงข้อมูล
						$response = $bot->getProfile($userID);
						if ($response->isSucceeded()) {
							// ดึงค่าโดยแปลจาก JSON String .ให้อยู่ใรูปแบบโครงสร้าง ตัวแปร array 
							$userData = $response->getJSONDecodedBody();	// return array		
							// $userData['userId']
							// $userData['displayName']
							// $userData['pictureUrl']
							// $userData['statusMessage']
							$textReplyMessage = 'สวัสดีครับ คุณ '.$userData['displayName'];				
							$replyData = new TextMessageBuilder($textReplyMessage);			
							break;				
						}
						// กรณีไม่สามารถดึงข้อมูลได้ ให้แสดงสถานะ และข้อมูลแจ้ง ถ้าไม่ต้องการแจ้งก็ปิดส่วนนี้ไปก็ได้
						$failMessage = json_encode($response->getHTTPStatus() . ' ' . $response->getRawBody());
						$replyData = new TextMessageBuilder($failMessage);
						break;																																																											
					default:
						$textReplyMessage = " คุณไม่ได้พิมพ์ ค่า ตามที่กำหนด";
						$replyData = new TextMessageBuilder($textReplyMessage);			
						break;										
				}
				break;										
			default:
				$textReplyMessage = json_encode($events);
				$replyData = new TextMessageBuilder($textReplyMessage);			
				break;	
		}
	}
}
$response = $bot->replyMessage($replyToken,$replyData);
if ($response->isSucceeded()) {
    echo 'Succeeded!';
    return;
}

// Failed
echo $response->getHTTPStatus() . ' ' . $response->getRawBody();
?>
 
ทดสอบผลลลัพธ์ ถ้าเราพิมพ์ p และถ้าเราพิมพ์ สวัสดี ผลที่ได้จะเป็นดังรูปด้านล่างตามลำดับ
 
 


 
 
โครงสร้างของข้อมูล กรณีพิมพ์ "p" จะได้ในรูปแบบดังนี้
 
{
	"userId": " ไอดีของผู้ใช้ LINE ",
	"displayName": "Ninenik",
	"pictureUrl": "http://dl.profile.line-cd5174e308deba5c12e",
	"statusMessage": "You can do anything in this world, but never forget where you come from."
}
 
จะเห็นว่า การเรียกดูข้อมูลของผู้ใช้ เราควรใช้คำสั่ง getJSONDecodedBody() เพื่อดึงข้อมูลเกี่ยวกับผู้ใช้มาในรูปแบบ array 
จาก response ที่ได้ จะสะดวกในการนำไปใช้งานต่อ 


 
 

การบันทึกรูปภาพ ไฟล์เสียง และวิดีโอจากผู้ใช้

    ต่อไป เรามาดูวิธีการที่จะทำให้เราสามารถที่จะบันทึกไฟล์ที่เป็นรูปภาพ เสียง และวิดีโอ ที่ถูกส่งมาจากผู้ใช้ มาบันทึกเป็นข้อมูล
ไว้ใน server หลักการทำงานคือ เมื่อผู้ใช้ส่งข้อมูลมายัง bot โดยเป็น รูปภาพ เสียง หรือวิดีโอ เราสามารถใช้คำสั่ง 
 
$bot->getMessageContent($idMessage)
 
เพื่อดูข้อมูลของเนื้อหาที่ผู้ใช้ส่งมา โดยอ้างอิงการเรียกดูข้อมูลจากการระบุ messageId ที่ได้รับจาก Event Object
ในโค้ดตัวอย่างด้านบน เราได้เก็บค่า messageId ไว้ในตัวแปร $idMessage 
    มาดูการเพิ่ม case เมื่อข้อมูลที่ผู้ใช้ส่งเป็น ไฟล์รุปภาพ เสียง หรือวิดีโอ ดังนี้
 
ไฟล์ bot.php บางส่วน
 
case (preg_match('/image|audio|video/',$typeMessage) ? true : false) :
    $response = $bot->getMessageContent($idMessage);
    if ($response->isSucceeded()) {
        // คำสั่ง getRawBody() ในกรณีนี้ จะได้ข้อมูลส่งกลับมาเป็น binary 
        // เราสามารถเอาข้อมูลไปบันทึกเป็นไฟล์ได้
        $dataBinary = $response->getRawBody(); // return binary
        // ทดสอบดูค่าของ header ด้วยคำสั่ง getHeaders()
        $dataHeader = $response->getHeaders();	
        $replyData = new TextMessageBuilder(json_encode($dataHeader));
        break;
    }
    $failMessage = json_encode($idMessage.' '.$response->getHTTPStatus() . ' ' . $response->getRawBody());
    $replyData = new TextMessageBuilder($failMessage);	
    break;	
 
ข้อมูลที่เป็นรูปภาพ เสียง หรือวิดีโอ จะเข้าเงื่อนไขนี้ โดยข้อมูลที่เราจะนำไปสร้างเป็นไฟล์ คือค่าที่ได้จากคำสั่ง
 
$response->getRawBody();
 
ในตัวอย่างข้อมูลที่ใช้ในการสร้างไฟล์จะอยู่ในตัวแปร $dataBinary สว่นตัวแปร $dataHeader จะเป็นการไปดึงค่า
ส่วนของ header ของไฟล์ที่ผู้ใช้ส่งมา ค่าส่วนนี้ เราสามารถใช้คำสั่ง getHeader($name) เพื่อดึงเฉพาะค่า header
ที่สนใจ แทนการดึงมาทั้งหมดก็ได้
 
ผลลัพธ์ที่ได้ กรณีผู้ใช้ส่งรูปภาพ เสียง หรือวิดีโอ จะได้เป็นดังนี้
 
 
    

 
 
 
 
มาดูโครงสร้างของค่า header จากไฟล์ที่ผู้ใช้ส่งมาหา bot
กรณีรูปภาพ
 
{
	"Server": "nginx",
	"Content-Type": "image/jpeg",
	"Content-Length": "84748",
	"X-Line-Request-Id": "a1f60f25-f716-419e-bfb7-7fc5fc5148d6",
	"X-Content-Type-Options": "nosniff",
	"X-XSS-Protection": "1; mode=block",
	"X-Frame-Options": "DENY",
	"Expires": "Fri, 17 Nov 2017 17:23:07 GMT",
	"Cache-Control": "max-age=0, no-cache, no-store",
	"Pragma": "no-cache",
	"Date": "Fri, 17 Nov 2017 17:23:07 GMT",
	"Connection": "keep-alive"
}
 
กรณีไฟล์เสียง
 
{
	"Server": "nginx",
	"Content-Type": "audio/aac",
	"Content-Length": "48804",
	"X-Line-Request-Id": "cee50bc8-2b91-4333-8179-95053a4aacf4",
	"X-Content-Type-Options": "nosniff",
	"X-XSS-Protection": "1; mode=block",
	"X-Frame-Options": "DENY",
	"Expires": "Fri, 17 Nov 2017 17:23:54 GMT",
	"Cache-Control": "max-age=0, no-cache, no-store",
	"Pragma": "no-cache",
	"Date": "Fri, 17 Nov 2017 17:23:54 GMT",
	"Connection": "keep-alive"
}
 
กรณีไฟล์วิดีโอ
 
{
	"Server": "nginx",
	"Content-Type": "video/mp4",
	"Content-Length": "728810",
	"X-Line-Request-Id": "f43ee0bd-2ca4-46ca-9d3d-ff1ef65aeb24",
	"X-Content-Type-Options": "nosniff",
	"X-XSS-Protection": "1; mode=block",
	"X-Frame-Options": "DENY",
	"Expires": "Fri, 17 Nov 2017 17:25:06 GMT",
	"Cache-Control": "max-age=0, no-cache, no-store",
	"Pragma": "no-cache",
	"Date": "Fri, 17 Nov 2017 17:25:06 GMT",
	"Connection": "keep-alive"
}
 
ส่วนของ header ของไฟล์ ที่เราจะนำมาเป็นตัวกำหนดการบันทึกไฟล์ ก็คือค่า Content-Type ดังนั้น เราสามารถใช้แค่
คำสั่ง getHeader($name) เฉพาะในส่วนของ Content-Type แทนก็ได้ สมมติเราจะบันทึกไฟล์ของผู้ใช้ในโฟลเดอร์
botdata ซ้อนด้วยโฟลเดอร์ userId ของผู้ใช้ แล้วก็มีไฟล์ต่างๆ อยู่ด้านใน โดยชื่อไฟล์จะใช้เป็น timestamp
เบื้องต้นให้สร้างโฟลเดอร์ botdata ขึ้นมาก่อน ส่วน userId เราจะใช้โค้ดเป็นตัวสร้าง 
 
ส่วนของไฟล์ bot.php บางส่วน เพิ่มการบันทึกไฟล์
 
case (preg_match('/image|audio|video/',$typeMessage) ? true : false) :
    $response = $bot->getMessageContent($idMessage);
    if ($response->isSucceeded()) {
        // คำสั่ง getRawBody() ในกรณีนี้ จะได้ข้อมูลส่งกลับมาเป็น binary 
        // เราสามารถเอาข้อมูลไปบันทึกเป็นไฟล์ได้
        $dataBinary = $response->getRawBody(); // return binary
        // ดึงข้อมูลประเภทของไฟล์ จาก header
        $fileType = $response->getHeader('Content-Type');	
        switch ($fileType){
            case (preg_match('/^image/',$fileType) ? true : false):
                list($typeFile,$ext) = explode("/",$fileType);
                $ext = ($ext=='jpeg' || $ext=='jpg')?"jpg":$ext;
                $fileNameSave = time().".".$ext;
                break;
            case (preg_match('/^audio/',$fileType) ? true : false):
                list($typeFile,$ext) = explode("/",$fileType);
                $fileNameSave = time().".".$ext;						
                break;
            case (preg_match('/^video/',$fileType) ? true : false):
                list($typeFile,$ext) = explode("/",$fileType);
                $fileNameSave = time().".".$ext;								
                break;														
        }
        $botDataFolder = 'botdata/'; // โฟลเดอร์หลักที่จะบันทึกไฟล์
        $botDataUserFolder = $botDataFolder.$userID; // มีโฟลเดอร์ด้านในเป็น userId อีกขั้น
        if(!file_exists($botDataUserFolder)) { // ตรวจสอบถ้ายังไม่มีให้สร้างโฟลเดอร์ userId
            mkdir($botDataUserFolder, 0777, true);
        }	
        // กำหนด path ของไฟล์ที่จะบันทึก
        $fileFullSavePath = $botDataUserFolder.'/'.$fileNameSave;
        file_put_contents($fileFullSavePath,$dataBinary); // ทำการบันทึกไฟล์
        $textReplyMessage = "บันทึกไฟล์เรียบร้อยแล้ว $fileNameSave";
        $replyData = new TextMessageBuilder($textReplyMessage);
        break;
    }
    $failMessage = json_encode($idMessage.' '.$response->getHTTPStatus() . ' ' . $response->getRawBody());
    $replyData = new TextMessageBuilder($failMessage);	
    break;	
 
ตัวอย่างผลลัพธ์ที่ได้
 
 


 
 
ไฟล์จากผู้ใช้ที่ส่งมา จะถูกสร้างเป็นไฟล์ใหม่ไว้บน server ใน path โฟลเดอร์
 
botdata > userId ของคนที่สนทนากับ bot > ชื่อไฟล์ด้านใน
 
เท่านี้เราก็สามารถบันทึกไฟล์รูปภาพ เสียง หรือวิดีโอ ที่ส่งมาจากผู้ใช้ ลงบน server ได้
 
ดูไฟล์ bot.php ทดสอบแบบเต็ม จะได้เป็นดังนี้
 
<?php
// กรณีต้องการตรวจสอบการแจ้ง error ให้เปิด 3 บรรทัดล่างนี้ให้ทำงาน กรณีไม่ ให้ comment ปิดไป
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// include composer autoload
require_once '../vendor/autoload.php';

// การตั้งเกี่ยวกับ bot
require_once 'bot_settings.php';

// กรณีมีการเชื่อมต่อกับฐานข้อมูล
//require_once("dbconnect.php");

///////////// ส่วนของการเรียกใช้งาน class ผ่าน namespace
use LINE\LINEBot;
use LINE\LINEBot\HTTPClient;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
//use LINE\LINEBot\Event;
//use LINE\LINEBot\Event\BaseEvent;
//use LINE\LINEBot\Event\MessageEvent;
use LINE\LINEBot\MessageBuilder;
use LINE\LINEBot\MessageBuilder\TextMessageBuilder;
use LINE\LINEBot\MessageBuilder\StickerMessageBuilder;
use LINE\LINEBot\MessageBuilder\ImageMessageBuilder;
use LINE\LINEBot\MessageBuilder\LocationMessageBuilder;
use LINE\LINEBot\MessageBuilder\AudioMessageBuilder;
use LINE\LINEBot\MessageBuilder\VideoMessageBuilder;
use LINE\LINEBot\ImagemapActionBuilder;
use LINE\LINEBot\ImagemapActionBuilder\AreaBuilder;
use LINE\LINEBot\ImagemapActionBuilder\ImagemapMessageActionBuilder ;
use LINE\LINEBot\ImagemapActionBuilder\ImagemapUriActionBuilder;
use LINE\LINEBot\MessageBuilder\Imagemap\BaseSizeBuilder;
use LINE\LINEBot\MessageBuilder\ImagemapMessageBuilder;
use LINE\LINEBot\MessageBuilder\MultiMessageBuilder;
use LINE\LINEBot\TemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\DatetimePickerTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\PostbackTemplateActionBuilder;
use LINE\LINEBot\TemplateActionBuilder\UriTemplateActionBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ButtonTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselColumnTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ConfirmTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ImageCarouselTemplateBuilder;
use LINE\LINEBot\MessageBuilder\TemplateBuilder\ImageCarouselColumnTemplateBuilder;


$httpClient = new CurlHTTPClient(LINE_MESSAGE_ACCESS_TOKEN);
$bot = new LINEBot($httpClient, array('channelSecret' => LINE_MESSAGE_CHANNEL_SECRET));

// คำสั่งรอรับการส่งค่ามาของ LINE Messaging API
$content = file_get_contents('php://input');

// แปลงข้อความรูปแบบ JSON  ให้อยู่ในโครงสร้างตัวแปร array
$events = json_decode($content, true);
if(!is_null($events)){
	// ถ้ามีค่า สร้างตัวแปรเก็บ replyToken ไว้ใช้งาน
	$replyToken = $events['events'][0]['replyToken'];
	$userID = $events['events'][0]['source']['userId'];
	$sourceType = $events['events'][0]['source']['type'];
	$is_postback = NULL;
	$is_message = NULL;
	if(isset($events['events'][0]) && array_key_exists('message',$events['events'][0])){
		$is_message = true;
		$typeMessage = $events['events'][0]['message']['type'];
		$userMessage = $events['events'][0]['message']['text'];		
		$idMessage = $events['events'][0]['message']['id'];	
	}
	if(isset($events['events'][0]) && array_key_exists('postback',$events['events'][0])){
		$is_postback = true;
		$dataPostback = NULL;
		parse_str($events['events'][0]['postback']['data'],$dataPostback);;
		$paramPostback = NULL;
		if(array_key_exists('params',$events['events'][0]['postback'])){
			if(array_key_exists('date',$events['events'][0]['postback']['params'])){
				$paramPostback = $events['events'][0]['postback']['params']['date'];
			}
			if(array_key_exists('time',$events['events'][0]['postback']['params'])){
				$paramPostback = $events['events'][0]['postback']['params']['time'];
			}
			if(array_key_exists('datetime',$events['events'][0]['postback']['params'])){
				$paramPostback = $events['events'][0]['postback']['params']['datetime'];
			}						
		}
	}	
	if(!is_null($is_postback)){
		$textReplyMessage = "ข้อความจาก Postback Event Data = ";
		if(is_array($dataPostback)){
			$textReplyMessage.= json_encode($dataPostback);
		}
		if(!is_null($paramPostback)){
			$textReplyMessage.= " \r\nParams = ".$paramPostback;
		}
		$replyData = new TextMessageBuilder($textReplyMessage);		
	}
	if(!is_null($is_message)){
		switch ($typeMessage){
			case 'text':
				$userMessage = strtolower($userMessage); // แปลงเป็นตัวเล็ก สำหรับทดสอบ
				switch ($userMessage) {
					case "p":
						// เรียกดูข้อมูลโพรไฟล์ของ Line user โดยส่งค่า userID ของผู้ใช้ LINE ไปดึงข้อมูล
						$response = $bot->getProfile($userID);
						if ($response->isSucceeded()) {
							// ดึงค่ามาแบบเป็น JSON String โดยใช้คำสั่ง getRawBody() กรณีเป้นข้อความ text
							$textReplyMessage = $response->getRawBody(); // return string			
							$replyData = new TextMessageBuilder($textReplyMessage);			
							break;				
						}
						// กรณีไม่สามารถดึงข้อมูลได้ ให้แสดงสถานะ และข้อมูลแจ้ง ถ้าไม่ต้องการแจ้งก็ปิดส่วนนี้ไปก็ได้
						$failMessage = json_encode($response->getHTTPStatus() . ' ' . $response->getRawBody());
						$replyData = new TextMessageBuilder($failMessage);
						break;				
					case "สวัสดี":
						// เรียกดูข้อมูลโพรไฟล์ของ Line user โดยส่งค่า userID ของผู้ใช้ LINE ไปดึงข้อมูล
						$response = $bot->getProfile($userID);
						if ($response->isSucceeded()) {
							// ดึงค่าโดยแปลจาก JSON String .ให้อยู่ใรูปแบบโครงสร้าง ตัวแปร array 
							$userData = $response->getJSONDecodedBody();	// return array		
							// $userData['userId']
							// $userData['displayName']
							// $userData['pictureUrl']
							// $userData['statusMessage']
							$textReplyMessage = 'สวัสดีครับ คุณ '.$userData['displayName'];				
							$replyData = new TextMessageBuilder($textReplyMessage);			
							break;				
						}
						// กรณีไม่สามารถดึงข้อมูลได้ ให้แสดงสถานะ และข้อมูลแจ้ง ถ้าไม่ต้องการแจ้งก็ปิดส่วนนี้ไปก็ได้
						$failMessage = json_encode($response->getHTTPStatus() . ' ' . $response->getRawBody());
						$replyData = new TextMessageBuilder($failMessage);
						break;																																																											
					default:
						$textReplyMessage = " คุณไม่ได้พิมพ์ ค่า ตามที่กำหนด";
						$replyData = new TextMessageBuilder($textReplyMessage);			
						break;										
				}
				break;		
			case (preg_match('/image|audio|video/',$typeMessage) ? true : false) :
				$response = $bot->getMessageContent($idMessage);
				if ($response->isSucceeded()) {
					// คำสั่ง getRawBody() ในกรณีนี้ จะได้ข้อมูลส่งกลับมาเป็น binary 
					// เราสามารถเอาข้อมูลไปบันทึกเป็นไฟล์ได้
					$dataBinary = $response->getRawBody(); // return binary
					// ดึงข้อมูลประเภทของไฟล์ จาก header
					$fileType = $response->getHeader('Content-Type');	
					switch ($fileType){
						case (preg_match('/^image/',$fileType) ? true : false):
							list($typeFile,$ext) = explode("/",$fileType);
							$ext = ($ext=='jpeg' || $ext=='jpg')?"jpg":$ext;
							$fileNameSave = time().".".$ext;
							break;
						case (preg_match('/^audio/',$fileType) ? true : false):
							list($typeFile,$ext) = explode("/",$fileType);
							$fileNameSave = time().".".$ext;						
							break;
						case (preg_match('/^video/',$fileType) ? true : false):
							list($typeFile,$ext) = explode("/",$fileType);
							$fileNameSave = time().".".$ext;								
							break;														
					}
					$botDataFolder = 'botdata/'; // โฟลเดอร์หลักที่จะบันทึกไฟล์
					$botDataUserFolder = $botDataFolder.$userID; // มีโฟลเดอร์ด้านในเป็น userId อีกขั้น
					if(!file_exists($botDataUserFolder)) { // ตรวจสอบถ้ายังไม่มีให้สร้างโฟลเดอร์ userId
						mkdir($botDataUserFolder, 0777, true);
					}	
					// กำหนด path ของไฟล์ที่จะบันทึก
					$fileFullSavePath = $botDataUserFolder.'/'.$fileNameSave;
					file_put_contents($fileFullSavePath,$dataBinary); // ทำการบันทึกไฟล์
					$textReplyMessage = "บันทึกไฟล์เรียบร้อยแล้ว $fileNameSave";
					$replyData = new TextMessageBuilder($textReplyMessage);
					break;
				}
				$failMessage = json_encode($idMessage.' '.$response->getHTTPStatus() . ' ' . $response->getRawBody());
				$replyData = new TextMessageBuilder($failMessage);	
				break;														
			default:
				$textReplyMessage = json_encode($events);
				$replyData = new TextMessageBuilder($textReplyMessage);			
				break;	
		}
	}
}
$response = $bot->replyMessage($replyToken,$replyData);
if ($response->isSucceeded()) {
    echo 'Succeeded!';
    return;
}

// Failed
echo $response->getHTTPStatus() . ' ' . $response->getRawBody();
?>
 
ในตอนหน้า เราจะมาดูวิธีการใช้ LINE Messaging API ในการส่ง Push Message และ Multicast Message
รอติดตาม
 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ