MongoDBPHP

Lab พัฒนา Line Bot ด้วย Message API และ PHP

รูปแบบของ Lab ครั้งนี้เป็นการพัฒนา Line Bot หรือเจ้า Chat Bot ที่ตอบโต้เราใน Line ผ่าน Message API แต่สิ่งที่เพิ่มมาคือสอนให้มันจดจำว่าครั้งต่อไปจะตอบอะไรเรา

สิ่งที่ต้องเรียนรู้ และมีทักษะคือ:

  • ความรู้ในการเขียนโปรแกรม ภาษา PHP
  • บัญชี Business ของ Line สำหรับสมัครเปิดใช้ Message API เพื่อสร้าง Line Bot

สิ่งที่จำเป็นจริงของบทเรียนนี้คือ:

  • ทำยังไงจะมี SSL หรือ https เป็น Webhook ซึ่งจากหลายๆ บทความ แนะนำ Heroku ครับ
  • ทำยังไงจะทำ web services ข้อมูลขนาดใหญ่ และเข้าถึงเร็ว ผมเลือก MongoDB ผ่านบริการ mLab.com

สิ่งที่ตั้งเป้าหมายไว้ของ Lab บทเรียนนี้คือ:

  • ยังไงก็ได้ขอให้ฟรี
  • นอกจากจะกำหนด Rules ให้ Bot แล้วอยากจะสอนมันได้ด้วย

เริ่มต้นสมัคร LINE Business Center

เข้าระบบด้วยบัญชี Line ของเราแล้วเปิดใช้งาน Messaging API ครับ ทำการสมัครบริการ สร้าง Bot ของเราขึ้นมาตั้งค่าให้เรียบร้อย ทางผมเลือกตัวละครจาก Sticker Line ที่ผมวาดขึ้นอย่างเจ้า เป็ดเหลือง (ที่กำลังรอรีวิวอยู่)

หากสมัครเสร็จจะได้ดังนี้ ชื่อว่า “เป็ดเหลือง” รูปแบบ Business Type เป็น “ผู้เชี่ยวชาญ”

หากทำการ Confirm Channel เป็นที่เรียบร้อยแล้วก็ทำการเปิดใช้งาน Enable API เสียให้เรียบร้อยครับ

ทำการ Setting เจ้า Bot ของเราให้เรียบร้อยครับ **ข้อระวังอย่าให้ Bot ของเราสามารถ Join Group Chat ได้ครับ เพราะอาจจะสร้างความรำคาญเอาได้ เพราะมันจะตอบทุกข้อความ ปิดส่วนนี้ซะ

แนะนำ: ส่วนนี้ตั้งค่า Messages ที่เมนูให้เรียบร้อยครับ พวก Auto reply หากไม่ชอบก็ลบซะ เพราะเราจะกำหนด Rules ให้มันเองครับ

เมื่อตั้งค่าอะไรเป็นที่เรียบร้อยแล้ว เราจะกำหนด Web Hooks เองล่ะกัน แนะนำว่าให้ลองใช้งาน Heroku ครับ จะได้ https โดยเราต้องใช้ Github เป็นตัว Deploy บน Heroku ตรงนี้คุณ NuuNeol เขียนไว้แล้ว ในบทความนี้: LINE Bot 101 มาเริ่มต้นเขียน LINE Bot ด้วย Messaging API กัน !

เพียงแค่บทเรียนนี้จะต่างกับ Blog คนอื่นคือ PHP ที่ผมใช้จะเป็น Web Service ที่มีการกำหนดการสอนให้มันเข้าใจโลกมากขึ้นโดยผ่านรูปแบบ Pattern

สอนเป็ด[คำถาม|คำตอบ]

ดังนั้นข้อมูลที่เป็น JSON ผมจึงใช้ MongoDB หรือ mlab ครับ ให้ลองศึกษาการสร้างฐานข้อมูลจากบทความนี้: เตรียมความพร้อม AngularJS กับ MongoDB ผ่าน MongoLab (ปัจจุบัน MongoLab เปลี่ยนชื่อเป็น mLab)

ผมกำหนด Database ชื่อว่า duckduck

สร้าง Collection ว่า linebot ครับ

โดยมีข้อมูลใน Collections แต่ละ Node ดังนี้

{
    "_id": {
        "$oid": "590ab2f4c2ef165fc1f06f7f"
    },
    "question": "สวัสดี",
    "answer": "ก๊าบผม"
}

อ้างอิงการ Query โดยใช้ question ว่าอะไรก็จะได้ return กลับของ answer กลับไปตามรูปแบบดังนี้

https://api.mlab.com/api/1/databases/duckduck/collections/linebot?apiKey=<API_KEY>&q={"question":"สวัสดี"}

หมายเหตุ: อย่าลืมเปิดโหมด API ใน mlab ใช้ q เป็น Parameter ในการ Query

ทีนี้ก็มาถึงพระเอกของ PHP ล่ะครับไฟล์ api.php นั้นจะต้องอ้างอิง parameter ชื่อ msg ไปด้วยในรูปแบบ GET เสมอ (เป็นตัวอย่างอย่างง่าย) ** ใช้ Code จากเว็บไซต์ http://www.unzeen.com เป็น Pattern ตั้งต้น

<?php

$strAccessToken = "<Channel Access Token Line>";

$content = file_get_contents('php://input');
$arrJson = json_decode($content, true);

$strUrl = "https://api.line.me/v2/bot/message/reply";

$arrHeader = array();
$arrHeader[] = "Content-Type: application/json";
$arrHeader[] = "Authorization: Bearer {$strAccessToken}";
$_msg = $arrJson['events'][0]['message']['text'];


$api_key="<MLAB APIKEY>";
$url = 'https://api.mlab.com/api/1/databases/duckduck/collections/linebot?apiKey='.$api_key.'';
$json = file_get_contents('https://api.mlab.com/api/1/databases/duckduck/collections/linebot?apiKey='.$api_key.'&q={"question":"'.$_msg.'"}');
$data = json_decode($json);
$isData=sizeof($data);

if (strpos($_msg, 'สอนเป็ด') !== false) {
  if (strpos($_msg, 'สอนเป็ด') !== false) {
    $x_tra = str_replace("สอนเป็ด","", $_msg);
    $pieces = explode("|", $x_tra);
    $_question=str_replace("[","",$pieces[0]);
    $_answer=str_replace("]","",$pieces[1]);
    //Post New Data
    $newData = json_encode(
      array(
        'question' => $_question,
        'answer'=> $_answer
      )
    );
    $opts = array(
      'http' => array(
          'method' => "POST",
          'header' => "Content-type: application/json",
          'content' => $newData
       )
    );
    $context = stream_context_create($opts);
    $returnValue = file_get_contents($url,false,$context);
    $arrPostData = array();
    $arrPostData['replyToken'] = $arrJson['events'][0]['replyToken'];
    $arrPostData['messages'][0]['type'] = "text";
    $arrPostData['messages'][0]['text'] = 'ขอบคุณที่สอนเป็ด';
  }
}else{
  if($isData >0){
   foreach($data as $rec){
    $arrPostData = array();
    $arrPostData['replyToken'] = $arrJson['events'][0]['replyToken'];
    $arrPostData['messages'][0]['type'] = "text";
    $arrPostData['messages'][0]['text'] = $rec->answer;
   }
  }else{
    $arrPostData = array();
    $arrPostData['replyToken'] = $arrJson['events'][0]['replyToken'];
    $arrPostData['messages'][0]['type'] = "text";
    $arrPostData['messages'][0]['text'] = 'ก๊าบบ คุณสามารถสอนให้ฉลาดได้เพียงพิมพ์: สอนเป็ด[คำถาม|คำตอบ]';
  }
}


$channel = curl_init();
curl_setopt($channel, CURLOPT_URL,$strUrl);
curl_setopt($channel, CURLOPT_HEADER, false);
curl_setopt($channel, CURLOPT_POST, true);
curl_setopt($channel, CURLOPT_HTTPHEADER, $arrHeader);
curl_setopt($channel, CURLOPT_POSTFIELDS, json_encode($arrPostData));
curl_setopt($channel, CURLOPT_RETURNTRANSFER,true);
curl_setopt($channel, CURLOPT_SSL_VERIFYPEER, false);
$result = curl_exec($channel);
curl_close ($channel);
?>

มีการเช็คก่อนว่า มีคำว่า “สอนเป็ด” ที่เป็น Master Rule สำหรับป้อนองค์ความรู้ให้มันหรือไม่ ผ่าน

if (strpos($_msg, 'สอนเป็ด') !== false) {
}

หากไม่มีคำว่า สอนเป็ดจะมีการยิง API ข้างต้นไปตรงๆ โดยมี q สำหรับ Query {question:คำถาม} ไปเลย ก็จะใช้การเรียกคือ

if($isData >0){
   foreach($data as $rec){
    $arrPostData = array();
    $arrPostData['replyToken'] = $arrJson['events'][0]['replyToken'];
    $arrPostData['messages'][0]['type'] = "text";
    $arrPostData['messages'][0]['text'] = $rec->answer;
   }
  }else{
    $arrPostData = array();
    $arrPostData['replyToken'] = $arrJson['events'][0]['replyToken'];
    $arrPostData['messages'][0]['type'] = "text";
    $arrPostData['messages'][0]['text'] = 'ก๊าบบ คุณสามารถสอนให้ฉลาดได้เพียงพิมพ์: สอนเป็ด[คำถาม|คำตอบ]';
  }

แต่หากมีการระบุ Master Rules ว่า “สอนเป็ด” ก็จะพบ การเขียนโปรแกรมตัด String ลูกทุ่งของผมคือ

if (strpos($_msg, 'สอนเป็ด') !== false) {
    $x_tra = str_replace("สอนเป็ด","", $_msg);
    $pieces = explode("|", $x_tra);
    $_question=str_replace("[","",$pieces[0]);
    $_answer=str_replace("]","",$pieces[1]);
  }

ส่วนของ PHP ในการ Post ค่าใหม่ไปเก็บใน Mlab หรือ MongoDB นั้นก็จะใช้รูปแบบดังนี้ครับ

//Post New Data
    $newData = json_encode(
      array(
        'question' => $_question,
        'answer'=> $_answer
      )
    );
    $opts = array(
      'http' => array(
          'method' => "POST",
          'header' => "Content-type: application/json",
          'content' => $newData
       )
    );
    $context = stream_context_create($opts);
    $returnValue = file_get_contents($url,false,$context);
    $arrPostData = array();
    $arrPostData['replyToken'] = $arrJson['events'][0]['replyToken'];
    $arrPostData['messages'][0]['type'] = "text";
    $arrPostData['messages'][0]['text'] = 'ขอบคุณที่สอนเป็ด';

เมื่อสอนมันไปแล้วมันก็จะบอกว่า “ขอบคุณที่สอนเป็ด”

ตัวอย่างก็ตามภาพนี้ครับ

หากใครที่อยากจะลองคุยกับมันดู หรือลองสอนมันดูก็ Scan QR Code ผ่าน Line แล้วเพิ่มเพื่อนไปเลย

สัญญาครีเอทีฟคอมมอนส์

Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน