iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
DevOps

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

Day 24 InlineKeyboard

  • 分享至 

  • xImage
  •  

昨天講完了比較簡單的 ReplyKeyboard ,今天要來介紹的是比較進階的 InlineKeyboard 。

不知道各位有沒有注意到,我們在 BotFather 調整機器人相關設定的時候,他的按鍵都是跟在對話框底下的呢?跟我們昨天介紹的 ReplyKeyboard 還是相當不同的,而且就算按了很多下也不會像 Line Bot 的 FlexMessage 一直噴出新對話,聊天室相較起來更加簡潔;支援的操作較多,除了基本的文字,還可以超連結、授權登入、遊戲甚至是支付;而且還可以做到切換的效果,優點還是不少的。

那我們要如何建立這樣的 Keyboard 呢?

回傳的方法跟前面的 ReplyKeyboard 基本上一樣,就只有 Keyboard 的建立方法不太一樣,那就讓我們來看看如何使用吧!

import os
import logging

from telegram import Update
from telegram import (ReplyKeyboardMarkup, KeyboardButton,
                      ReplyKeyboardRemove)  # New
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
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


# 建立 InlineKeyboard
keyboard_1 = InlineKeyboardMarkup([
    [
        InlineKeyboardButton(
            "Youtube", url="http://youtube.com/"),
        InlineKeyboardButton(
            "Facebook", url="https://www.facebook.com/")
    ], [
        InlineKeyboardButton("A", callback_data="a"),
        InlineKeyboardButton("B", callback_data="b")
    ]
])


# 訊息回復方式
def echo(update: Update, context: CallbackContext):
    # 加入 InlineKeyboard
    update.message.reply_text(
        text=update.message.text, reply_markup=keyboard_1)


# 指令回復方式
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):
    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):
    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))
updater.dispatcher.add_handler(
    CommandHandler("get_id", callback=get_id))
updater.dispatcher.add_handler(
    CommandHandler("show", callback=show))
updater.dispatcher.add_handler(
    CommandHandler("hide", callback=hide))


# 開始長輪詢
if __name__ == "__main__":
    updater.start_polling()
    updater.idle()
    updater.stop()

這樣機器人在回覆訊息時就會自動帶上 InlineKeyboard 了,而且 Url 也都可以自動跳轉到我們想要的路徑了。

但是其中兩個單純的 callback_data 按了之後並沒有動作怎麼辦,不用擔心,明天會介紹如何處裡。

那麼就先到這邊,各位可以先設計出自己想要的鍵盤出來,明天會介紹如何進行處理。

大家掰~掰~


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

尚未有邦友留言

立即登入留言