iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
DevOps

30天的社群機器人之旅系列 第 21

Day 21 Image, Video, Audio & File

  • 分享至 

  • xImage
  •  

昨天講完了文字訊息的處理,今天要來接著說圖片、影片、音訊及檔案的處理方式了,方法跟 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 的特色功能了。

大家掰~掰~


上一篇
Day 20 MessageHandler
下一篇
Day 22 CommandHandler
系列文
30天的社群機器人之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言