實作 LINE 聊天機器人 ( Google Apps Script )

在 2017 年初寫的 LINE BOT 實戰,是使用 Node.js 搭配 heroku 的服務完成,但在部署上總是遭遇到一些困難,後來發現原來 Google Apps Script 也能做到同樣的事情,不如就直接用它來打造 LINE 機器人,而且現在的設定介面又有點不同,就再寫篇文章記錄一下。

建立 LINE Messaging API

前往 LINE developers 網站,點選右上方的 login,使用自己的 LINE 帳號登入,登入後點選「 Start using Messaging API」,就會開始進行建立 Messaging API 的步驟。

LINE developers:https://developers.line.me/

第一個步驟是選擇 provider 的名稱,沒意外的話應該就是 LINE 的帳號,選擇完成繼續下個步驟。

第二個步驟的一開始要設定 API 的圖像、名稱和描述,這也是之後再 LINE 聊天室裡會呈現的。

往下繼續選擇分類 catagory、子分類 subcatagory 和 email,就可以點選 Confirm

點選 Confirm 後就要勾選相關的規範,勾選完成後就能按下 Create 建立 Messaging API。

設定 LINE Messaging API

回到個人 console 的 頁面,應該就能看到剛剛建立的 API 出現在畫面中,點擊圖示進入設定頁面。

設定畫面往下拉,重點放在 Messaging setting 的部分,這裡有幾個重點需要設定:

至於 [email protected] features 的設定,如果不想讓 [email protected] 自動回話,就兩個選項都設定為 disable。

到這個步驟之後,LINE Messaging API 的設定差不多就完成,這時候再前往 [email protected] 並登入,就會看到剛剛建立的機器人出現了,點選就能進入它的 [email protected] 設定。

[email protected]https://at.line.me/

點選「帳號設定 > 基本設定」,可以看到該機器人的 QRCode,使用手機掃描添加為好友,才能開始測試聊天機器人的功能。

Google Apps Script 接收 LINE 訊息

Google Apps Script 是一個基於 JavaScript 的程式語言,主要用來開發或串接 Google 的各種服務與應用,然而透過將程式部署到網路上,就等同產生一組 webhook 網址,透過這個網址就能讓訊息與 LINE 機器人互相溝通,點選下方的連結,用 Google 帳號登入,點選右上方的「+ 新增指令碼」就可以開始撰寫 Google Apps Script。

Google Apps Script Dashboard:https://script.google.com/

新增指令碼會產生一個無標題專案,可以點選標題進行修改,我這裡將標題修改為「linebot」,程式碼.gs 是待會要編輯的程式碼檔案。

Google Apps Script 有限定名稱格式為 doGet 或 doPost,因為我們的程式會向 LINE 發送 HTTP POST request,所以這裡要將 myFunctions 名稱改為 doPost,後方接著一個 e 的參數。因為e.parameters需包含指定的 key 與 value,所以這裡使用e.postData.contents來獲取完成傳送的內容,但因為獲取的訊息內容為「字串」,所以再用JSON.parse來轉換資料格式。

下面的例子使用console.log來印出收到的訊息,CHANNEL_ACCESS_TOKEN 是剛剛我們產生的那組金鑰。

function doPost(e) {
    var CHANNEL_ACCESS_TOKEN = '你的 Channel access token';
  var msg= JSON.parse(e.postData.contents);
  console.log(msg);
}

存檔後點選上方「發佈」,選擇「部署為網路應用程式」。

部署時有幾個設定需要注意,如果有更動程式內容,專案版本一律選擇「新增」,而具有應用程式存取權的使用者,選擇「任何人,甚至匿名使用者」,完成部署後就會產生一段網址,這段網址就是要提交給 LINE 的 webhook 網址。

複製網址,回到 LINE developer 剛剛建立的機器人設定頁面,看到 Messaging setting 的部分,點選 webhook URL 後方的筆型 icon,將網址貼上。( 注意前方的 https:// 需要手動刪除 )

完成後打開 LINE,點選和機器人的聊天室,發送一則訊息給機器人。

發送訊息後,因為剛剛有寫了 console.log 來顯示訊息,所以需要前往 Google Cloud Platform 的 Stackdriver 查看訊息記錄,上方選擇我們建立的 linebot 程式,在記錄區就能夠看到剛剛的訊息「測試訊息是否收到」以及一些對應的內容。

Google Apps Script 發送 LINE 訊息

已經能夠順利接收 LINE 訊息後,接著就是要來發送 LINE 訊息,首先看到 LINE Messaging API 的 reference,裏頭 Send Reply Message 有針對回傳的訊息格式做了定義,因此我們也必須遵照定義回傳。

參考:Send reply message

接著我們要改寫剛剛的 Apps Script,使用UrlFetchApp.fetch的方法回傳訊息,UrlFetchApp.fetch 第一個參數放入 LINE 指定回傳的 URL,第二個參數是個物件,方法 method 使用 post,header 和 payload 則遵照定義來撰寫,比較需要注意的是 payload 使用JSON.stringify將內容轉換成字串回傳。

回傳的訊息就直接原封不動的把發送的訊息回傳,為了做點區隔,我在後方加入一串「( google )」的文字,證明真的有收到並且回傳,完成後重新發佈 ( 記得一定要用「新增」 ),發佈成功後用 LINE 傳送訊息,就可以看到機器人會回應一模一樣的訊息。

function doPost(e) {

  var CHANNEL_ACCESS_TOKEN = '你的 Channel access token';
  var msg = JSON.parse(e.postData.contents);
  console.log(msg);

  // 取出 replayToken 和發送的訊息文字
  var replyToken = msg.events[0].replyToken;
  var userMessage = msg.events[0].message.text;

  if (typeof replyToken === 'undefined') {
    return;
  }

  var url = 'https://api.line.me/v2/bot/message/reply';
  UrlFetchApp.fetch(url, {
      'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': [{
        'type': 'text',
        'text': userMessage+' ( google )',
      }],
    }),
  });
}

小結

基本上如果已經能講什麼就回應什麼,一個 LINE 聊天機器人的基本功能就已經完成,接下來就是看如何用些邏輯判斷或自動化的學習,讓機器人更聰明,之後會再找時間寫點透過 LINE 機器人搭配 Google 服務的應用文章。

有興趣瞧瞧其他新文章嗎?