电报Python ConversationHandler记住旧答案

Bij*_*jan 0 python telegram python-telegram-bot telegram-bot

我正在使用此ConversationHandler脚本作为程序的基础。

如何从以前的状态中检索用户答案?例如,当询问用户有关其生物的信息时,我该如何打印其性别(这是首先询问的内容)?

看起来每个函数都返回下一步(GENDER-> PHOTO-> LOCATION-> BIO),但是有没有办法查看以前的输入是什么?

dev*_*Fun 5

我遇到了完全相同的问题,需要保留以前的用户对话答案。查看处理程序文档,它是所有处理程序的基类。它具有名为pass_user_data的参数。设置为True时,它将user_data字典传递给您的处理程序,并且它与发送更新的用户有关。您可以利用它来实现所需的功能。

假设我正在与一个入口点和两个状态进行对话:

def build_conversation_handler():
    conversation_handler = ConversationHandler(
        entry_points=[CommandHandler('command', callback=show_options)],
        states={
            PROCESS_SELECT: [CallbackQueryHandler(process_select, pass_user_data=True)],
            SOME_OTHER: [MessageHandler(filters=Filters.text, callback=some_other, pass_user_data=True)],
        },
    )
Run Code Online (Sandbox Code Playgroud)

以下是对话的处理程序:

def show_options(bot, update):
    button_list = [
        [InlineKeyboardButton("Option 1", callback_data="Option 1"),
         InlineKeyboardButton("Option 2", callback_data="Option 2")]]

    update.message.reply_text("Here are your options:", reply_markup=InlineKeyboardMarkup(button_list))
    return PROCESS_SELECT

def process_select(bot, update, user_data):
    query = update.callback_query
    selection = query.data
    # save selection into user data
    user_data['selection'] = selection
    return SOME_OTHER

def some_other(bot, update, user_data):
    # here I get my old selection
    old_selection = user_data['selection']
Run Code Online (Sandbox Code Playgroud)

在第一个处理程序中,我显示用户键盘以选择一个选项,在下一个处理程序中,我从回调查询中获取选择并将其存储到用户数据中。最后一个处理程序是消息处理程序,因此它没有回调数据,但是由于我向其中添加了user_data,因此可以使用之前添加的数据来访问字典。使用这种方法,您可以在处理程序之间存储和访问与用户相关的任何内容。