Telegram bot ConversationHandler 忽略回退

Telegram bot ConversationHandler ignores fallbacks

我的 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()

根据 documentationMessageHandler(Filters.text, ...) 正在处理 所有 条短信,包括 /stop 命令。但是,仅当上述处理程序中的 none 能够处理消息时才会触发回退。

您可以从 MessageHandler 中排除命令:

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

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