【问题标题】:Telegram bot ConversationHandler ignores fallbacksTelegram bot ConversationHandler 忽略回退
【发布时间】:2021-09-03 00:43:13
【问题描述】:

我对 Telegram 机器人 (python-telegram-bot) 有疑问。我已经制作了 ConversationHandler,但“后备”不起作用。 Bot 只是忽略“/stop”命令。当我发送“/stop”时,机器人会发送给我“First handler”而不是“GoodBye”。怎么了?

import os

import telegram
from telegram.ext import (ConversationHandler,
                          CommandHandler,
                          MessageHandler,
                          Filters,
                          Updater
)
from dotenv import load_dotenv

load_dotenv()

TELEGRAM_TOKEN = os.environ['TELEGRAM_TOKEN']
USER_ID = os.environ['USER_ID']
bot = telegram.Bot(token=TELEGRAM_TOKEN)
updater = Updater(token=TELEGRAM_TOKEN)


def start(update, context):
    context.bot.send_message(chat_id=update.effective_chat.id,
                             text='hi')
    return 1


def stop(update, context):
    context.bot.send_message('Good Bye')
    return ConversationHandler.END


def first_handler(update, context):
    context.bot.send_message(chat_id=update.effective_chat.id,
                             text='First handler')
    return 1


conv_handler = ConversationHandler(
    entry_points=[CommandHandler('Start', start)],
    states={
        1: [MessageHandler(Filters.text, first_handler,
                           pass_user_data=True)],
    },
    fallbacks=[CommandHandler('stop', stop)]
)

dispatcher = updater.dispatcher
dispatcher.add_handler(conv_handler)

updater.start_polling()
updater.idle()

【问题讨论】:

    标签: python python-telegram-bot


    【解决方案1】:

    根据documentationMessageHandler(Filters.text, ...) 正在处理所有文本消息,包括 /stop 命令。但是,只有在上述处理程序都无法处理该消息时才会触发回退。

    您可以从 MessageHandler 中排除命令:

    MessageHandler(
        Filters.text & (~ Filters.command),
        first_handler,
    )
    

    组合过滤器的语法记录在here

    【讨论】:

    • 您的意思是将此排除添加到 中的 吗?不幸的是,它不起作用。 “类 'Filters' 的未解决的属性引用 'mergedFilter'”和“类 'Filters' 的未解决的属性引用 'InvertedFilter'”错误
    • 我编辑了我的答案,您使用的是最新版本吗?只需按照您所说的替换您的 MessageHandler 即可。
    • 非常感谢!现在可以了。据我了解,我们只是从 MessageHandler 中为 def 排除了命令“/start”、“/stop”、“/anything”。第一个处理程序?对吗?
    • 我想补充一点,pass_user_data 已被弃用并且不会产生任何影响,因为 OP 正在使用 PTB v12 中引入的基于上下文的 API。
    • @Ivan 这是正确的。仅当使用 Filters.text & (~ Filters.text(["/stop"])) 作为过滤器时,您才可以排除单个消息“/stop”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    相关资源
    最近更新 更多