Site icon 中小學資訊人員根本不算MIS

PHP LINE Bot實作

為什麼會想弄個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/

Exit mobile version