如何在其中构建带有 CallbackQueryHandler 的对话处理程序

How build a conversation handler with CllbackQueryHandler in it

注意:我使用 python-telegram-bot 包的第 12 版。

我想构建一个对话处理程序:当用户选择 \charts 命令时,机器人会向他们显示一个内联的选项列表,并根据他们的选择,return 给他们一个图表。

charts_handler = ConversationHandler(
    entry_points=[CommandHandler('chart', chart_start)],
    states={
        ChartChoices.choosing_user: [CallbackQueryHandler(
            individual_chart,
            pass_user_data=True)
        ],
    },
    fallbacks=[done_handler],
)

但是如果我不设置 per_message=False 那么它会导致这个错误:

If 'per_message=False', 'CallbackQueryHandler' will not be tracked for every message.

如果我设置 per_message=True,则会导致错误:

If 'per_message=True', all entry points and state handlers                                      
must be 'CallbackQueryHandler', since no other handlers have a message context.

因此,似乎使用 CallBackQueryHandler 构建对话处理程序(或者换句话说,在聊天期间显示内联键盘)的唯一方法是将所有处理程序设置为 CallbackQueryHandler。这是正确的吗?

首先,这不是错误,这是一个您可以安全忽略的警告:If 'per_message=False', 'CallbackQueryHandler' will not be tracked for every message.

其次,对于所描述的用例,您不需要 ConversationHandler。用户交互示例: User: /charts Bot: Here is the list of available charts: Bar chart 1 /chart_1 Bar chart 2 /chart_2 Pie chart /chart_3

这种流程你可以用简单的 MessageHandlerFilters

来实现

Docs: MessageHandler

Docs: Filters

也就是说你可以使用 regex filter.

ConversationHandler 在您需要与用户进行多步迭代时很有用(例如逐步填写长表格)。如果您可以通过其他方式识别用户请求,例如生成的命令、内联按钮、消息文本 — 更喜欢这样做。