iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 18
0
AI & Data

利用Google App Script 實作Telegram Bot系列 第 18

Day 18-Telegram Bot:API & 儲存接收資料進Google Sheets

  • 分享至 

  • xImage
  •  

Day 18-Telegram Bot:API & 儲存接收資料進Google Sheets

Telegram Bot API

在讓機器人能夠有智慧之前,我們要先知道Telegram提供的幾種API。

Telegram除了自己官方的API之外,另外還有提供許多種語言的API,如果說你對於其他語言熟悉的話,也可以嘗試使用不同語言的API,這邊筆者會以官方的API來實作。

https://ithelp.ithome.com.tw/upload/images/20200928/20130283JKPZogFYZG.png

官方API:
https://core.telegram.org/bots/api

接收訊息

官方的API有兩種獲取資料的方式,分別為getUpdates和setWebhook。'

getUpdates:
這是一個最簡單獲得訊息的方法,隨便輸入任何一則訊息給機器人後,接著輸入以下網址:
https://api.telegram.org/bot你的機器人token/getUpdates
便可以得到一個回傳的JSON陣列。

https://ithelp.ithome.com.tw/upload/images/20200928/20130283YtO2WAvGk7.png

運行過程大致上是:當我們發送一個指令過去,想確認有沒有新的指令進來,如果有的話,便會回覆。
這個方法是我們主動跟 Telegram 拿取 message,雖然使用上相當方便,只要GET網址就好,但他的缺點則是需自行使用 long polling 並定時執行才能獲取最新訊息,必須要一直GET才會知道有人傳訊息過來。
使用情況比較適合在如果你的程式要不斷持續的跟Telegram主機詢問是否有新的指令進來時使用。

感謝邦友Charles Wang的提醒,上面getUpdates的網址原先打錯了,已修正內容。

SetWebhook:
使用上和getUpdates相反,SetWebhook較為複雜,但不需要一直GET,在接收到訊息時可以立即觸發。
這個方法則是Telegram偵測到有用戶傳送訊息給機器人時,會POST一個JSON格式的文件到你的伺服器,發送的位置必須要我們自己去綁定,而綁定上有個條件,就是網址必須要是https(有SSL憑證),沒有的話則沒辦法接收,剛好我們部屬後的網址就有SSL憑證。

只要在網址列輸入以下網址就可以完成webhook連結。(token跟url的前後不需要空格或是單引號雙引號)
https://api.telegram.org/bot這邊放機器人的token /setWebhook?url=這邊放部屬完的url

輸入完之後按下enter,看到以下畫面就代表你的後端已經和機器人連接囉。

https://ithelp.ithome.com.tw/upload/images/20200928/20130283CrIWgd3xVi.png

在接下來的實作,主要會以Webhook的使用為主。

利用Google Sheets儲存機器人收到的訊息

接著要介紹一個非常重要的功能,也就是儲存我們機器人接受的到資料(其他用戶傳送給機器人的訊息)。

為什麼要做這個功能呢?原因很簡單,我們可以分析接受到的訊息,來針對特定的訊息做回覆!正因為這樣,所以我們必須要將傳送進來的資料儲存下來。

方法和我們之前第11天的類似,一樣是利用Google Sheet來儲存資料。如果你對之前講的方法有點忘了,可以回去看看。
Day 11-利用Google App Script將資料存入Google Sheets(1)

程式碼.gs

function doPost(e){
  var estringa = JSON.parse(e.postData.contents);
  var d = new Date();
  var e = estringa.message.from.id;
  var SpreadSheet = SpreadsheetApp.openById("你的試算表ID");
  var Sheet = SpreadSheet.getSheetByName("收到的訊息");
  var LastRow = Sheet.getLastRow();
  Sheet.getRange(LastRow+1, 1).setValue(d);  
  Sheet.getRange(LastRow+1, 2).setValue(e);
  Sheet.getRange(LastRow+1, 3).setValue(estringa);
}

那還是稍微解釋一下程式碼。

第2行:在資料傳進來之後,我們將資料轉為JSON格式來解析。
第3行:取得現在的日期與時間。
第4行:取得傳訊息者的id
第5-10行:這邊開始的程式碼和之前的一樣,都是用來跟Google Sheet做連接。
第5行:取得試算表的ID。
第6行:取得要存入資料的工作表。
第7行:取得工作表的最後一行。
第8-10行:依序將時間還有機器人接收到的訊息存入試算表。

接著一樣部屬、授權,並使用setWebhook,將程式和機器人做連結。

好了之後試著對機器人傳送訊息,就可以看到剛剛送出的訊息囉。

不管是單獨的聊天室或是群組都會收到訊息記錄。

https://ithelp.ithome.com.tw/upload/images/20200928/20130283OpgDEHH421.png

可以注意到,在第五筆資料的第三行數據裡面,id的位置出現的是1.098175067E9,如果直接把這串數字用在我們之後的程式碼裡面,會找不到我們要的id。

為什麼會這樣呢?

其實原因很簡單,因為id較長,所以這串數字是以科學記號來表示的,顯示是1.10E+09,實際上我的id是1098175067。

所以大家看到id夾雜其他符號時不用太擔心,只要將得到的id轉換成科學記號,或是像我上面第4行一樣特別將id抓出來顯示就可以了。

不過這邊取得傳訊息者id第四行程式碼,我會建議當知道自己的ID後就可以不用加這行了,透過回傳回來JSON文件內的資料查看自己ID就好,因為在後面有可能會因為回傳的值沒有message_id而出錯,我就在這個地方遇到了好幾次問題。

如果你懶得寫程式來查看id,也可以在Telegram聯絡人搜尋@userinfobot這個機器人,找到之後按下start,他就會將你的id傳送給你囉。

https://ithelp.ithome.com.tw/upload/images/20200928/20130283wlDO5JkOiQ.png

講到這邊,我們已經把我們的後端跟機器人成功連接完了,下一篇會介紹JSON格式,看得懂JSON格式會對我們寫機器人有很大的幫助!


上一篇
Day 17-Telegram機器人基本設定
下一篇
Day 19-JSON格式
系列文
利用Google App Script 實作Telegram Bot30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
Charles Wang
iT邦新手 5 級 ‧ 2021-02-03 11:53:24

getUpdates:
這是一個最簡單獲得訊息的方法,只要輸入以下網址:
https://api.telegram.org/你的機器人token/getUpdates
便可以得到一個回傳的JSON陣列。

getupdates 那邊
網址token也要bot 開頭

所以應該為
https://api.telegram.org/bot你的機器人token/getUpdates

參考:
https://stackoverflow.com/questions/41172749/error-404-while-accessing-api-method-on-telegram-bot

toikusen iT邦新手 5 級 ‧ 2021-02-04 15:05:22 檢舉

感謝提醒!
我本來還以為是版本更新了,找了一下結果根本沒有。
後來才發現我下面的圖片上面網址token前面其實是有bot的。
寫文章時居然沒注意到有誤XD。

1
eric19740521
iT邦新手 1 級 ‧ 2021-02-26 11:35:23

網址輸入
https://api.telegram.org/bot1605353593:AAGLdPJ2BeqbzQD7A6X8VfwggQP3kCm0avY/getUpdates

它傳回是
{"ok":false,"error_code":401,"description":"Unauthorized"}

跟你的結果不一樣???

toikusen iT邦新手 5 級 ‧ 2021-02-26 13:46:35 檢舉

你先傳送隨便一則訊息給機器人。
之後再輸入getUpdates的網址試試看。
https://core.telegram.org/api/errors
官網的錯誤提示可以檢查一下有沒有問題。

可以了..
再一次用token測試
https://api.telegram.org/bot1616982482:AAEdiYqVdeanJx0q2oMW6ubQDa5yFw2MFiI/getUpdates
得到結果是
{"ok":true,"result":[]}

感謝

toikusen iT邦新手 5 級 ‧ 2021-02-26 22:51:31 檢舉

會這樣子主要原因是因為getUpdates使用long polling必須要定時執行才能獲取最新的messages。
有關long polling的詳細資料可以參考wiki的說明。
https://en.wikipedia.org/wiki/Push_technology#Long_polling

0
grace__71
iT邦新手 5 級 ‧ 2021-09-13 19:13:49

https://api.telegram.org/bot這邊放機器人的token /setWebhook?url=這邊放部屬完的url
請問[部屬完的url]是只要有重新部署程式碼就要換一次url的意思嗎

toikusen iT邦新手 5 級 ‧ 2021-09-15 00:22:45 檢舉

沒錯
只要有新增部屬的話url就會更換
所以如果寫完code發現有問題很有可能就是因為url沒有更換成最新版本的

我要留言

立即登入留言