GORAGOD.com

ส่งข้อความส่วนตัวไปยังผู้รับด้วย Line Api

ปกติเราจะคุ้นเคยกับการส่งข้อความไปยังไลน์ด้วย Line Notify กันอยู่แล้ว แต่ข้อจำกัดของ Line Notify คือ มันสามารถส่งไปยังกลุ่มที่กำหนดไว้ได้เท่านั้น ไม่สามารถส่งหาใครเป็นรายบุคคลได้ ในบทความนี้ผมจะพูดถึงการส่งข้อความผ่านไลน์ไปยังผู้รับแบบตัวต่อตัวด้วย Messaging API ของไลน์

เกริ่นนำกันก่อน Messaging API ของไลน์เอาไว้สำหรับส่งข้อความไปยังผู้รับทั้งแบบรายบุคคลและแบบกลุ่ม โดยมีบริการหลักอยู่ 2 บริการ
  1. Replies เป็นบริการรับข้อความการติดต่อผ่านเว็บไซต์โดยสามารถตอบกลับไปยังข้อความนี้ได้โดยอัตโนมัติ (สามารถทำได้ทั้งการตอบกลับแบบอัตโนมัติ และการตอบกลับที่กำหนดเอง) ยกตัวอย่างการใช้งานเช่น Bot
  2. Push messages เป็นบริการส่งข้อความไปยังผู้รับ ผ่าน userID ซึ่ง userID นี้ไม่ใช่ ID ไลน์นะครับเป็นคนละอันกันเราจะต้องอ่านค่า userID ออกมาจากไลน์ก่อนถึงจะสามารถส่งข้อความไปยังผู้ใช้ผ่าน userID นี้ได้
ทั้งสองบริการ เราสามารถส่งข้อความได้หลากหลายรูปแบบ แต่ในบทความนี้ผมจะยกตัวอย่างแค่การตอบกลับเป็นข้อความเท่านั้นนะครับ

ก่อนเริ่มใช้งานเราต้องไปลงทะเบียนบริการกันก่อน โดยที่เราต้องมีบัญชีไลน์อยู่แล้วโดยเข้าไปที่ https://developers.line.biz/console/
กดที่ Messaging API (กรอบสีแดง) เลยครับ จะมีคำแนะนำเกี่ยวกับบริการนี้แสดงขึ้นมาโดยบอคร่าวๆว่าทำอะไรได้บ้าง ใครอยากอ่านละเอียดก็กดดูที่ Documenttation

หากเราต้องการลงทะเบียนบริการ กดปุ่ม Start Now เลยครับ
ขั้นตอนถัดจากนี้จะเป็นการเข้าระบบด้วยบัญชี Line ที่เรามีอยู่ ให้ทำการเข้าระบบให้เรียบร้อย หรือหากเข้าระบบอยู่แล้วมันจะพาเรามาที่หน้า Create a channel
หน้านี้จะเป็นเริ่มต้นสร้างบริการ Messaging API ให้กรอกทุกอันที่เขียนว่า Don't leave this empty เลยครับ เป็นการตั้งชื่อบริการ (สามารถแก้ไขได้ภายหลัง)

หลังจากที่เพิ่มบริการสำเร็จระบบจะพาไปยังหน้ารายละเอียดของบริการตามรูป ให้กดที่แท็บ Messaging API เลยครับเราต้องใช้ข้อมูลที่หน้านี้
ในแท็บ Messaging API มีสิ่งที่เราต้องสนใจอยู่ 3 อย่าง
  • Bot basic ID อันนี้คือ ID Line ของ Bot เราต้องแอดไลน์เข้าไปที่ Bot นี้เพื่อรับ-ส่งข้อความ ระหว่าง Bot และเรา
  • Channel access token (long-lived) อันนี้คือ Access Token ทีเราต้องใช้เพื่อเขียนโปรแกรมเชื่อมต่อกับบริการ ซึ่งในกรณีที่เราต้องการสร้าง Bot เฉยๆเพื่อให้ Line ตอบกลับอัตโนมัติ อาจไม่ต้องดำเนินการอะไรตรงนี้ก็ได้ เริ่มต้นค่านี้จะเป็นค่าว่างก่อน หากต้องการสร้างให้กด Issue และเราสามารถเปลี่ยนแปลงค่านี้ได้ภายหลังโดยกดปุ่ม Reissue ในขั้นตอนนี้เราจะได้ Access Token สำหรับนำไปเขียนโปรแกรมเพื่อใช้งานกันแล้ว
  • Webhook URL อันนี้เราจะต้องกรอก URL ของเว็บไซต์ (ต้องเป็น https เท่านั้น) เพื่อใช้รับค่าต่างๆที่มีการส่งมาจาก Line Bot ตอนที่มีข้อความเข้ามา ซึ่งหากกำหนดค่านี้ไว้ จะมีการเรียกไปยัง URL นี้พร้อมกับส่งข้อมูลต่างๆไปยัง URL นี้ ซึ่งเราสามารถเขียนคำสั่งเพื่อตอบกลับด้วยตัวเองแทนการใช้ Bot ของไลน์ได้ หรือ ไม่ต้องกรอกหากไม่ต้องการใช้บริการอื่นๆนอกจาก Replies ที่ต้องการให้ Line ตอบกลับอัตโนมัติ

ต่อไปเราจะมาเขียนโค้ด PHP เพื่อใช้งาน Messaging API กัน
ทำความเข้าใจกันก่อน หลักในการส่งข้อความผ่าน Messaging API ไปยังผู้รับโดยตรง จะอาศัยการส่งข้อมูลผ่าน userID ของไลน์ และอย่างที่ผมเกริ่นไปในตอนแรกว่าค่านี้ไม่ใช่บัญชีไลน์ ดังนั้น เราจำเป็นต้องอ่านค่านี้ของ User ออกมาก่อน ซึ่งค่านี้จะส่งมากับข้อมูลของบริการ Replies (หรือ Line Bot) ดังนั้นในการเชื่อมต่อ เราจะต้องให้ User ติดต่อเราผ่านทาง Line Bot มาก่อน ซึ่งเราจะทำการอ่านข้อมูล userID จากข้อมูลที่ส่งมาจาก Line Bot เก็บไว้ จากนั้นเราถึงจะสามารถส่งข้อความไปยังผู้รับด้วยบริการ Push messages ไปยังผู้รับได้
ขั้นตอนแรก สร้างไฟล์เพื่อรับค่าจาก Bot ก่อน เพื่อจะส่ง URL นี้กำหนดให้กับ Webhook URL ตัวอย่างนี้จะเป็นการรับค่าต่างๆมาจาก Line Bot และทำการตอบกลับด้วยข้อความที่ส่งมานะครับ ตัวอย่าง https://domain.tld/webhook.php ซึ่งเราต้องเอา URL ไปกรอกให้กับช่อง Webhook URL (เมื่อกรอกแล้วอย่าลืมกด Verify ด้วย)
<?php
// Access Token
$access_token = 'กรอกข้อมูลจาก Channel access token (long-lived)';
// รับค่าที่ส่งมา
$content = file_get_contents('php://input');
// แปลงเป็น JSON
$events = json_decode($content, true);
if (!empty($events['events'])) {
    foreach ($events['events'] as $event) {
        if ($event['type'] == 'message' && $event['message']['type'] == 'text') {
            // ข้อความที่ส่งกลับ มาจาก ข้อความที่ส่งมา
            // ร่วมกับ USER ID ของไลน์ที่เราต้องการใช้ในการตอบกลับ
            $messages = array(
                'type' => 'text',
                'text' => 'Reply message : '.$event['message']['text']."\nUser ID : ".$event['source']['userId'],
            );
            $post = json_encode(array(
                'replyToken' => $event['replyToken'],
                'messages' => array($messages),
            ));
            // URL ของบริการ Replies สำหรับการตอบกลับด้วยข้อความอัตโนมัติ
            $url = 'https://api.line.me/v2/bot/message/reply';
            $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;
        }
    }
}

จากตัวอย่างนี้
  1. ข้อความที่ส่งมาคือ $event['message']['text']
  2. User ID ที่เราต้องการอยู่ที่ $event['source']['userId'] ค่านี้ไม่ได้ใช้ในกรณีของ Bot แต่เราสามารถเก็บค่านี้เพื่อไว้ใช้ในภายหลังได้ เราจะจดค่านี้ไว้เพื่อนำไปกรอกให้กับส่วนที่ 2
  3. $event['replyToken'] อันนี้เป็น Token สำหรับการตอบกลับข้อความที่ส่งมา ซึ่งเป็น Token ชั่วคราวใช้ได้ในช่วงเวลาสั้นๆ ถ้าเราต้องการตอบกลับอัตโนมัติเราจะตอบกลับโดยใช้ข้อมูลนี้

โค้ดส่วนที่ 2 เป็นการส่งข้อความไปยังไลน์ โดยใช้ User ID ที่เก็บได้มาจาก Bot
<?php
// Access Token
$access_token = 'กรอกข้อมูลจาก Channel access token (long-lived)';
// User ID
$userId = 'U49e03c8adb9113...........';
// ข้อความที่ต้องการส่ง
$messages = array(
    'type' => 'text',
    'text' => 'ทดสอบการส่งข้อความ',
);
$post = json_encode(array(
    'to' => array($userId),
    'messages' => array($messages),
));
// URL ของบริการ Replies สำหรับการตอบกลับด้วยข้อความอัตโนมัติ
$url = 'https://api.line.me/v2/bot/message/multicast';
$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);
echo $result;

คงไม่ต้องอธิบายมากนะครับ เราสามารถใช้ userID ที่จัดเก็บไว้ในฐานข้อมูลเพื่อส่งข้อความเมื่อไรก็ได้ ส่วนความสามารถอื่นๆแนะนำให้ศึกษาจาก Documenttation เลยครับ
หมายเหตุ สำหรับบริการนี้มีข้อจำกัดอยู่นะครับ
  • โดยที่บัญชีแบบฟรีสามารถส่งข้อความได้ 1,000 รายการ หากต้องการส่งมากกว่านี้จะต้องจ่ายเงินเพิ่ม
  • สำหรับบัญชีแบบฟรีจะได้ชือ ID Line แบบสุ่ม หากต้องการชื่อเฉพาะเจาะจงจะต้องสมัครบริการ LINE Official Account ซึ่งจะมีค่าบริการเช่นกัน
สำหรับรายละเอียดเพิ่มเติมดู https://www.linebiz.com/th/service/line-account-connect/