Image for post
Image for post

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

Aeknarin Sirisub
Mar 14, 2019 · 4 min read

สวัสดีครับ ผมนาย เพนกวิน วันนี้จะมาแชร์การเขียน 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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

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

Image for post
Image for post

หลังจากนั้นเราจะทดลองเขียน 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 แล้ว

Image for post
Image for post

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 ก็จะถูกสร้างขึ้นมาตามชื่อที่เราได้ตั้งเอาไว้

Image for post
Image for post

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 ดูสักหน่อยว่าตอบรึเปล่าน้าาา

Image for post
Image for post

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

เป็นอย่างไรบ้างครับกับบทความแรกของผม นาย เพนกวิน ถ้าชอบก็อย่าลืมกด 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/

LINE Developers Thailand

Closing the distance.

Aeknarin Sirisub

Written by

LINE Developers Thailand

Closing the distance. Our mission is to bring people, information and services closer together

Aeknarin Sirisub

Written by

LINE Developers Thailand

Closing the distance. Our mission is to bring people, information and services closer together

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store