Python Telegram Bot InlineKeyboard:要求用户确认
Python Telegram Bot InlineKeyboard : ask for user confirmation
用户使用内联键盘与我的 Telegram 机器人交互。有些按钮执行敏感的功能,我想在继续之前询问用户的确认。
例如:在主菜单中,用户在 Option 1
和 Option 2
两个按钮之间进行选择。如果点击,则分别执行敏感函数do_action_1
和do_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 1
或 Option 2
后插入一个中间步骤,显示键盘“您确定吗?”有两个按钮 Yes
和 No
。单击 Yes
会根据用户在前一个键盘上的选择执行 do_action_1
或 do_action_2
。单击 No
将使用户返回主菜单。
我该怎么做?
您可以显示带有 YES 和 NO 选项的键盘,并像处理其他按钮的输入一样处理输入。要跟踪用户按下 YES 时要执行的操作,您可以在 callback_data
中对该操作进行编码或将其临时存储。另请参阅此维基页面 Storing Data
.
免责声明:我目前是 python-telegram-bot
的维护者
感谢@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_1
和 do_action_2
之前请求用户确认。非常感谢!
用户使用内联键盘与我的 Telegram 机器人交互。有些按钮执行敏感的功能,我想在继续之前询问用户的确认。
例如:在主菜单中,用户在 Option 1
和 Option 2
两个按钮之间进行选择。如果点击,则分别执行敏感函数do_action_1
和do_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 1
或 Option 2
后插入一个中间步骤,显示键盘“您确定吗?”有两个按钮 Yes
和 No
。单击 Yes
会根据用户在前一个键盘上的选择执行 do_action_1
或 do_action_2
。单击 No
将使用户返回主菜单。
我该怎么做?
您可以显示带有 YES 和 NO 选项的键盘,并像处理其他按钮的输入一样处理输入。要跟踪用户按下 YES 时要执行的操作,您可以在 callback_data
中对该操作进行编码或将其临时存储。另请参阅此维基页面 Storing Data
.
免责声明:我目前是 python-telegram-bot
感谢@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_1
和 do_action_2
之前请求用户确认。非常感谢!