在台灣或日本當中,Line 一直是這些國家民眾愛用的通訊軟體之一,隨著資訊的發展,越來越多開發者重視各種機器人的開發,從上次的 Facebook Chat Bot 教學,我們教大家使用 Chatfuel 來開發 Facebook 的聊天機器人,而這次乾太將要帶給大家 Line 的聊天機器人。
LINE 官方:Messaging API 將透過 LINE 伺服器,在您的伺服器與 LINE 應用程式間互相收發資訊。並且將活用 JSON 形式的 API 進行通訊請求。
如果對於 JSON 形式不了解的,那我們就來回顧回顧以往的 Java 或 Android 上的 Json 基本教學 吧!
我們先進入 Line Message API 的官方看看吧!沒錯,就是點我。
在官方當中已經有基本的介紹了,有興趣的可以看看,首先我們要先申請一個 Line Business 帳號,這跟我們一般使用的 Line 帳號不太一樣,大家到這邊可能有點模糊,所以這邊我們要來小小的說明一下流程:
- 你有個 Line 帳號
- 你透過這個 Line 帳號,去註冊一個或多個 Line BOT 帳號。
- 開始使用。
嗯,看得好像有點懂,但事實上卻霧煞煞,沒關係,我們直接實際操作吧!我們先假設大家已經有 Line 帳號了,接下來我們要來申請 Line Business 帳號,流程非常簡單,點我,然後選擇「開始使用 Messaging API
」。
然後填完一些機器人的基本資料,你可以給他黑人滿臉問號的大頭貼,或者把他名字取名為黑人滿臉問號,都可以。
老樣子,我一樣會把我的 BOT 叫做「加摩爾
」,確認完資料後就按申請吧。
完成後,如果我們接下來要進入「前往 LINE@MANAGER
」。
接下來我們要啟用 BOT API。
我們接下來就啟用你的 BOT 吧!我們必須啟用「Webhook 傳訊
」這項功能,這樣才能透過伺服器來傳遞訊息。
啟用完之後,在「Bot設定 -> 狀態
」有個「LINE Developers
」,點進去,我們要設定我們的伺服器。
有個「Webhook URL」,我們必須設定我們伺服器 Response 的網址,嗯?你說你沒有伺服器?沒關係,我們就順便教教如何使用「Google App Engine」架設一個簡單的伺服器吧!
不過這邊我們要來小小的澄清一下 ... 話說為什麼我們要選擇使用 Google App Engine 呢?
首先 LINE 官方要求 Webhook URL 的來源必須是 HTTPS,如果只是用 XAMPP 架設一個 Apache 的話,LINE 官方是不~吃~你~這~套的!二來又有固定IP、動態IP的問題點存在,而且電腦關機就等於機器人死翹翹了!所以選擇使用 Google App Engine 來"充當"一個基本的伺服器,當然後續還會講到其他原因就是了。
首先,「Google App Engine」<- 開啟它吧!
點選「查看我的主控台」,並「建立專案」。
PS: 不過 Google 本身就提供教學服務了 ... 所以 ... 這邊就直接跳到寫程式的地方吧͏ (・∀・)
這邊官方已經寫好一支程式了,如果大家照著「Google 提供的 Google App Engine for PHP
」的教學,那請參考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <?php require_once('LINEBotTiny.php');
$channelAccessToken = 'Your Channel Access Token'; $channelSecret = 'Your Channel Secret';
$client = new LINEBotTiny($channelAccessToken, $channelSecret);
foreach ($client->parseEvents() as $event) { $client->replyMessage(array( 'replyToken' => $event['replyToken'], 'messages' => array( array( 'type' => 'text', 'text' => $message['text'] ) ) )); };
|
另外請記得在目錄下新增一個「LINEBotTiny.php
」的檔案,程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| <?php if (!function_exists('hash_equals')) { defined('USE_MB_STRING') or define('USE_MB_STRING', function_exists('mb_strlen'));
function hash_equals($knownString, $userString) { $strlen = function ($string) { if (USE_MB_STRING) { return mb_strlen($string, '8bit'); }
return strlen($string); };
if (($length = $strlen($knownString)) !== $strlen($userString)) { return false; }
$diff = 0;
for ($i = 0; $i < $length; $i++) { $diff |= ord($knownString[$i]) ^ ord($userString[$i]); } return $diff === 0; } }
class LINEBotTiny { public function __construct($channelAccessToken, $channelSecret) { $this->channelAccessToken = $channelAccessToken; $this->channelSecret = $channelSecret; }
public function parseEvents() { if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); error_log("Method not allowed"); exit(); }
$entityBody = file_get_contents('php://input');
if (strlen($entityBody) === 0) { http_response_code(400); error_log("Missing request body"); exit(); }
if (!hash_equals($this->sign($entityBody), $_SERVER['HTTP_X_LINE_SIGNATURE'])) { http_response_code(400); error_log("Invalid signature value"); exit(); }
$data = json_decode($entityBody, true); if (!isset($data['events'])) { http_response_code(400); error_log("Invalid request body: missing events property"); exit(); } return $data['events']; }
public function replyMessage($message) { $header = array( "Content-Type: application/json", 'Authorization: Bearer ' . $this->channelAccessToken, );
$context = stream_context_create(array( "http" => array( "method" => "POST", "header" => implode("\r\n", $header), "content" => json_encode($message), ), ));
$response = file_get_contents('https://api.line.me/v2/bot/message/reply', false, $context); if (strpos($http_response_header[0], '200') === false) { http_response_code(500); error_log("Request failed: " . $response); } }
private function sign($body) { $hash = hash_hmac('sha256', $body, $this->channelSecret, true); $signature = base64_encode($hash); return $signature; } }
|
然後記得回去 Google App Engine
裡頭,開啟 Google Cloud Shell
,將你的程式碼 Compile 上去:
1
| gcloud app deploy app.yaml --project '你的專案名稱'
|
完成之後,記得把網址回填之前 LINE Developers
裡頭的 Webhood URL
。
成果:
下次大概會教如何使用 Python 撰寫會自動學習的聊天機器人吧。