Telegram Bot機器人取得Webhook後的檔案型資訊
Telegram Bot機器人在Webhook時期傳入的東西不只是文字而已,而是幾乎現代流行的多媒體資料都可以被送進來讓你的機器人擷取,美中不足的有下列幾點原因,需要撰寫程式的人稍微注意一下。
Telegram Bot機器人擷取資料的限制與缺點(20200320版本;未來會不會調整請自己看官網API文件)
- 可以獲取檔案,但最大只給你下載20MB內的檔案。
- 可以獲取照片,但只會給你一堆以JSON Array表示的縮圖資料,其中最大的縮圖只給你1280*720格式的相片。(這是我自己測試出來的結論,官方API沒有陳述)
- 可以獲取所有使用者傳送的多媒體資料格式,但每一種多媒體資料格式的JSON表示式都不盡相同,如果你要自己寫解析+強型別的話,我敢說你光定義資料型態你就會暴怒了,或許用人家寫好的類別會好上許多。
- 堅持想要自己做的話,強烈建議走匿名型別或動態型別。(例如C#的System.Dynamic.ExpandoObject)
如何得知Webhool回傳的資料型態?
開發環境在Localhost且有VisualStudio支援者,請考慮使用ngrok來幫你proxy一下傳入資料,這樣你就可以動態解譯觀察傳入的JSON了。(可參考:利用ngrok在localhost測試https Webhook)
如果沒有相關的環境,建議可以加入一隻熱心網友提供的機器人,請搜尋:「@RawDataBot」,基本上你對這支BOT發送的任何訊息,他就會把他那邊GET到的JSON原封不動的送回來給你,你就可以藉機觀察這個訊息的JSON格式了。
Telegram目前支援的多媒體檔案格式
這是我自己整理的已知多媒體檔案格式,這些格式大都可以透過使用者的手機介面直接產生上傳到群組、聊天室中,也就是可以被BOT看到及處理的資訊。當然啦,這些多媒體的類型在往後的時間裡一定會被新增或調整的,所以屆時就請你自行調整知識了。
- text(文字訊息)
- photo(照片)
- video(影片)
- document(檔案文件)
- sticker(貼圖)
- voice(影片)
- location(地理位置)
- video_note(影片備忘錄;短片)
如何下載Telegram多媒體型態JSON回傳的實體檔案?
這裡要教大家的是如何透過BOT取得檔案、照片、貼圖的程序,基本上就是依靠file_id這個屬性,由於上面提過,Telegram所有多媒體資料回傳JSON的都不盡相同,我這邊只好舉例最常使用到的一般檔案來進行展示就好,其他的多媒體資料可以自行舉一反三即可。
Step 1. 查看BOT取得檔案型態JSON格式的返回值:
{
"update_id":0806449,
"message":{
"message_id":978,
"from":{
"id":5201314,
"is_bot":false,
"first_name":"OOO",
"username":"XXX",
"language_code":"zh-hans"
},
"chat":{
"id":5201314,
"first_name":"OOO",
"username":"XXX",
"type":"private"
},
"date":7878978,
"document":{
"file_name":"Test.xlsx",
"mime_type":"application/octet-stream",
"file_id":"ThisIsARandomSerialNumber", ← important!
"file_unique_id":"WhoCares",
"file_size":65535
},
"caption":"這是一個EXCEL檔案範例"
}
}
大家要注意上面這一段JSON最重要的就是「message.document.file_id」,他基本上就是一串無意義的亂數,以上面為例我將其數值取為「ThisIsARandomSerialNumber」,其餘的資訊我想你應該不會看不懂吧!
Step 2. 透過GET方法,將上面的file_id放入之中,例如:
//註:花括號{}僅為醒目用途,實際上不需要打上喔!
https://api.telegram.org/bot{YourBotAccessToken}/getFile?file_id={ThisIsARandomSerialNumber}
Step 3. 如果一切無誤,Telegram會回應給你類似下面的JSON字串:
{
"ok": true,
"result": {
"file_id": "ThisIsARandomSerialNumber",
"file_unique_id": "WhoCares",
"file_size": 65535,
"file_path": "documents/file_0.xlsx" ← important!
}
}
在這個JSON回覆資料中,最重要的就是「file_path」屬性的值,以上例來說就是「documents/file_0.xlsx」。
Step 4. 接著請把「file_path」做一下URL Encode,接著用Telegram提供的檔案下載API,利用GET方法去下指令即可。
//註:花括號{}僅為醒目用途,實際上不需要打上喔!
https://api.telegram.org/file/bot{YourBotAccessToken}/{documents%2Ffile_0.xlsx}
執行下去就會看到你的瀏覽器彈出下載了,而這個檔案就是你剛才上傳且被BOT看到的檔案。