About Me

quickbooksthai โปรแกรมบัญชี

มาลองเล่น Line Bot โดยใช้ Message Api Line กันเถอะ (PHP)

เป็นครั้งแรกที่นำความรู้ที่ได้ มาเขียนบทความนี้นะครับ ถ้าผิดพลาดประการใด ขออภัย ณ ที่นี้ด้วยจ้า :D
วันนี้ได้รับโปรเจค ให้ใช้ Line Bot โดยให้ทำการสร้าง Line Official มาตัวหนึ่ง แล้วให้ Line Official สามารถแจ้งเตือนข้อความไปหา User แต่ละคนที่มาจากการ Add Line Ofiicial โดยการแจ้งเตือนข้อความต้องเป็น 1:1 ด้วย

Message Api Line คืออะไรหว่า ?

เป็น Api ของ Line ที่ใช้สำหรับในการแจ้งเตือนข้อความ ไปยัง User Id นั้นๆ
แต่ User Id ไม่ใช่ที่เราตั้งมาจากในระบบไลน์นะ เราต้องทำการเขียนโค๊ดเพื่อเอาค่าออกมาอีกที
เอาล่ะ ตอนนี้ถึงเวลาได้ลงมือกันแล้วววววว

1. สร้างแอคเค้าท์ใน Line Dev

ในการใช้ Message Api Line จำเป็นสร้างแอคเค้าท์ใน Line Dev เท่านั้น โดยทำการเข้าไปลิงค์นี้ https://developers.line.me/en/ แล้วเข้าเมนูที่ชื่อ Messaging API (ตามกรอบสีแดงเลยจ้า)
หลังจากนั้นระบบจะทำการให้เรา Login เข้าไปใช้งาน ก็ Login เข้าไปเลยจ้า
พอเสร็จแล้ว เราจะพบ Console ของ Line Dev ซึ่งระบบจะให้เรา Create new provider ก่อน เราก็ใส่ provider ที่ต้องการได้เลย ถ้าใส่ชื่อเสร็จแล้ว กด Confirm
ซึ่งเราจะได้หน้าต่างแบบนี้ (ตัวอย่างของผมใช้ชื่อว่า ProjectChatbot นะครับ) จะเห็นว่าใน Console จะว่างเปล่าอยู่ ให้เราทำการเลือก Messaging API เพื่อทำการสร้าง
แล้วจากนั้นจะเป็นการ Create new channel โดยให้เราใส่รายละเอียดของ Messaging API โดยทำการใส่รูปภาพแอพ,ใส่ชื่อแอพ,ใส่รายละเอียดแอพ,ใส่ข้อมูลประเภทแอพ และใส่ email ลงไป
จากนั้นให้สังเกต Plan จะพบว่า
ในการ push messages นั้น จำกัดเพื่อนที่แอดมา ได้เพียงแค่ 50 คนเท่านั้น (ณ วันที่ 01/10/2561) ซึ่งวิธีที่อัพเกรดได้ นั้น มี 2วิธี คือ
1 ซื้อ Official Account + Business Connect (ต้องสอบถามทาง line )
2 ผ่านการคัดเลือกเข้าโครงการ LINE SCALEUP
เมื่อทำการเลือก Confirm อย่าลืมอ่าน Terms of use กันด้วยเด้ออ
ถ้าเข้าใจแล้วติ๊กแล้ว ทำการ Create โลดด
จากนั้นระบบจะกลับไปหน้า Console แล้วจะเจอ Channel ที่สร้างแล้ว เย้ๆ
จากนั้นลองกดเข้าไปดูจะพบ Channel settings ต่างๆ หลักๆให้สนใจ 3 หัวข้อ ดังนี้
หัวข้อแรก คือ Basic information เป็นข้อมูลเบื้องต้นของ Channel ที่เราสร้าง
(ให้ทุกคนจำค่า Channel secret ไว้เพราะเป็นค่าที่ใช้สำหรับการแจ้งเตือนจ้า)
หัวข้อสอง คือ Messaging settings เป็นการตั้งค่าข้อความที่มีการตอบโต้การแชท
แต่ให้สังเกตค่า Channel access token (long-lived) เป็นค่าว่างอยู่ให้ทำการเลือก Issue เพื่อให้ระบบเอาค่า token ออกมา
แล้วจะพบหน้าต่างให้เราสามารถกำหนดการใช้ Token อยู่ได้ 0–24 ชม ก็กำหนดเวลาที่ต้องการได้ หลังจากเลือกเสร็จ ให้เลือก Issue อีกครั้ง
แล้วคราวนี้จะได้ค่า Channel access token (long-lived) ออกมาแล้ว
ส่วนเมนูของการตั้งค่า Webhoots จะมาอธิบายตอนที่ 3 อีกที
หัวข้อสุดท้าย คือ Other เป็นการแสดงค่า User Id ของ Channel ของเรา

2. สร้าง Server บน Heroku

Heroku เป็น Cloud Application Platform ซึ่งเราต้องสร้าง Server
เพื่อให้เป็น Webhoots นั้นเอง
Webhoots คือ การทำงานแบบ Real time ของเหตุการณ์(event)ต่างๆ เช่น ถ้ามี user ส่งข้อความมาหา linebot ของเรา ก็จะส่งเหตุการณ์(event)นั้นมาที่ url ที่เรากำหนดไว้
หมายเหตุ ถ้ามี server ของเราเอง ก็สามารถใช้ได้เช่นกัน แต่บทความนี้
ขอใช้ heroku นะจ้ะ
มาเริ่มทำกันจ้า
ขั้นตอนที่ 1 
ให้สมัครสมาชิก Sign Up ก่อน https://www.heroku.com/
ขั้นตอนที่ 2 หลังจาก Login สำเร็จแล้ว จะพบหน้า Dashboard ให้ทำเลือก Create New App เพื่อเริ่มสร้าง Server
ขั้นตอนที่ 3 ให้กำหนดชื่อ App Name แต่ไม่ต้องใส่ค่านะ ให้ระบบมันสร้างเอง และ Region เป็นค่า Default คือ United States แล้วกด Create app
ขั้นตอนที่ 4 ให้สังเกตชื่อของ App Name จากภาพชื่อว่า obscure-plains-58372 ซึ่งระบบจะสร้างชื่อแตกต่างออกไปครับ จากนั้นให้ทำการทดสอบการเข้าถึง App โดยใช้ Url ตามนี้
https://<App Name>.herokuapp.com
ตัวอย่างเช่นของผม คือ
https://obscure-plains-58372.herokuapp.com
หากถูกต้องจะได้เว็บหน้าตาแบบนี้เลยจ้า
ในการ Deploy Code สามารถทำได้ 3 วิธี คือ Heroku CLI , GitHub , Dropbox(ในบทความนี้ ใช้ Github ที่เหล่า Dev ใช้เป็นอยู่แล้ว อิอิ)
แต่ช้าก่อน ตอนนี้ผมได้เขียนโค๊ดเสร็จเรียบร้อยแล้ว เข้า github ของท่านแล้ว
fork กันได้เลยย https://github.com/Sorajz/line-bot-exam-php
พอfork เสร็จให้กลับไปหน้า console แล้ว เลือก github
จากนั้นเลือก Connect to github แล้วจะแสดงรายการของ repo ของเราทั้งหมด
ให้ search project ที่ชื่อว่า line-bot-exam-php (ที่เราทำการ fork ไปแล้ว)
จากนั้นก็กด Connect เพื่อนำโค๊ดลง Heroku
ต่อมาให้เลือก Enable Automatic Deploys เป็นคำสั่งให้ Deploy อัตโนมัติจ้า
และอย่างสุดท้าย ในการทำครั้งแรกต้อง Manual deploy ก่อนนะจ้ะ
เลือก Deploy Branch
แล้วก็รอสักครู่ ถ้าได้จะพบหน้าตาแบบนี้
ไหนๆลองรันโค๊ด index.php ทีสิ ว่าได้เปล่า
ถ้าได้จะแสดงผลลัพธ์แบบนี้จ้า
ในที่สุดก็เอา code ลงใน Heroku สำเร็จแล้วว
แต่ทว่ายังเหลือส่วนสุดท้าย คืออ

3. Implement Code กันเถอะ

ให้ลองเปิดไฟล์ webhooks.php แล้วแก้ไขค่า access_token
โดยใช้ค่า Channel access token ที่เราได้ค่ามา
<?php // callback.phprequire "vendor/autoload.php";require_once('vendor/linecorp/line-bot-sdk/line-bot-sdk-tiny/LINEBotTiny.php');$access_token = 'XXXXXXXXX';
// Get POST body content
$content = file_get_contents('php://input');// Parse JSON
$events = json_decode($content, true);// Validate parsed JSON data
if (!is_null($events['events'])) {// Loop through each eventforeach ($events['events'] as $event) {// Reply only when message sent is in 'text' formatif ($event['type'] == 'message' && $event['message']['type'] == 'text') {// Get text sent$text = $event['source']['userId'];// Get replyToken$replyToken = $event['replyToken'];// Build message to reply back$messages = ['type' => 'text','text' => $text];// Make a POST Request to Messaging API to reply to sender$url = 'https://api.line.me/v2/bot/message/reply';$data = ['replyToken' => $replyToken,'messages' => [$messages],];$post = json_encode($data);$headers = array('Content-Type: application/json', 'Authorization: Bearer ' . $access_token);$ch = curl_init($url);curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_POSTFIELDS, $post);curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);$result = curl_exec($ch);curl_close($ch);echo $result . "\r\n";}}}echo "OK";
อธิบายโค๊ด เมื่อมี event ในการได้รับข้อความจาก user จะสั่งให้ bot ส่ง id ของ user คนนั้นออกมา (เราจะทำมาเพื่อไว้สำหรับแจ้งเตือนสำหรับ user นั้นๆ)
จากนั้นให้กลับไปหน้า console ของ line
โดยทำการ Enable ตัวของ Use Webhoots
และให้ทำการ verify ตัวของ Web Hooks URL
โดยใช้ https://<App Name>.herokuapp.com/webhoots ตามรูปเลยจ้า
ไหนๆๆ ลองเทสซิ ว่าได้หรือเปล่าน้า
ถ้าบอทตอบกลับมาแล้ว แสดงว่านั้นคือ id ของ user (idPush)
ซึ่งเราสามารถใช้ id นี้ ไปแจ้งเตือนให้กับ user คนนี้ได้เลย
4. มาแจ้งเตือนกันเถอะ

access_token = ได้จาก Channel access token ของหน้า console line
channelSecret = ได้จาก Channel secret ของหน้า console line
idPush = id ของ user ที่ได้จากบอทตอบกลับมา
<?phprequire "vendor/autoload.php";$access_token = 'xxxxx';$channelSecret = 'xxxxx';$idPush = 'xxxxxx'$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient($access_token);$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => $channelSecret]);$textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder('hello world');$response = $bot->pushMessage($idPush, $textMessageBuilder);
echo $response->getHTTPStatus() . ' ' . $response->getRawBody();
เสร็จแล้วก็ลองรันโค๊ดผ่าน web brower ก็จะพบข้อความ helloworld
ตอบกลับไปหา user ได้แล้วววววว
ซึ่งหมายความว่า สามารถแจ้งเตือนได้แล้วจ้าา
==========================
เป็นยังไงกันบ้างครับ หวังว่าจะเข้าใจกันนะครับ
ถ้าเกิดมีข้อสงสัยก็สอบถามมาได้นะครับ จะพยายามรีบตอบกลับนะครับ :D
สุดท้ายนี้ถ้าชอบบทความนี้ อย่าลืมกด clap ให้กำลังใจนะครับ
ไว้โอกาสหน้าผมจะมาแนะนำการเขียน line bot ในบทต่อไปนะครับผม

Post a Comment

0 Comments