LINE Bot:用 Google Apps Script 建立簡易網站監測機器人

LINE bot:用Google Apps Script,建立簡易網站監測機器人
LINE bot:用Google Apps Script,建立簡易網站監測機器人

本篇要解決的問題

這篇要解決二個問題:

  1. 如何只用 Google Apps Script 就讓 LINE 機器人傳訊息?
  2. 如何寫一個簡單的網頁監測,在網頁回應過慢時讓機器人發通知?

在 Slack 上,有 Incoming Webhooks 可以接上機器人,讓機器人主動發通知。

Telegram 也有機器人可以主動發通知。

然後,爬了一下文,Microsoft Teams 也有 Incoming Webhooks 的應用程式。

但,有時開發團隊就不用上面的三個啊,就一直用不適合工作也不適合工程師的 LINE!免費的帳號一個月還只能發 500 則。

至於為什麼要自己寫一個網頁監測呢?因為不是每個工程師都碰得到主機端,或是懂主機端的。

當資料庫或是主機有問題,當然是由主機發警告比較快,但,啊就碰不到啊!每次出問題都是別的部門來客訴才知道,與其讓人踩在頭上,不如自己寫一隻機器人來定時查。

相關筆記文:
Slack 通知功能 純靜態
Telegram Bot:用 Google Apps script 接收 / 推播訊息


用 GAS 製作監測網站的 LINE 機器人流程圖

用GAS製作監測網站的LINE機器人流程圖(點擊看原圖)
用 GAS 製作監測網站的 LINE 機器人流程圖(點擊看原圖)

流程很簡單,August 製作時間用不到一小時(然後寫這篇用了二個晚上,還不點讚支持一下),主要是因為就是單純的通知而已,訊息就簡單的文字就好,不用太過複雜的設計。

流程說明如下:

  • 建立 LINE 機器人
  • 取得 LINE 機器人的 token,填寫 Webhook URL
  • Google Apps Script 上寫監測網頁的 function
  • 建立觸發程序,每幾分鐘執行一次

2020.05.22 更新:
LINE bot 是用 LINE@ 帳號的,免費版一個月只能傳給 500 則訊息,1 個人看到就算一則,群組內有 10 個人看到就算 10 則。今天寫了第二篇可以用全免費的 LINE 即有功能:LINE Notify。一小時內可發 1000 次推播。
但請先閱讀完此篇,閱讀完此篇後,再改用 LINE Notify 不用 10 分鐘就可以完成。


1 建立 LINE 機器人

完整建立 LINE 機器人的步驟可以看這篇,這邊就快速帶過:

用 LINE Bot API 建立 LINE@ 圖文選單

進到 LINE Developers 的頁面:https://developers.line.biz/zh-hant/

登入 LINE 帳號後,進到後台,選擇要建立的 Providers,如果沒有的話就建立一個。

進到 Provider 後,點 Create a new channel,類型的部份選擇「Messaging API」:

選擇「Messaging API」
選擇「Messaging API」

接下來就是填機器人的基本資料,填完後按下「Create」,機器人就建立完成。


2 Webhook URL、Channel access token

Webhook URL 是為了要取得 Group ID 或 Single ID 用,如果 ID 你已經有了,就可以跳過這步。

而 LINE 機器人要能主動發送訊息,Channel access token 是一定要有的。

Webhook URL

在 LINE 的後台,機器人的頁面中,頁籤上選「Messaging API」:

選「Messaging API」
選「Messaging API」

頁面中會有一項「Webhhok settings」,第一條是「Webhook URL」,按下「Edit」按鈕就可以輸入網址,這邊的網址要輸入的是我們之後從 Google Apps Script 發布後提供的網址,輸入完後會出現一個「Use webhook」的 toggle 按鈕,要打開。 

輸入Webhook URL
輸入Webhook URL

這步還沒有取得網址沒關係,先記錄下網址要填在這,下面幾段取得後再回來填上就行。

Channel access token

同樣的 Messaging API 頁面繼續往下滑,最後一項就是「Channel access token」,會看見右邊有一個「Issue」的按鈕,按下去後就會產生 token,如果不更新 token,這組 token 會是永久有效。

取得token
取得 token

這組 token 要存下來,讓 LINE Bot 傳送訊息就靠它。

開放加入群組

這步不一定要執行,就看想讓機器人通的對象是誰?是個人或是群組?

像 August 實際上是要傳到公司群組,那就得讓機器人具有加入群組的權限。

一樣是在「Messaging API」,有一項是「LINE Official Account features」,第一條的「Allow bot to join group chats」就是指能不能讓機器人加入群組,必須把它改成「Enabled」。

點下這條右方的「Edit」,會進到 LINE@ 的管理頁面:

點擊Edit
點擊 Edit

管理頁面中有一項是「聊天」,把「加入群組或多人聊天室」的選項改為接受就行:

接受加入群組或多人聊天室
接受加入群組或多人聊天室

如果不想傳到群組上,只想傳給自己,那只需要自己的 ID 就行,頁籤按到「Basic settings」,最下面有一項「Your user ID」,它的右邊那串就是你自己的 ID:

取得個人ID
取得個人 ID

3 Google Apps Script 寫入監測及推播程式碼

進到 Google 雲端硬碟,點左上角的新增,選擇 Google Apps Script:

新增Google Apps Script
新增 Google Apps Script

以下 Google Apps Script 都簡寫成 GAS。

檔案的頁面上會呈現可以寫程式碼的樣子。

如果訊息只需要傳給你自己,那在上一步從 LINE 的後台中就可以看到 ID。

如果是要傳到群組,就必須要取得群組 ID。

取得群組 ID

取得群組 ID 的方式有 2 種。

第一種是讓 GAS 接上 Firebase,把機器人收到的訊息存一份到 Firebase 上,再從 Firebase 去看裡面的群組 ID。

GAS 接上 Firebase 請直接看這篇:

Google Apps Script 基本使用:跨網域 AJAX、接 Firebase

第二種是直接在 GAS 貼上 August 寫的程式碼後發布。

發布方式為:上面那一排選單選「發布」 > 「部署為網路應用程式」,「Who has access to the app:」選擇「Anyone, even anonymous」,最後按下「Deploy」:

發布GAS
發布 GAS

Google 會跟你要使用權限,就一律按允許。

發布完後會出現一段網址,這個網址就是 LINE 後台要填上的「Webhook URL」:

取得Webhook URL
取得 Webhook URL

下面只要有寫到「發布」的,都是這樣操作。

要貼上的程式碼:

接著把機器人加進群組裡,隨便傳個訊息,機器人就會回覆這個群組的ID:

機器人回覆群組的ID
機器人回覆群組的ID

監測回應速度

先列出要監測的網址,存成陣列:

var monitors = [
  'https://www.google.com.tw/',
  'https://www.microsoft.com/zh-tw/',
  'https://www.facebook.com/'
]

然後寫 LINE 推播訊息的 function:

接著寫一個 for 回圈,主要是 GET 陣列中的每一個網址,去計算這中間的時間差:

我們發 Request 前先記一次時間,發完後再記一次時間,最後這二個時間相減就可以知道花了多久。

getTime() 的單位是毫秒,乘上 1000 就可以換成秒數。

看要回應超過幾秒就發訊息可以自訂,修改 limit 變數就行。

這邊要注意的是,如果 GAS 發 Request 而回應有錯時,就會報錯而停止執行。

因此要多加一個 muteHttpExceptions: true,這樣 GAS 就不會因錯誤而停,而是會傳來回應狀態。

我們只要多加一個判斷確定回應碼是 200(成功回應)時再往下去計算時間。

如果不是 200,就必須讓機器人傳回應代碼的訊息,工程師看到回應碼再去檢查現在是什麼情形。

程式碼部份完整的如下:


4 設定觸發程序

程式寫好了以後,接著就是要設定排程讓 GAS 自動執行監測。

GAS 的上面那排點「編輯」 > 「現有專案的啟動程序」:

點擊現有專案的啟動程序
點擊現有專案的啟動程序

進到設定啟動程序的頁面,按右下角的「新增觸發條件」:

點擊新增觸發條件
點擊新增觸發條件

要執行的功能選 doMonitor,或是如果你有改過 function 的名字,就選那個 function。

活動來源選時間趨動。

時間型觸發條件選分鐘計時器。

分鐘間隔的話,就看想要每幾分鐘就監測一次?

填寫觸發程序的設定
填寫觸發程序的設定

都選完後按下儲存,程式就會開始執行。當回應時間超過指定的秒數,LINE Bot 就會發送訊息到指定的群組或個人帳號中。

Summary
LINE Bot:用 Google Apps Script,建立簡易網站監測機器人
Article Name
LINE Bot:用 Google Apps Script,建立簡易網站監測機器人
Description
本篇大綱:本篇要解決的問題。用 GAS 製作監測網站的LINE機器人流程圖。1 建立 LINE 機器人。2 Webhook URL、Channel access token。3 Google Apps Script 寫入監測及推播程式碼。4 設定觸發程序。
Augustus
Let's Write
Let's Write
https://letswrite.tw/wp-content/uploads/2020/08/logo_512.jpg
訂閱
通知
guest

17 Comments
最舊
最新
Inline Feedbacks
看所有留言
Mak
Mak
4 年 之前

Hi 想問一下 line-bot-gas-monitor.js 71行 判斷是不是要換成 distance < limit 才會再回應時間內發送訊息.

Mak
Mak
回覆給  August
4 年 之前

了解 謝謝你~

Mak
Mak
4 年 之前

不好意思想再請問如果用 UrlFetchApp 配對到一個不存在的 domain name 即使有加上
{ muteHttpExceptions: true } 但還是會在執行的時候會跳出 DNS error 的錯誤訊息,這部分可以建議用什麼方式做例外處理嗎?


1598500880158@2x.jpg
Mak
Mak
回覆給  August
4 年 之前

其實是擔心名單裡面如果有一個網址填錯或是域名有更換,程式就會中斷

用了 try catch 是可以的 謝謝你^^

Ivan
Ivan
4 年 之前

您好:
我做到 群組的ID 這邊就卡住了,
我使用取得群組 ID 的方式 第二種,
我將您寫的 code 貼在 GAS 上面,而且也發佈了,
而且也有將 GAS 產生的網址貼到 LINE 的 webhook url 設定上,
請問還有什麼地方需要注意的嗎?

Last edited 4 年 之前 by Ivan
hardline1
hardline1
回覆給  August
3 年 之前

var token = ‘LINE 的 Channel access token’;
function sendMessage(message) { var data = { to: ‘這邊填群組ID 或 個人ID’, messages: [ { “type”: “text”, “text”: message }, ] }; var option = { method: ‘post’, headers: { Authorization: ‘Bearer ‘ + token }, contentType: ‘application/json’, payload: JSON.stringify(data) }; UrlFetchApp.fetch(‘https://api.line.me/v2/bot/message/push’, option); }

您好,我想取得群組ID,但是用了這一段也改了token,其他2-4點也設定了,但是在群組中隨意打了什麼,BOT還是沒有反應,是哪裡做錯了嗎?

zimi
zimi
3 年 之前

請問~程式碼裡面說 沒用時要註解起來,我註解了,但還是會重複傳群組ID,
我是不是哪裡做錯了QAQ

zimi
zimi
回覆給  August
3 年 之前

成功了,謝謝作者🙇🏻‍♀

hardline1
hardline1
回覆給  zimi
3 年 之前

ZIMI,可以請教取得群組ID是如何執行成功的嗎?

JACKYLIN
JACKYLIN
3 年 之前

請問網址可以改為IP嗎?
我改了都說錯誤

trackback
LINE Bot:X-Line-Signature 簽名驗證 範例 - Bot - Let's Write
1 年 之前

[…] LINE config 中需要的 channelAccessToken、channelSecret 要自行從後台中取得,如果以前從未取得過,可以參考這篇:用 Google Apps Script,建立簡易網站監測機器人。 […]