gpt4 book ai didi

python - Telegram 对话机器人中后退按钮实现的最佳实践

转载 作者:行者123 更新时间:2023-12-05 07:34:45 25 4
gpt4 key购买 nike

我正在尝试使用 python-telegram-bot 包创建 Telegram 对话机器人,我想知道为每个状态实现“返回主菜单”按钮的最佳实践是什么对话。

出于某种原因,我觉得我做错了。返回主菜单按钮实际上除了绘制应该立即显示的主菜单按钮外什么都不做,但它通常仍然需要 0.5-3 秒,有时甚至更长(一次只有一个用户与机器人交谈)。

我基本上为每个状态使用 CallbackQueryHandler(back_to_main_menu, pattern='^main_menu$') ,我很确定这不是正确的方法,尽管我找不到到目前为止任何其他更好的解决方案。

注意:下面的例子只是我如何使用CallbackQueryHandler 的一个小例子。我的状态机有 13 个状态,其中 10 个有返回主菜单按钮。

我需要的一个简短示例:

import os
from telegram.ext import Updater, ConversationHandler, CommandHandler, CallbackQueryHandler
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardRemove


FIRST, SECOND, MAIN_MENU = range(3)


def get_main_menu():
return [[InlineKeyboardButton("First", callback_data='first')],
[InlineKeyboardButton("Second", callback_data='second')]]


def add_main_menu_button(bot, update, message, menu):
query = update.callback_query
menu.append([InlineKeyboardButton("Back to main menu", callback_data="main_menu")])
reply_markup = InlineKeyboardMarkup(menu)

bot.edit_message_text(message, chat_id=query.message.chat_id, message_id=query.message.message_id,
reply_markup=reply_markup)


def back_to_main_menu(bot, update):
query = update.callback_query
reply_markup = InlineKeyboardMarkup(get_main_menu())
bot.edit_message_text("Example example 2", chat_id=query.message.chat_id, message_id=query.message.message_id, reply_markup=reply_markup)

return MAIN_MENU


def second(bot, update):
add_main_menu_button(bot, update, "E e", list())


def first(bot, update):
add_main_menu_button(bot, update, "T t", list())


def start(bot, update):
reply_markup = InlineKeyboardMarkup(get_main_menu())
update.message.reply_text("Example example 1", reply_markup=reply_markup)

return MAIN_MENU


def cancel(bot, update):
update.message.reply_text('Bye! I hope we can talk again some day.', reply_markup=ReplyKeyboardRemove())

return ConversationHandler.END


def main():
updater = Updater(os.environ["BOT_TOKEN"])

conversation_handler = ConversationHandler(entry_points=[CommandHandler('start', start)],

states={FIRST: [CallbackQueryHandler(back_to_main_menu, pattern='^main_menu$')],
SECOND: [CallbackQueryHandler(back_to_main_menu, pattern='^main_menu$')],
MAIN_MENU: [CallbackQueryHandler(first, pattern='first'),
CallbackQueryHandler(second)]},

fallbacks=[CommandHandler('cancel', cancel)],
allow_reentry=True
)

updater.dispatcher.add_handler(conversation_handler)

updater.start_polling()
updater.idle()

此外,当我在对话中使用多个 CallbackQueryHandler 时,我收到以下警告:

WARNING:root:If 'per_message=False', 'CallbackQueryHandler' will not be tracked for every message

这让我觉得我做错了什么。

谢谢。

最佳答案

对于每个对话,您只需要指定一个 CallbackQueryHandler 作为回退。例如:

START = range(1)

start_conv_handler = ConversationHandler(entry_points=[CommandHandler('start', start)],
states={
START: [CommandHandler('start', start)]
},
fallbacks= CallbackQueryHandler(main_callback_handler)]
)

然后在单个 CallbackQueryHandler 中,您可以计划您希望按钮执行的所有必要操作。由于您可以将所需的任何信息添加到处理程序接收的查询中,因此您可以通过将 return CallbackQueryHandler 放在描述对话步骤的每个函数的末尾来处理更复杂的场景(start 在我的示例中)。

所以它看起来像:

def start(bot, update):
... your code here
return CallbackQueryHandler

关于python - Telegram 对话机器人中后退按钮实现的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49971659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com