Telegram Python ConversationHandler记住旧答案

时间:2018-03-09 22:29:43

标签: python telegram telegram-bot python-telegram-bot

我使用This ConversationHandler Script作为我的计划的基础。

如何从之前的状态检索用户答案?例如,当询问用户他们的Bio时,如何打印他们的性别(这是第一件被问到的)?

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

3 个答案:

答案 0 :(得分:5)

我遇到了完全相同的问题,我需要保留以前的用户对话的答案。查看Handler文档,它是所有处理程序的基类。它有一个名为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)],
        },
    )

以下是对话的处理程序:

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']

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

答案 1 :(得分:1)

我认为已接受的解决方案已被弃用 -

https://python-telegram-bot.readthedocs.io/en/stable/telegram.ext.handler.html

<块引用>

pass_user_data 和 pass_chat_data 决定是否将可用于保存任何数据的 dict 发送到回调函数。与发送更新的用户或聊天相关。对于来自同一用户或同一聊天中的每个更新,它将是相同的字典。

请注意,这是已弃用的,您应该使用基于上下文的回调。有关详细信息,请参阅 https://git.io/fxJuV

可以在 context.user_data['var'] = val 中存储状态

答案 2 :(得分:0)

我有这个...

SOME_OTHER: [MessageHandler(filters=Filters.text, callback=some_other, pass_user_data=True)],

TypeError: init ()缺少1个必需的位置参数:“ fallbacks”