在讓機器人能夠有智慧之前,我們要先知道Telegram提供的幾種API。
Telegram除了自己官方的API之外,另外還有提供許多種語言的API,如果說你對於其他語言熟悉的話,也可以嘗試使用不同語言的API,這邊筆者會以官方的API來實作。
官方API:
https://core.telegram.org/bots/api
官方的API有兩種獲取資料的方式,分別為getUpdates和setWebhook。'
getUpdates:
這是一個最簡單獲得訊息的方法,隨便輸入任何一則訊息給機器人後,接著輸入以下網址:
https://api.telegram.org/bot你的機器人token/getUpdates
便可以得到一個回傳的JSON陣列。
運行過程大致上是:當我們發送一個指令過去,想確認有沒有新的指令進來,如果有的話,便會回覆。
這個方法是我們主動跟 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,看到以下畫面就代表你的後端已經和機器人連接囉。
在接下來的實作,主要會以Webhook的使用為主。
接著要介紹一個非常重要的功能,也就是儲存我們機器人接受的到資料(其他用戶傳送給機器人的訊息)。
為什麼要做這個功能呢?原因很簡單,我們可以分析接受到的訊息,來針對特定的訊息做回覆!正因為這樣,所以我們必須要將傳送進來的資料儲存下來。
方法和我們之前第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,將程式和機器人做連結。
好了之後試著對機器人傳送訊息,就可以看到剛剛送出的訊息囉。
不管是單獨的聊天室或是群組都會收到訊息記錄。
可以注意到,在第五筆資料的第三行數據裡面,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傳送給你囉。
講到這邊,我們已經把我們的後端跟機器人成功連接完了,下一篇會介紹JSON格式,看得懂JSON格式會對我們寫機器人有很大的幫助!
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
感謝提醒!
我本來還以為是版本更新了,找了一下結果根本沒有。
後來才發現我下面的圖片上面網址token前面其實是有bot的。
寫文章時居然沒注意到有誤XD。
網址輸入
https://api.telegram.org/bot1605353593:AAGLdPJ2BeqbzQD7A6X8VfwggQP3kCm0avY/getUpdates
它傳回是
{"ok":false,"error_code":401,"description":"Unauthorized"}
跟你的結果不一樣???
你先傳送隨便一則訊息給機器人。
之後再輸入getUpdates的網址試試看。
https://core.telegram.org/api/errors
官網的錯誤提示可以檢查一下有沒有問題。
可以了..
再一次用token測試
https://api.telegram.org/bot1616982482:AAEdiYqVdeanJx0q2oMW6ubQDa5yFw2MFiI/getUpdates
得到結果是
{"ok":true,"result":[]}
感謝
會這樣子主要原因是因為getUpdates使用long polling必須要定時執行才能獲取最新的messages。
有關long polling的詳細資料可以參考wiki的說明。
https://en.wikipedia.org/wiki/Push_technology#Long_polling
https://api.telegram.org/bot這邊放機器人的token /setWebhook?url=這邊放部屬完的url
請問[部屬完的url]是只要有重新部署程式碼就要換一次url的意思嗎
沒錯
只要有新增部屬的話url就會更換
所以如果寫完code發現有問題很有可能就是因為url沒有更換成最新版本的