多个回调查询处理程序?
Multiple callback query handlers?
python-telegram-bot 包装器是否可以使用多个回调查询处理程序?
我想要多个唯一的处理程序,但据我所知,只能有一个。这意味着我必须根据启动消息文本显示哪些内联键盘。
有什么我遗漏的吗?
您可以为此使用 ConversationHandler 包装器。检查下面的代码:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, ConversationHandler
TELEGRAM_HTTP_API_TOKEN = 'PASTE_TELEGRAM_HTTP_API_TOKEN'
FIRST, SECOND = range(2)
def start(bot, update):
keyboard = [
[InlineKeyboardButton(u"Next", callback_data=str(FIRST))]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(
u"Start handler, Press next",
reply_markup=reply_markup
)
return FIRST
def first(bot, update):
query = update.callback_query
keyboard = [
[InlineKeyboardButton(u"Next", callback_data=str(SECOND))]
]
reply_markup = InlineKeyboardMarkup(keyboard)
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"First CallbackQueryHandler, Press next"
)
reply_markup = InlineKeyboardMarkup(keyboard)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
return SECOND
def second(bot, update):
query = update.callback_query
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Second CallbackQueryHandler"
)
return
updater = Updater(TELEGRAM_HTTP_API_TOKEN)
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST: [CallbackQueryHandler(first)],
SECOND: [CallbackQueryHandler(second)]
},
fallbacks=[CommandHandler('start', start)]
)
updater.dispatcher.add_handler(conv_handler)
updater.start_polling()
updater.idle()
您可以使用 CallbackQueryHandler pattern 参数。用于测试 telegram.CallbackQuery.data 的正则表达式模式。
def motd(bot, update):
motd_keyboard = [[InlineKeyboardButton('I agree',
callback_data='motd_callback_button')]]
motd_markup = InlineKeyboardMarkup(motd_keyboard)
update.message.reply_text('Message of the day',
reply_markup=motd_markup)
def motd_callback_button(bot, update):
pass
def main():
dp = DjangoTelegramBot.dispatcher
dp.add_handler(CallbackQueryHandler(motd_callback_button,
pattern='^motd_callback_button$'))
python-telegram-bot 包装器是否可以使用多个回调查询处理程序?
我想要多个唯一的处理程序,但据我所知,只能有一个。这意味着我必须根据启动消息文本显示哪些内联键盘。
有什么我遗漏的吗?
您可以为此使用 ConversationHandler 包装器。检查下面的代码:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import Updater, CommandHandler, CallbackQueryHandler, ConversationHandler
TELEGRAM_HTTP_API_TOKEN = 'PASTE_TELEGRAM_HTTP_API_TOKEN'
FIRST, SECOND = range(2)
def start(bot, update):
keyboard = [
[InlineKeyboardButton(u"Next", callback_data=str(FIRST))]
]
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(
u"Start handler, Press next",
reply_markup=reply_markup
)
return FIRST
def first(bot, update):
query = update.callback_query
keyboard = [
[InlineKeyboardButton(u"Next", callback_data=str(SECOND))]
]
reply_markup = InlineKeyboardMarkup(keyboard)
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"First CallbackQueryHandler, Press next"
)
reply_markup = InlineKeyboardMarkup(keyboard)
bot.edit_message_reply_markup(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
reply_markup=reply_markup
)
return SECOND
def second(bot, update):
query = update.callback_query
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text=u"Second CallbackQueryHandler"
)
return
updater = Updater(TELEGRAM_HTTP_API_TOKEN)
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST: [CallbackQueryHandler(first)],
SECOND: [CallbackQueryHandler(second)]
},
fallbacks=[CommandHandler('start', start)]
)
updater.dispatcher.add_handler(conv_handler)
updater.start_polling()
updater.idle()
您可以使用 CallbackQueryHandler pattern 参数。用于测试 telegram.CallbackQuery.data 的正则表达式模式。
def motd(bot, update):
motd_keyboard = [[InlineKeyboardButton('I agree',
callback_data='motd_callback_button')]]
motd_markup = InlineKeyboardMarkup(motd_keyboard)
update.message.reply_text('Message of the day',
reply_markup=motd_markup)
def motd_callback_button(bot, update):
pass
def main():
dp = DjangoTelegramBot.dispatcher
dp.add_handler(CallbackQueryHandler(motd_callback_button,
pattern='^motd_callback_button$'))