พัฒนา Line bot ด้วยภาษา PHP อย่างง่าย ด้วยโค้ดไม่กี่บรรทัด (ep.1)

วันที่: 13 ก.พ. 2565 10:38 น.

พัฒนา Line bot ด้วยภาษา PHP อย่างง่าย ด้วยโค้ดไม่กี่บรรทัด (ep.1)
ในบทความนี้จะพาพัฒนา Line bot ด้วยภาษา PHP กัน ในเคสนี้จะไม่ได้พาสร้าง LINE Channel นะครับ เพราะมันทำง่ายมาก ๆ ไปสร้างกันไว้ก่อนเลยที่ LINE Developer Console
ต้องบอกก่อนว่าบทนี้เหมาะสำหรับคนที่มี server และ domain ที่ร้องรับ https แล้วนะครับ หากยังไม่มีก็หามาก่อนเลย หรือใช้ ngrok ก็ได้เหมือนกันครับ

มาเริ่มกันเลย!!

ผมได้สร้าง LINE Channel แบบ Messaging API ไว้แล้ว และใส่รายละเอียดต่าง ๆ ไว้แล้ว เช่น ชื่อ รายละเอียด และภาพไอคอน สิ่งที่เราต้องมีหลัก ๆ จะอยู่ 2 tab นี้

แท็ป Basic settings ให้เลื่อนหา Channel secret
แท็ป Messaging API
ให้เลื่อนหา Webhook URL จากนั้นใส่ url ของ bot เราลงไปเช่น https://domain.com/bot.php (คือไฟล์ที่จะพาเขียนต่อไปนี้) และ
ให้เลื่อนหา Channel access token (กดปุ่ม Issue ได้เลย)

ถึงขั้นนี้ เราพร้อมที่จะเขียนโค้ดแล้ว

ใช้ Terminal สร้างโฟลเดอร์ linebot ไว้ จากนั้น cd เข้าไป ดังนี้
mkdir linebot
cd linebot​
 
จากนั้นใช้ Composer ติดตั้ง LINE Messaging API SDK โดยใช้คำสั่ง
composer require linecorp/line-bot-sdk​
 
จะไฟล์โฟลเดอร์ vendor และไฟล์ composer.json, composer.lock มา จากนั้น สร้างไฟล์ bot.php ขึ้นมา โค้ดดังนี้
<?php
include_once('./vendor/autoload.php');

$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient('<channel access token>'); // ใส่ token แทน <channel access token> จาก tab Basic settings
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => '<channel secret>']); // ใส่แทน <channel secret> ด้วยข้อมูลจาก Messaging API นะ

$data = file_get_contents('php://input');
if ($data == '')
    return;

file_put_contents('chkData.txt', $data . PHP_EOL, FILE_APPEND);
return;

$textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder('hello');
$response = $bot->replyMessage('<reply token>', $textMessageBuilder);
if ($response->isSucceeded()) {
    echo 'Succeeded!';
    return;
}

// Failed
echo $response->getHTTPStatus() . ' ' . $response->getRawBody();
?>
 
จะสังเกตว่า ผมสร้างไฟล์ chkData.txt ไว้เพื่อตรวจสอบว่า LINE คืนค่าอะไรให้เราไปใช้ได้บ้าง (หรือจะดูค่าตามที่ตนถนัดเลยก็ได้ แต่ผมถนัดท่านี้) ซึ่งจะได้ตามนี้ครับ
{
    "destination":"U951d89e98857f2ac61a8283e4f370297",
    "events":[
        {
            "type":"message",
            "message":{
                "type":"text",
                "id":"15580287762226",
                "text":"ดีจ้า"
            },
            "timestamp":1644718043034,
            "source":{
                "type":"user",
                "userId":"U22b7bee4b70dd349c2e0832f025e9950"
            },
            "replyToken":"f51d58d31879473db326f99038cd0ed7",
            "mode":"active"
        }
    ]
}
 
นั่นไง เรามี replyToken มาแล้ว เราก็สามารถใช้สำหรับตอบกลับข้อความนั้น ๆ ได้แล้วครับ ดูโค้ดแบบสมบูรณ์ได้ตามนี้ครับ
ไฟล์ bot.php
<?php
include_once('./vendor/autoload.php');

$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient('token ของคุณ');
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => 'channelSecret ของคุณ']);

$data = file_get_contents('php://input');
if ($data == '')
    return;

$data = json_decode($data, true);
$replyToken = $data['events'][0]['replyToken'];
$messageType = $data['events'][0]['message']['type'];

if ($messageType == 'text') {
    $userMessage = $data['events'][0]['message']['text'];
    $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder('ข้อความคุณคือ ' . $userMessage);
} else if ($messageType == 'sticker') {
    $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\StickerMessageBuilder(789, 10856);
} else if ($messageType == 'image') {
    $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\ImageMessageBuilder('https://puwanai.com/tutorial/linebot/image.jpeg', 'https://puwanai.com/tutorial/linebot/image.jpeg');
} else if ($messageType == 'location') {
    $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\LocationMessageBuilder('ส้มตำไทญ้อ แซ่บเวอร์', '200/641 ถนนแจ้งวัฒนะ ซอย 10 แยก 1, ทุ่งสองห้อง, หลักสี่, Bangkok 10210', 13.8868937, 100.5756333);
} else {
    $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder('อื่น ๆ');
}

$response = $bot->replyMessage($replyToken, $textMessageBuilder);
if ($response->isSucceeded()) {
    echo 'Succeeded!';
    return;
}

// Failed
echo $response->getHTTPStatus() . ' ' . $response->getRawBody();
หวังว่าจะเป็นประโยชน์ ลองนำไปประยุกต์ใช้ได้เลยครับ
ลองทดสอบตัวอย่าง โดยเพิ่มเพื่อนได้ที่ @lwl9942n หรือใช้ QR Code นี้ครับ
 
 
 
อ่านรายละเอียดเพิ่มเติมได้ที่ https://github.com/line/line-bot-sdk-php

เรื่องอื่น ๆ ที่เกี่ยวข้อง