【问题标题】:Python Telegram Bot InlineKeyboard : ask for user confirmationPython Telegram Bot InlineKeyboard:要求用户确认
【发布时间】:2021-12-08 23:37:08
【问题描述】:

用户使用内联键盘与我的 Telegram 机器人交互。一些按钮执行敏感的功能,我想在继续之前询问用户的确认。

例如:在主菜单中,用户在两个按钮Option 1Option 2 之间进行选择。点击后分别执行敏感函数do_action_1do_action_2

一个最小的工作示例如下:

from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, CallbackContext


def start(update: Update, context: CallbackContext) -> None:
     update.message.reply_text('Please choose:',
                              reply_markup = keyboard_main_menu())


def main_menu(update: Update, context: CallbackContext) -> None:
    """ Displays the main menu keyboard when called. """

    query = update.callback_query
    query.answer()
    query.edit_message_text(text         = 'Please choose an option:',
                            reply_markup = keyboard_main_menu())


def keyboard_main_menu():
    """ Creates the main menu keyboard """

    keyboard = [
        [InlineKeyboardButton("Option 1", callback_data='1'),
         InlineKeyboardButton("Option 2", callback_data='2'),],
    ]

    return InlineKeyboardMarkup(keyboard)


def do_action_1(update: Update, context: CallbackContext) -> None:

    keyboard = [[InlineKeyboardButton("Main menu", callback_data='main')]]
    reply_markup = InlineKeyboardMarkup(keyboard)

    query = update.callback_query
    query.answer()
    query.edit_message_text(text=f"Selected option {query.data}\n"
                                 f"Executed action 1.",
                            reply_markup=reply_markup)


def do_action_2(update: Update, context: CallbackContext) -> None:

    keyboard = [[InlineKeyboardButton("Main menu", callback_data='main')]]
    reply_markup = InlineKeyboardMarkup(keyboard)

    query = update.callback_query
    query.answer()
    query.edit_message_text(text=f"Selected option {query.data}\n"
                                 f"Executed action 2.",
                            reply_markup=reply_markup)


def main() -> None:
    """Run the bot."""

    updater = Updater("TOKEN")

    updater.dispatcher.add_handler(CommandHandler('start', start))
    updater.dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern='main'))
    updater.dispatcher.add_handler(CallbackQueryHandler(do_action_1, pattern='1'))
    updater.dispatcher.add_handler(CallbackQueryHandler(do_action_2, pattern='2'))

    # Start the Bot
    updater.start_polling()
    print('started')


if __name__ == '__main__':
    main()

现在,我想在单击Option 1Option 2 后插入一个中间步骤,显示键盘“Are you sure ?”有两个按钮 YesNo。单击Yes 会根据用户在前一个键盘上的选择执行do_action_1do_action_2。单击No 将使用户返回主菜单。

我该怎么做?

【问题讨论】:

    标签: python python-telegram-bot


    【解决方案1】:

    您可以显示带有 YES 和 NO 选项的键盘,并像处理其他按钮的输入一样处理输入。要跟踪用户按下 YES 时要执行的操作,您可以在 callback_data 中对该操作进行编码或临时存储它。另请参阅此 wiki 页面Storing Data


    免责声明:我目前是python-telegram-bot的维护者

    【讨论】:

    • 能否分享一个 mwe 用于将操作编码到callback_data 中?
    • 我的意思是,您将第一步的callback_data 作为“是/否”问题的callback_data 的一部分传递。类似callback_data = f'YES {query.data}'
    • 谢谢我设法让它工作
    【解决方案2】:

    感谢@CallMeStag 的回答,我设法得到了一个mwe:

    from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update
    from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, CallbackContext
    
    
    def start(update: Update, context: CallbackContext) -> None:
        """Sends a message with three inline buttons attached."""
    
        update.message.reply_text('Please choose:',
                                  reply_markup = keyboard_main_menu())
    
    
    def main_menu(update: Update, context: CallbackContext) -> None:
        """ Displays the main menu keyboard when called. """
    
        query = update.callback_query
        query.answer()
        query.edit_message_text(text         = 'Please choose:',
                                reply_markup = keyboard_main_menu())
    
    
    def keyboard_main_menu():
        """ Creates the main menu keyboard """
    
        keyboard = [
            [InlineKeyboardButton("Option 1", callback_data='1'),
             InlineKeyboardButton("Option 2", callback_data='2'),],
        ]
    
        return InlineKeyboardMarkup(keyboard)
    
    
    def confirm(update: Update, context: CallbackContext) -> None:
        """Parses the CallbackQuery and updates the message text."""
    
        query = update.callback_query
        query.answer()
    
        keyboard = [
            [InlineKeyboardButton("Yes", callback_data=f'YES{query.data}'),
             InlineKeyboardButton("No",  callback_data='main'),],
        ]
    
        reply_markup = InlineKeyboardMarkup(keyboard)
    
        query.edit_message_text(text=f"Selected option {query.data}."
                                     f"Are you sure ? ",
                                reply_markup=reply_markup)
    
    
    def do_action_1(update: Update, context: CallbackContext) -> None:
    
        keyboard = [[InlineKeyboardButton("Main menu", callback_data='main')]]
        reply_markup = InlineKeyboardMarkup(keyboard)
    
        query = update.callback_query
        query.answer()
        query.edit_message_text(text=f"Selected option {query.data}\n"
                                     f"Executed action 1.",
                                reply_markup=reply_markup)
    
    
    def do_action_2(update: Update, context: CallbackContext) -> None:
    
        keyboard = [[InlineKeyboardButton("Main menu", callback_data='main')]]
        reply_markup = InlineKeyboardMarkup(keyboard)
    
        query = update.callback_query
        query.answer()
        query.edit_message_text(text=f"Selected option {query.data}\n"
                                     f"Executed action 2.",
                                reply_markup=reply_markup)
    
    
    def main() -> None:
        """Run the bot."""
        # Create the Updater and pass it your bot's token.
        updater = Updater("TOKEN")
    
        updater.dispatcher.add_handler(CommandHandler('start', start))
        updater.dispatcher.add_handler(CallbackQueryHandler(main_menu, pattern='main'))
        updater.dispatcher.add_handler(CallbackQueryHandler(confirm, pattern='^(|1|2)$'))
        updater.dispatcher.add_handler(CallbackQueryHandler(do_action_1, pattern='YES1'))
        updater.dispatcher.add_handler(CallbackQueryHandler(do_action_2, pattern='YES2'))
    
    
        # Start the Bot
        updater.start_polling()
        print('started')
    
    if __name__ == '__main__':
        main()
    
    

    机器人现在在执行do_action_1do_action_2 之前正确地要求用户确认。非常感谢!

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-22
      • 2018-07-28
      相关资源
      最近更新 更多