iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0
DevOps

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

Day 22 CommandHandler

  • 分享至 

  • xImage
  •  

今天我們要來講 Telegram Bot 的特色功能 Command 。

Command 就是類似文字訊息,但是需要先跟 Botfather 註冊,並且為 / 開頭,通常是少數比較常用的指令。

因此我們就先到 Botfather 輸入 /mybots ,接著選擇你的 Bot ,然後選擇 Edit Bot -> Edit Commands ,就可以編輯你的 Command 了,輸入如以下格式就可以新增 Command 。

# command - help

# 範例 (新增2個指令)
start - Say hello
get_id - get my id

輸入完後,我們就可以回去我們 Bot 的聊天室,可以看到左下角多了一個選單,點開後就是我們剛剛設定的 Command 。

接著我們就可以註冊我們指令的處理函式,方法跟前面的訊息一樣,不過加入處裡函式時要改成 CommandHandler ,並且指定處裡哪個 Command 。

import json
import os
import logging

from telegram import Update
from telegram.ext import Updater, Filters, CallbackContext
from telegram.ext import MessageHandler, CommandHandler


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 start(update: Update, context: CallbackContext):  # New
    context.bot.send_message(
        chat_id=update.message.chat.id, text="Hello")


def get_id(update: Update, context: CallbackContext):  # New
    context.bot.send_message(
        chat_id=update.message.chat.id, text=update.message.from_user.id)


updater = Updater(os.environ["TOKEN"])
updater.dispatcher.add_handler(
    CommandHandler("start", callback=start))  # New
updater.dispatcher.add_handler(
    CommandHandler("get_id", callback=get_id))  # New
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()

接著我們就可以執行起來,然後對著聊天室發出指令,就可以看到相應的回覆了。

那麼就先到這邊, Command 是 Telegram Bot 的特色功能,個人覺得使用起來也非常方便。

大家掰~掰~


上一篇
Day 21 Image, Video, Audio & File
下一篇
Day 23 ReplyKeyboard
系列文
30天的社群機器人之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言