iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
DevOps

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

Day 23 ReplyKeyboard

  • 分享至 

  • xImage
  •  

今天要來說的是 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 ,個人覺得還蠻好用,缺點應該就是不能設定美美的背景吧。

大家掰~掰~


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

尚未有邦友留言

立即登入留言