昨天講完了文字訊息的處理,今天要來接著說圖片、影片、音訊及檔案的處理方式了,方法跟 Line Bot 大同小異,不過 Telegram Bot 在這部分還是有不少細節要注意的。
首先是 Telegram 傳送圖片、影片及音訊的方式有兩種(各位不知道了吧),就以圖片來說,最基本的方式就是點擊右下角的迴紋針之後選擇圖片傳送出去,因此我們就先來處理這種方式的圖片吧。
import json
import os
import logging
from telegram import Update
from telegram.ext import Updater, Filters, CallbackContext
from telegram.ext import MessageHandler
logging.basicConfig(level=logging.DEBUG)
def message_handler(update: Update, context: CallbackContext):
with open("update.json", 'r', encoding="UTF-8") as fp:
data = json.load(fp)
data.append(update.to_dict())
with open("update.json", 'w', encoding="UTF-8") as fp:
json.dump(data, fp, ensure_ascii=False, indent=4)
context.bot.send_message(
chat_id=update.message.chat.id, text=update.message.text)
def photo_handler(update: Update, context: CallbackContext):
os.makedirs("Media/Image", exist_ok=True)
img = update.message.photo[-1]
context.bot.get_file(file_id=img.file_id).download(
f"Media/Image/{img.file_unique_id}.jpg")
context.bot.send_message(
chat_id=update.message.chat.id, text="Image receive")
def video_handler(update: Update, context: CallbackContext):
os.makedirs("Media/Video", exist_ok=True)
video = update.message.video
context.bot.get_file(file_id=video.file_id).download(
f'Media/Video/{video.file_unique_id}.{video.mime_type.split("/")[1]}')
context.bot.send_message(
chat_id=update.message.chat.id, text="Video receive")
def audio_handler(update: Update, context: CallbackContext):
os.makedirs("Media/Audio", exist_ok=True)
audio = update.message.audio
context.bot.get_file(file_id=audio.file_id).download(
f'Media/Audio/{audio.file_unique_id}.{audio.mime_type.split("/")[1]}')
context.bot.send_message(
chat_id=update.message.chat.id, text="Audio receive")
updater = Updater(os.environ["TOKEN"])
updater.dispatcher.add_handler(MessageHandler(filters=Filters.text, callback=message_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.photo, callback=photo_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.video, callback=video_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.audio, callback=audio_handler))
if __name__ == "__main__":
updater.start_polling()
updater.idle()
updater.stop()
基本上跟 Line Bot 的操作是相同的,同樣需要透過 id 去取得檔案,不過在 Telegram 傳送圖片時, Telegram 會自動降低畫質,並生出多張不同解析度的圖片,以適應各種不同環境。
但是如果希望送出的圖片不要降低畫質,例如你想要送出 這種圖片 之類的,那你可以考慮第二種方式來傳送你的圖片。
第二種方式簡單講就是用檔案的方式傳送出去,傳送方式為點擊右下角的迴紋針之後先選擇檔案,之後再選擇需要的圖片、影片或音訊傳送出去,這樣就不會降低畫質了(這也是我把檔案處裡放這邊的原因),這樣我們就可以將我們的設計圖或是檔案傳送出去,使用這種方式傳送的圖片、影片及音訊的處理方式就跟之前很不相同,基本上是按照檔案的思路在處裡,因此我們可以這樣處理檔案。
import json
import os
import logging
from telegram import Update
from telegram.ext import Updater, Filters, CallbackContext
from telegram.ext import MessageHandler
logging.basicConfig(level=logging.DEBUG)
def message_handler(update: Update, context: CallbackContext):
with open("update.json", 'r', encoding="UTF-8") as fp:
data = json.load(fp)
data.append(update.to_dict())
with open("update.json", 'w', encoding="UTF-8") as fp:
json.dump(data, fp, ensure_ascii=False, indent=4)
context.bot.send_message(
chat_id=update.message.chat.id, text=update.message.text)
def photo_handler(update: Update, context: CallbackContext):
file_index = None
file_size = 0
for index, img in enumerate(update.message.photo):
if img.file_size > file_size:
file_index = index
os.makedirs("Media/Image", exist_ok=True)
img = update.message.photo[file_index]
context.bot.get_file(file_id=img.file_id).download(
f"Media/Image/{img.file_unique_id}.jpg")
context.bot.send_message(
chat_id=update.message.chat.id, text="Image receive")
def video_handler(update: Update, context: CallbackContext):
os.makedirs("Media/Video", exist_ok=True)
video = update.message.video
context.bot.get_file(file_id=video.file_id).download(
f'Media/Video/{video.file_unique_id}.{video.mime_type.split("/")[1]}')
context.bot.send_message(
chat_id=update.message.chat.id, text="Video receive")
def audio_handler(update: Update, context: CallbackContext):
os.makedirs("Media/Audio", exist_ok=True)
audio = update.message.audio
context.bot.get_file(file_id=audio.file_id).download(
f'Media/Audio/{audio.file_unique_id}.{audio.mime_type.split("/")[1]}')
context.bot.send_message(
chat_id=update.message.chat.id, text="Audio receive")
def document_handler(update: Update, context: CallbackContext):
os.makedirs("Media/Document", exist_ok=True)
img = update.message.document
context.bot.get_file(file_id=img.file_id).download(
f"Media/Document/{img.file_name}")
context.bot.send_message(
chat_id=update.message.chat.id, text="Document receive")
def get_user_id(update: Update, context: CallbackContext):
context.bot.send_message(
chat_id=update.message.chat.id, text=update.message.from_user.id)
def get_chat_id(update: Update, context: CallbackContext):
context.bot.send_message(
chat_id=update.message.chat.id, text=update.message.chat.id)
updater = Updater(os.environ["TOKEN"])
updater.dispatcher.add_handler(MessageHandler(filters=(Filters.text), callback=message_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.photo, callback=photo_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.video, callback=video_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.audio, callback=audio_handler))
updater.dispatcher.add_handler(MessageHandler(filters=Filters.document, callback=document_handler))
if __name__ == "__main__":
updater.start_polling()
updater.idle()
updater.stop()
處理方式跟 Line Bot 基本上也都相同,這種方式的好處就是不會被壓縮,而且各種檔案皆適用,因此相當推薦(不過如果是那種每一 Byte 都要算錢的流量的話就最好考慮一下用什麼方式傳送)。
那麼就先到這邊,基本的訊息大概都會處理了,明天我們就要來接觸到 Telegram Bot 的特色功能了。
大家掰~掰~