今天我們要來講 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 的特色功能,個人覺得使用起來也非常方便。
大家掰~掰~