代码之家  ›  专栏  ›  技术社区  ›  Bijan

电报Python会话处理程序记住旧答案

  •  2
  • Bijan  · 技术社区  · 7 年前

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

    如何从以前的状态检索用户答案?例如,当用户被问及他们的简历时,我如何打印他们的性别(这是第一个被问及的问题)?

    看起来每个函数都会返回下一步(性别->照片->位置->生物),但是否有办法查看以前的输入是什么?

    2 回复  |  直到 7 年前
        1
  •  6
  •   dev4Fun    6 年前

    我遇到了完全相同的问题,我需要保留以前的用户答案以便进行对话。看看 Handler 文档,它是所有处理程序的基类。它具有名为pass\u user\u data的参数。当设置为True时,它会将user\u数据字典传递给处理程序,并与发送更新的用户相关。你可以利用它来实现你想要的。

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

    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\u数据,因此可以使用之前添加的数据访问字典。使用这种方法,您可以在处理程序之间存储和访问与用户相关的任何内容。

        2
  •  2
  •   evan54    3 年前

    我认为公认的解决方案不受欢迎-

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

    pass\u user\u data和pass\u chat\u data确定可用于保存任何数据的dict是否将发送到回调函数。与发送更新的用户或聊天室相关。对于来自同一用户或同一聊天室的每次更新,都将是相同的dict。

    注意,这是不推荐的,您应该使用基于上下文的回调。看见 https://git.io/fxJuV 了解更多信息。

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