Telegram Bot學習筆記-2:用google apps script接收/推播訊息

Telegram bot學習筆記-2:用google apps script接收/推播訊息

上一篇的Telegram Bot是把程式碼放在GCP上執行。這一篇改放在Google Apps Script上。

主要原因是,Google Apps Script(以下稱GAP)比GCP更好上手,而且發佈速度也快,如果只是單純收發訊息,用GAP會更方便。


新增一個GAP檔案

只要有Google帳號,就可以新增GAP檔案。

登入Google帳號後,進到雲端硬碟的頁面,點選「新增」,就可以在清單中看到「Google Apps Script」的項目:

放個廣告賺點養主機的$$,謝謝

在Google雲端硬碟中新增Google Apps Script
在Google雲端硬碟中新增Google Apps Script

點選後,改一下專案名稱,就可以開始使用了。

GAP初始介面
GAP初始介面

加入Firebase功能

用GAP就很像在寫JS處理後端,預設的功能都是Google雲端硬碟上有的,像excel、word之類,Firebase不在預設的功能裡,因此需要另外加上去。

網路蠻多教學都是接Google excel,google一下可以找到很多。不過本人開發的機器人,資料都是用每一個user id來當key,各自的行為存在各自的欄位裡,用firebase比較適合。

接Firebase的官方說明文件在這,以下步驟是參考文件說明的:

https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase

1 加入firebase程式庫

點選「資源」 → 「程式庫」:

「資源」 → 「程式庫」
「資源」 → 「程式庫」

會出現一個燈箱,在「新增程式庫」的欄位填入:

MYeP8ZEEt1ylVDxS7uyg9plDOcoke7-2l

「新增程式庫」的欄位填入 MYeP8ZEEt1ylVDxS7uyg9plDOcoke7–2l
「新增程式庫」的欄位填入 MYeP8ZEEt1ylVDxS7uyg9plDOcoke7–2l

按下新增,就會看見FirebaseApp被新增上去。版本的部份選擇「Public release」,最後按下儲存,就接上Firebase的功能了。

放個廣告賺點養主機的$$,謝謝

版本的部份選擇「Public release」
版本的部份選擇「Public release」

2 接上指定的firebase

GAP有了firebase的功能,下一步就是要指定資料要讀寫firebase裡的哪一個資料庫。

進到firebase的首頁後,新增一個firebase資料庫,新增完成就可以進到資料庫的介面。

左側選單點選「Database」,會看見資料庫的介紹,用GAP的話要選擇「Realtime Database」:

資料庫選 Realtime Database
資料庫選 Realtime Database

點選建立資料庫後,會出現選擇安全規則,選用鎖定模式,防止別人可以讀寫資料庫:

安全性規則為鎖定模式
安全性規則為鎖定模式

按下啟用後,就會看到資料表。接著為了讓資料庫能被GAP讀寫資料,還需要一個密鑰。點選左上角「Project Overview」旁邊的齒輪,再點選「專案設定」,會看到設定的後台介面:

點選專案設定
點選專案設定

設定頁面選「服務帳戶」,再選「資料庫密鑰」:

進到資料庫密鑰
進到資料庫密鑰

雖然頁面上出現一句警告,但有趣的是,在官方文件上針對這點也說:

Google warns that this authentication method is deprecated. In fact you can still use this method but standard Service Accounts are more secure and are recommended. As Database secrets are easier to use, far from really deprecated and safe enough for most use cases, that’s what we will use here.

大意是說,雖然有警告,但他好用也夠用,所以就拿來用吧。

把密鑰存下來,可以先在GAP上設一個變數來存:

var secret = 'firebase上拿到的密鑰';

有了secret,還需要一個database url。

點選「資料庫密鑰」上面的「Firebase Admin SDK」,會看見一段「Admin SDK 設定程式碼片段」的code,裡面就有一個「databaseURL」,他的值就是database url:

拿database url
拿database url

*databaseURL上,最後沒有「/」,記得下一行的存成變數時要加上去。

一樣在GAP上設一個變數來存:

var firebaseUrl = 'https://xxxxxxxxxxx.firebaseio.com/';

secret、database url,這2個有了,就可以在GAP上使用firebase。

3 GAP上讀寫 firebase

上一步拿到secret、database url,有了這2項,就可以設定一個base變來用,為了維持主要機器人工作的檔案乾淨,建議在GAP上新增一個firebase.gs來用,主要存讀寫firebase的function。

firebase.gs前3行先寫變數:

var firebaseUrl = 'https://xxxxxxxxxxx.firebaseio.com/';
var secret = 'firebase上拿到的密鑰';
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);

讀寫firebase,官方文件上有說明,本篇就是參考文件的:

https://sites.google.com/site/scriptsexamples/new-connectors-to-google-services/firebase/tutorials/read-and-write-data-in-firebase-from-apps-script

firebase的寫入資料有3種方式:

  • set:原有的資料整個覆蓋
  • update:跟原有的資料,有不一樣的部份會更新
  • push:原有資料不動,新增一份資料上去

官方文件上提供的methods如下:

// set
base.setData(key, value);
// update
base.updateData(key, value);
// push
base.pushData(key, value);
// 讀資料
base.getData();

因為在寫機器人的時候,會一直要讀寫資料,因此可以把讀寫都設成function,存在firebase.gs上,以下是自己的設定,可以參考:


GAP設定成Telegram Bot的webhook

建立機器人的步驟,在上一篇「Telegram bot學習筆記-1:用GCP + node.js接收/推播訊息」有講到,這邊就不寫。

Telegram Bot接webhook,要有一個https的url,GAP上生成很容易。

在GAP的介面上,點選上排的「發佈」,再點「部署為網路應用程式」:

點選 佈署為網路應用程式
點選 佈署為網路應用程式

會出現一個燈箱,「將應用程式執行為」這邊選「我」。

「具有應用程式存取權的使用者」選「任何人,甚至是匿名使用者」。

部署設定
部署設定

按下部署後,因為有另外接了firebase的功能,所以會出現需要授權的步驟,這個GAP的code都是由我們自己寫的,就放心授權。

授權完後,會出現一段「目前的網路應用程式網址」,那段網址就是Telegram Bot Webhook上要用的。

拿到webhook用的網址
拿到webhook用的網址

有了網址後,就是開啟一個空白頁,網址輸入:

https://api.telegram.org/bot{機器人token}/setWebhook?url={GAP生成的網址}

按下enter,就會看見設定成功的訊息:

webhook + GAP
webhook + GAP

GAP的GET、POST

GAP處理GET、POST這兩個事件很簡單,只要寫在function裡就行了。

GET是:

function doGet() { ... }

POST是:

function doPost() { ... }

1 接收訊息

當機器人收到訊息,會POST到webhook網址上,所以只要在doPost()裡寫下收到訊息後要做的事就行了。

在上一篇「Telegram bot學習筆記-1:用GCP + node.js接收/推播訊息」有寫收到文字訊息時,格式是這樣子:

接收到訊息的格式
接收到訊息的格式

message.from.id是傳訊息的人,每一個都不一樣,因此把他當主要的key。

message.text就是傳來的訊息內容。

以下是GAP上,寫收到訊息的部份:

GAP更新後,記得再重新發佈一次。

隨便發個訊息給機器人後,就會看見firebase成功收到資料了:

firebase成功存到訊息資料
firebase成功存到訊息資料

2 發送訊息

doPost是被POST時處理的function。

發送訊息是主動POST到telegram的API。

用GAP寫POST也很簡單,跟fetch API很像,只是前面要多寫一個UrlFetch。

官方fetch說明文件:

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app

主動發訊息的code如下:

對象的id,就是收到訊息時的message.from.id。

token,就是機器人的token。

更新完code後,可以在GAP上直接執行。

按最上排選單上的「執行」 → 「執行函式」,或是按一個甲蟲圖案的右側選單都行。

選單上的「執行」 → 「執行函式」
選單上的「執行」 → 「執行函式」
甲蟲圖案的右側選單,選完後再按播放鈕
甲蟲圖案的右側選單,選完後再按播放鈕

執行完後機器人就會發出訊息了:

發送訊息
發送訊息

設定排程

GAP跟GCP的cron一樣,也有排程功能。

在上排的項目中點「編輯」 → 「現有專案的啟動程序」,就會看見觸發條件的設定頁面:

「編輯」 → 「現有專案的啟動程序」
「編輯」 → 「現有專案的啟動程序」
觸發條件的設定頁面
觸發條件的設定頁面

按下右下角的新增觸發條件就可以新增排程了。

不過不像寫cron.yaml一樣可以指定到幾點幾分,GAP的條件區間一日的話是一個小時一個小時的算。目前實測是會隨機給一個分鐘,然後每日就是設定的小時的那個分鐘執行。


看到Google有App Script這個功能,覺得就像撿到寶一樣,就不用一些需要後端的小東西都放上GCP了。


Telegram Bot學習筆記系列

  1. 用GCP + node.js接收/推播訊息
  2. 用google apps script接收/推播訊息
  3. 鍵盤keyboard
  4. 命令列commands
  5. 取得使用者大頭照

Summary
Telegram Bot學習筆記-2:用google apps script接收/推播訊息
Article Name
Telegram Bot學習筆記-2:用google apps script接收/推播訊息
Description
本篇大綱:新增一個GAP檔案、加入Firebase功能、加入firebase程式庫、接上指定的firebase、GAP上讀寫 firebase、GAP設定成Telegram Bot的webhook、GAP的GET、POST、接收訊息、發送訊息、設定排程。
Augustus
Let's Write
Let's Write
Publisher Logo

留言