มาเขียน LINE BOT ด้วย PHP กัน EP.1

Aeknarin Sirisub
LINE Developers Thailand
4 min readMar 14, 2019

--

สวัสดีครับ ผมนาย เพนกวิน วันนี้จะมาแชร์การเขียน LINE BOT แบบบ้านๆ
ด้วย PHP สำหรับผู้ที่ยังไม่ได้สร้าง LINE Channel สามารถอ่านได้จาก Blog ของ อาจารย์หนึ่ง ที่นี่ได้เลยครับ

*หมายเหตุ บทความนี้ผมจะยังไม่สอนเรื่องของการทำ Server นะครับเพราะฉะนั้นจะเหมาะกับคนที่มี Server และ Hosting แล้วครับผม

ถ้าพร้อมแล้วก็ไปกันเลยครับ Let’s Do It!

PART 1 — เชื่อมต่อ LINE Webhook และ Server

ในขั้นตอนนี้ผมได้ทำการสร้าง Domain และ Hosting ไว้เป็นที่เรียบร้อยแล้วนะครับ โดยที่ Domain ที่จะใช้จะต้องมี “Https” ด้วยนะครับถึงจะสามารถใช้ในการรองรับ Webhook ของ LINE ได้

เมื่อเราเข้าไปที่ LINE Developer Console ให้มองหา Tab Channel Settings

เลื่อนลงมาหาหัวข้อที่ชื่อว่า Channel access token (long-lived)

กดปุ่ม Issue ได้เลยครับจะเกิด Popup ขึ้นมาแบบนี้ ซึ่ง ตรงนี้สามารถกำหนดอายุของ Token ได้ แต่ตอนนี้ ทุก token ที่สร้างจาก developers console จะเป็น Long live token ทั้งหมด คือใช้ได้ตลอดไป ดังนั้น ตรงนี้ก็กด Issue ได้เลยครับ

หลังจากนั้นเราก็จะได้ Token มาพร้อมนำไปใช้งานแล้วครับ

เถิบลงมาอีกนิดหาหัวข้อ Use Webhooks เพื่อทำการตั้งให้มันเป็น Enabled ก่อนนะครับ

หลังจากนั้นเถิบลงมาอีกนิดจะเห็น Webhook URL ให้ใส่ข้อมูลของ Domain ที่เราได้ทำการจดไว้เข้าไป (ข้อมูล URL จะต้องไม่เกิน 500 Characters และจะต้องเป็น HTTPS เท่านั้น นะจ๊ะ)

ลองกด Verify ดูสักหนึ่งรอบ จะพบอักษรสีแดงที่เราไม่อยากเห็นมากที่สุด (ยังจะตามมาหลอกหลอนได้ TT^TT)

อย่าพึ่งตกใจไปครับที่มันขึ้นแบบนี้เพราะว่าเรายังไม่ได้เขียน File PHP สำหรับรองรับมันนั่นเอง อย่ารอช้า สร้าง File index.php ก่อนเลยครับผม

หลังจากนั้นเราจะทดลองเขียน Code เพื่อให้ Server ของเราทำการ Return Response Status 200 กลับไปให้ LINE ก่อน เพื่อตรวจสอบว่า LINE Webhook สามารถเชื่อมมายัง Server เราได้

<?php 
/*Return HTTP Request 200*/
http_response_code(200);
?>

ลองกด Verify อีกรอบ แม่เจ้า Success แล้ว! ถ้าขึ้นแบบนี้หมายความว่า LINE Webhook สามารถส่ง Request ไปยัง Server ของเราได้และระบบของเราได้ทำการ Return Response Status 200 กลับมาให้ LINE แล้ว

PART 2 — สร้าง Function เขียน File Logs

มาถึง Part ที่ 2 หลายคนคงจะงง เขียน Logs เขียนไปทำไม?
ที่เราต้องเขียน File Logs ก่อนเพื่อที่เราจะได้รู้ว่า LINE ส่ง Event อะไรมาให้เราบ้างนั่นเอง ต่อไปเราก็ต้องร่ายมนต์กันสักหน่อย เพื่อให้ File Logs เกิดขึ้นมา ด้วยการเขียน Function นี้ลงไป

file_put_contents('log.txt', file_get_contents('php://input') . PHP_EOL, FILE_APPEND);

เราสามารถเปลี่ยนชื่อของ File Logs ได้ตามที่เราต้องการโดยใส่แทนที่ ‘log.txt’ ได้เลย

ในส่วนของ file_get_contents(‘php://input’) เราใช้เพื่ออ่านข้อมูล Data ที่ LINE ส่งเข้ามาซึ่งเราจะได้ข้อมูลในลักษณะของ Json แบบนี้

{"events":[{"type":"message","replyToken":"7d7d02d64b954dfcb93683de8cc41f5f","source":{"userId":"U1a81dc36b7c95042c6ee4718cd5a7c18","type":"user"},"timestamp":1552505328709,"message":{"type":"text","id":"9509179836165","text":"ทดสอบ"}}],"destination":"Uf34ef2c60c48fb450b5abba7bda444cf"}

และเมื่อ LINE ส่ง Data เข้ามา File Logs ก็จะถูกสร้างขึ้นมาตามชื่อที่เราได้ตั้งเอาไว้

PART 3 — อับดุลเอ้ย ตอบข้าเถอะ

หลังจากที่เราสามารถเขียน Logs เพื่อดักจับ Datas ได้แล้วทีนี้ก็ได้เวลาที่ทุกท่านรอคอยเราจะมาทำให้ Bot ตอบได้นั่นเอง

เริ่มแรกตอนนี้ Datas ที่ LINE ส่งมาให้นั้นยังอยู่ในรูปของ Json เราต้องทำให้อยู่ในรูปแบบ Array ซะก่อนเพื่อให้ง่ายต่อการจัดการ ใช้คำสั่งวิชามารแบบนี้

$datas = file_get_contents('php://input');
$deCode = json_decode($datas,true);

$datas : เราสร้างตัวแปรนี้ขึ้นมาเพื่อไว้สำหรับเก็บ Datas ที่เราได้รับมาจาก LINE
$decode : เก็บค่า Array หลังจาก Decode แล้วโดยใช้คำสั่ง json_decode

หลังจากนั้นเราก็จะทำการสร้างตัวแปรเพื่อเก็บข้อมูล replytoken ซึ่ง replytoken นี้เอาไว้สำหรับใช้ในการตอบข้อความแบบ reply (ตอบกลับทันทีหลังจากที่มีการส่ง Datas จาก LINE เข้ามา)

$replyToken = $deCode['events'][0]['replyToken'];

ต่อมา ผมจะเขียน Function สำหรับจัด Format การส่ง Message แบบ Text สักหน่อย

function getFormatTextMessage($text)
{
$datas = [];
$datas['type'] = 'text';
$datas['text'] = $text;
return $datas;
}

ต่อจากนั้นผมก็จะเขียน Function สำหรับส่งข้อมูลไปยัง LINE

function sentMessage($encodeJson,$datas)
{
$datasReturn = [];
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $datas['url'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $encodeJson,
CURLOPT_HTTPHEADER => array(
"authorization: Bearer ".$datas['token'],
"cache-control: no-cache",
"content-type: application/json; charset=UTF-8",
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl); if ($err) {
$datasReturn['result'] = 'E';
$datasReturn['message'] = $err;
} else {
if($response == "{}"){
$datasReturn['result'] = 'S';
$datasReturn['message'] = 'Success';
}else{
$datasReturn['result'] = 'E';
$datasReturn['message'] = $response;
}
}
return $datasReturn;
}

ในส่วนของ Function ที่ใช้สำหรับส่งข้อมูลไปยัง LINE นั้นผมจะมีการเขียนให้มีการ Return ข้อมูลว่าสำเร็จ หรือไม่สำเร็จ ถ้าไม่สำเร็จมี Error อะไรที่ได้มาจาก LINE ด้วย

ต่อจากนั้นเราก็จะทำการเขียน Code เพื่อทำการ Link Function เพื่อให้ Bot ทำการตอบข้อความกลับไปนะครับ แบบนี้

$messages = [];
$messages['replyToken'] = $replyToken;
$messages['messages'][0] = getFormatTextMessage("เอ้ย ถามอะไรก็ตอบได้");
$encodeJson = json_encode($messages);
$LINEDatas['url'] = "https://api.line.me/v2/bot/message/reply";
$LINEDatas['token'] = "WMOsQ/4hWzaWxHAtvHw7H36SYWtU2RLT87CeKZk674MrmfcenRwApr+/9BIL1HkuWI9h3e8aDuQ6siofBjQ/rVh49uQEpz8r5It/hnguWF2Vd91lEBWHyQaYuNDvEfkruzMBbLrTXK5cs9wvmKhR/1GUYhWQfeY8sLGRXgo3xvw=";
$results = sentMessage($encodeJson,$LINEDatas);

$encodeJson : เราเขียนตัวแปรนี้มาเพื่อรองรับการ Encode กลับไปเป็น Format json โดยใช้คำสั่ง json_encode
$LINEDatas[‘url’]
: ตัวแปรนี้เราจะใช้เก็บ Link ที่เราไว้ใช้สำหรับการส่งข้อมูลไปที่ LINE ซึ่งในกรณีเราจะทำการตอบแบบ Reply เราจึงใช้ Link นี้ครับ
$LINEDatas[‘token’] : ในส่วนตัวแปรนี้เราจะใช้เก็บ Token ที่เราได้ทำการสร้างกันไว้ตั้งแต่ PART1

และนี่คือภาพรวมของ Code ทั้งหมดเมื่อทำการเขียนเสร็จแล้ว

https://gist.github.com/aeknarinamn/8ef80222cdf4f17daad0f7be5e73fbc7

ลองเทสกับ Bot ดูสักหน่อยว่าตอบรึเปล่าน้าาา

เฉียบ!!!!!!!

เป็นอย่างไรบ้างครับกับบทความแรกของผม นาย เพนกวิน ถ้าชอบก็อย่าลืมกด Follow กันไว้นะครับ แล้วพบกันใหม่ EP ถัดไปมารอดูกันว่าผมจะพาทำอะไรกันต่อ ส่วน EP นี้ขอลาไปปั่นงานก่อนนะครับ

ตอนนี้ LINE Developer เรามีแฟนเพจแล้วนะจ๊ะอย่าลืมไปกด LIKE กันด้วยนะ

https://www.facebook.com/LINEDEVTH

ส่วนใครที่ยังไม่ได้เข้าร่วมกลุ่มกับเรา คลิ๊กที่นี่ได้เลย

https://www.facebook.com/groups/LINEDEVTH

Resources

Developer console
https://developers.line.biz/en/

Messaging API Document
https://developers.line.biz/en/docs/messaging-api/

Messaging API Reference
https://developers.line.biz/en/reference/messaging-api/

--

--