本篇要解決的問題
這篇要解決二個問題:
- 如何只用 Google Apps Script 就讓 LINE 機器人傳訊息?
- 如何寫一個簡單的網頁監測,在網頁回應過慢時讓機器人發通知?
在 Slack 上,有 Incoming Webhooks 可以接上機器人,讓機器人主動發通知。
Telegram 也有機器人可以主動發通知。
然後,爬了一下文,Microsoft Teams 也有 Incoming Webhooks 的應用程式。
但,有時開發團隊就不用上面的三個啊,就一直用不適合工作也不適合工程師的 LINE!免費的帳號一個月還只能發 500 則。
至於為什麼要自己寫一個網頁監測呢?因為不是每個工程師都碰得到主機端,或是懂主機端的。
當資料庫或是主機有問題,當然是由主機發警告比較快,但,啊就碰不到啊!每次出問題都是別的部門來客訴才知道,與其讓人踩在頭上,不如自己寫一隻機器人來定時查。
相關筆記文:
Slack 通知功能 純靜態
Telegram Bot:用 Google Apps script 接收 / 推播訊息
用 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 Developers 的頁面:https://developers.line.biz/zh-hant/
登入 LINE 帳號後,進到後台,選擇要建立的 Providers,如果沒有的話就建立一個。
進到 Provider 後,點 Create a new channel,類型的部份選擇「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」:
頁面中會有一項「Webhhok settings」,第一條是「Webhook URL」,按下「Edit」按鈕就可以輸入網址,這邊的網址要輸入的是我們之後從 Google Apps Script 發布後提供的網址,輸入完後會出現一個「Use webhook」的 toggle 按鈕,要打開。
這步還沒有取得網址沒關係,先記錄下網址要填在這,下面幾段取得後再回來填上就行。
Channel access token
同樣的 Messaging API 頁面繼續往下滑,最後一項就是「Channel access token」,會看見右邊有一個「Issue」的按鈕,按下去後就會產生 token,如果不更新 token,這組 token 會是永久有效。
這組 token 要存下來,讓 LINE Bot 傳送訊息就靠它。
開放加入群組
這步不一定要執行,就看想讓機器人通的對象是誰?是個人或是群組?
像 August 實際上是要傳到公司群組,那就得讓機器人具有加入群組的權限。
一樣是在「Messaging API」,有一項是「LINE Official Account features」,第一條的「Allow bot to join group chats」就是指能不能讓機器人加入群組,必須把它改成「Enabled」。
點下這條右方的「Edit」,會進到 LINE@ 的管理頁面:
管理頁面中有一項是「聊天」,把「加入群組或多人聊天室」的選項改為接受就行:
如果不想傳到群組上,只想傳給自己,那只需要自己的 ID 就行,頁籤按到「Basic settings」,最下面有一項「Your user ID」,它的右邊那串就是你自己的 ID:
3 Google Apps Script 寫入監測及推播程式碼
進到 Google 雲端硬碟,點左上角的新增,選擇 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」:
Google 會跟你要使用權限,就一律按允許。
發布完後會出現一段網址,這個網址就是 LINE 後台要填上的「Webhook URL」:
下面只要有寫到「發布」的,都是這樣操作。
要貼上的程式碼:
接著把機器人加進群組裡,隨便傳個訊息,機器人就會回覆這個群組的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 就會發送訊息到指定的群組或個人帳號中。
Hi 想問一下 line-bot-gas-monitor.js 71行 判斷是不是要換成 distance < limit 才會再回應時間內發送訊息.
對喔。
因為自己在用的時候是超過指定的時間才要發訊息通知,讓團隊去看哪邊有問題造成回應時間過久。
如果是想要在指定時間內發通知,就改成
distance < limit
就行。了解 謝謝你~
不好意思,想再請問如果用
UrlFetchApp
配對到一個不存在的 domain name 即使有加上{ muteHttpExceptions: true }
但還是會在執行的時候會跳出 DNS error 的錯誤訊息,這部分可以建議用什麼方式做例外處理嗎?
就改用 try catch:
會收到的 error 訊息是:
{ "name":"Exception" }
但……為什麼要測一個不存在的網址?這套主要是拿來監測網站用的,名單裡應該都是公司或個人所擁有的。
其實是擔心名單裡面如果有一個網址填錯或是域名有更換,程式就會中斷。
用了 try catch 是可以的 謝謝你^^
不客氣喔~
您好:
我做到 群組的ID 這邊就卡住了,
我使用取得群組 ID 的方式 第二種,
我將您寫的 code 貼在 GAS 上面,而且也發佈了,
而且也有將 GAS 產生的網址貼到 LINE 的 webhook url 設定上,
請問還有什麼地方需要注意的嗎?
剛試了一下,新增一個GAS的檔,copy貼上後設定webhook,把機器人加進群組,機器人有正常回傳群組ID。
代表程式碼部份正常。
有可能是LINE後台設定的部份,可以檢查以下:
1 token 有更新
2 機器人是選「接受邀請加入群組或多人聊天室(Allow bot to join group chats)」
3 回應模式是「聊天機器人」
4 「自動回應訊息(Auto-reply messages)」、「Webhook(Use webhook )」,這二個是啟用
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還是沒有反應,是哪裡做錯了嗎?
程式碼寫好後,請問有發布嗎?
請問~程式碼裡面說 沒用時要註解起來,我註解了,但還是會重複傳群組ID,
我是不是哪裡做錯了QAQ
更新完程式碼後,記得要再發布一次喔。
成功了,謝謝作者🙇🏻♀
ZIMI,可以請教取得群組ID是如何執行成功的嗎?
請問網址可以改為IP嗎?
我改了都說錯誤
[…] LINE config 中需要的 channelAccessToken、channelSecret 要自行從後台中取得,如果以前從未取得過,可以參考這篇:用 Google Apps Script,建立簡易網站監測機器人。 […]