今天要來說的是 Telegram Bot 的又一特殊功能 ReplyKeyboard 。
ReplyKeyboard 跟 Line Bot 的 RichMenu 有點相似,都是處於螢幕下方文字輸入欄位那邊,稍微有點不一樣的是它可以比較自由的設定,我們可以在程式中動態的去指定 ReplyKeyboard 的樣式,不像 RichMenu 需要先設定並且只有固定樣式。
用文字有點體會不出來究竟是如何對吧(還是我中文問題?),因此我們就來實際操作一次看看吧。
我們先去 BotFather 多註冊兩個指令,一個是 show
另一個是 hide
描述就先隨便打,記得加上上次註冊的指令跟描述,否則上次註冊的指令會消失。
接著我們就可以來實作一下。
import os
import logging
from telegram import Update
from telegram import (ReplyKeyboardMarkup, KeyboardButton,
ReplyKeyboardRemove) # New
from telegram.ext import Updater
from telegram.ext import (CallbackContext, Filters, MessageHandler,
CommandHandler)
''' Get envrion param '''
TOKEN = os.environ["TOKEN"]
''' logging '''
logging.basicConfig(
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
level=logging.DEBUG)
logger = logging.getLogger(__name__)
''' Bot init '''
updater = Updater(token=TOKEN)
dispatcher = updater.dispatcher
# 訊息回復方式
def echo(update: Update, context: CallbackContext):
update.message.reply_text(text=update.message.text)
# 指令回復方式
def start(update: Update, context: CallbackContext):
context.bot.send_message(
chat_id=update.message.chat.id, text="Hello")
def get_id(update: Update, context: CallbackContext):
context.bot.send_message(
chat_id=update.message.chat.id, text=update.message.from_user.id)
def show(update: Update, context: CallbackContext): # New
update.message.reply_text(
text="Show menu",
reply_markup=ReplyKeyboardMarkup([
["1", "2", "3"],
[KeyboardButton("4"), KeyboardButton("/start")]],
resize_keyboard=True, one_time_keyboard=True))
def hide(update: Update, context: CallbackContext): # New
update.message.reply_text(
text="Hide menu",
reply_markup=ReplyKeyboardRemove(True))
# 註冊訊息回復方式
updater.dispatcher.add_handler(MessageHandler(
filters=(Filters.text), callback=message_handler))
# 註冊指令回復方式
updater.dispatcher.add_handler(
CommandHandler("start", callback=start)) # New
updater.dispatcher.add_handler(
CommandHandler("get_id", callback=get_id)) # New
updater.dispatcher.add_handler(
CommandHandler("show", callback=show)) # New
updater.dispatcher.add_handler(
CommandHandler("hide", callback=hide)) # New
# 開始長輪詢
if __name__ == "__main__":
updater.start_polling()
updater.idle()
updater.stop()
接著就可以啟動長輪詢,然後使用 show
指令,我們的 ReplyKeyboard 就出現了,並且按下任意按鍵就會回傳按鍵對應的文字(恩, ReplyKeyboard 就只有文字,而且按鍵上是什麼文字,就會回傳什麼文字,指令也算文字的一種)。
接著我們再使用 hide
指令,就可以讓 ReplyKeyboard 消失了。
而且配置上也很方便,假設我們資料數量不一定,我們可以在每次生出 ReplyKeyboard 自動的產生對應的鍵盤,就不需要像 RichMenu 一樣需要先設定好各種情況對應的鍵盤了。
那麼就先到這邊,各位可以玩玩看 ReplyKeyboard ,個人覺得還蠻好用,缺點應該就是不能設定美美的背景吧。
大家掰~掰~