為什麼會想弄個LINE Bot來玩……就只是單純覺得目前Chat Bot發展得差不多了,台灣應該多數人都是以LINE當作主要通訊軟體。想說弄個來玩,或許可以讓家長或是老師有種不一樣的感覺。
基本上我大致的架構是靠這篇文章去寫的。為了懶方便使用,我參考了另一篇文章的作法,這樣可以少寫管理上的驗證,把所有麻煩事情都丟給Google去處理。但是也間接犧牲掉反應時間跟伺服器的流量。完成的程式碼就在下面:
<?php $access_token ='你的Channel Access Token'; //define('TOKEN', '你的Channel Access Token'); $json_string = file_get_contents('php://input'); $json_obj = json_decode($json_string); $event = $json_obj->{"events"}[0]; $type = $event->{"message"}->{"type"}; $message = $event->{"message"}; $reply_token = $event->{"replyToken"}; // Google Sheet Keyword Decode // https://docs.google.com/spreadsheets/d/<<Google試算表編號>>/edit#gid=0 $url = "https://spreadsheets.google.com/feeds/list/<<Google試算表編號>>/od6/public/values?alt=json"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $html = curl_exec($ch); curl_close($ch); $data = json_decode($html, true); $result = array(); foreach ($data['feed']['entry'] as $item) { $keywords = explode(',', $item['gsx$keyword']['$t']); foreach ($keywords as $keyword) { if (mb_strpos($message->{'text'}, $keyword) !== false) { if ($item['gsx$title']['$t']!=""){ $candidate = array( "type" => "text", "text" => $item['gsx$title']['$t'], ); array_push($result, $candidate); } if ($item['gsx$previewimageurl']['$t']!="" && $item['gsx$originalcontenturl']['$t']!="") { $candidate_image = array( "type" => "image", "previewImageUrl" => $item['gsx$previewimageurl']['$t'], "originalContentUrl" => $item['gsx$originalcontenturl']['$t'] ); array_push($result, $candidate_image); } } } } // END Google Sheet Keyword Decode $post_data = array( "replyToken" => $reply_token, "messages" => $result ); $ch = curl_init("https://api.line.me/v2/bot/message/reply"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Authorization: Bearer '.$access_token //'Authorization: Bearer '. TOKEN )); $result = curl_exec($ch); curl_close($ch); ?>
整段程式碼只有兩個紅色的部分需要修改。LINE Bot Channel Access Token請到LINE Developer中去Issue一個。Google試算表編號的部分就請自行修改。
自己後來Google試算表也做了修改,欄位改為下面四項:
keyword title previewImageUrl originalContentUrl
keyword是針對訊息內容回應的關鍵字,訊息內有包含這個關鍵字就會回應。
title是你要回應的文字訊息
previewImageUrl跟originalContentUrl是圖片訊息的欄位。限制為HTTPS連結、JPEG格式、previewImageUrl尺寸240×240、originalContentUrl為1024×1024、檔案大小1MB以內。
目前卡住的幾個問題,比較嚴重的就是在Google試算表中,欄位雖然顯示上有大小寫的問題,但是在json格式下的欄位名稱是全都小寫的啊!害我卡上好久。
把檔案傳到伺服器上,LINE那邊設定好Webhook,基本上丟訊息就會有回應了。
參考文章:
iInfo 資訊交流: Line Bot 入門與應用(1) — Line Messaging API V2 + PHP 串接
http://white5168.blogspot.tw/2017/02/line-1-line-messaging-api-v2-php.html#.WdjhSzBx2Ul
Chatbot 開發指南:使用 LINE Bot PHP SDK 打造問答型聊天機器人
https://www.appcoda.com.tw/line-chatbot-sdk/