Python-Telegram-Bot:结束对话后无法重用ConversationHandler

问题描述 投票:1回答:1

我正在尝试使用python-telegram-bot库开发自己的机器人。

我对ConversationHandler存有疑问,这可能是由于我不太了解如何使用它。我想在机器人上放一个/ settings命令,当它被调用时,它会触发一个ConversationHandler。这是一段代码的片段,灵感来自其官方示例,该代码片段使ConversationHandler可以使用/ settings命令。

CHOOSING = range(1)
reply_keyboard = [['🔔 Breaking News', '🗞 News'], ['✅ Done']]
markup = ReplyKeyboardMarkup(reply_keyboard,one_time_keyboard=True)



settings_handler = ConversationHandler(
    entry_points = [CommandHandler('settings', settings)],

    states = {
        CHOOSING: [MessageHandler(Filters.regex('^(🔔 Breaking News)$'), modificaBreakingNews),
        MessageHandler(Filters.regex('^(🗞 News)$'),modificaLatestNews)]
    },

    fallbacks = [MessageHandler(Filters.regex('^✅ Done$'), save)]
)

然后,用户将获得几个设置选项并选择一个设置选项。

def modificaBreakingNews(update, context):
    locale = update.message.from_user.language_code
    keyboard = [
        [InlineKeyboardButton("✅ Attiva", callback_data="modBreakingNews - True"),
        InlineKeyboardButton("❌ Disattiva", callback_data="modBreakingNews - False")
        ]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)

    update.message.reply_text(translation['opzioniBreakingNews']['it'] if locale == 'it' else translation['opzioniBreakingNews']['en'], reply_markup=reply_markup)


def modificaLatestNews(update, coontext):
    locale = update.message.from_user.language_code
    keyboard = [
        [InlineKeyboardButton("🏃🏻 " + translation['primaSquadra']['it'] if locale == 'it' else translation['primaSquadra']['en'], callback_data="modLatestNews - First Team"),
        InlineKeyboardButton("🏉 " + translation['settGiovanile']['it'] if locale == 'it' else translation['settGiovanile']['en'], callback_data="modLatestNews - Youngsters"),
        InlineKeyboardButton("🏋🏻 " + translation['tutteNews']['it'] if locale == 'it' else translation['tutteNews']['en'] , callback_data="modLatestNews - All")]
    ]
    reply_markup = InlineKeyboardMarkup(keyboard)

    update.message.reply_text(translation['opzioniLatestNews']['it'] if locale == 'it' else translation['opzioniLatestNews']['en'], reply_markup=reply_markup)


def save(update,context):
    locale = update.effective_user.language_code
    update.effective_message.reply_text(translation['modificheOK']['it'] if locale == 'it' else translation['modificheOK']['en'])
    return ConversationHandler.END


def gestore_callback(update, context):
    data = update.callback_query.data.split(" - ")
    dataToSend = {"idTelegram":update.effective_user.id, "intent":"", "confidenza": 0, "command": True}
    print(dataToSend)
    if data[0] == "modBreakingNews":
        dataToSend["newPreference"]  =  data[1]  == 'True'
        print(dataToSend)
        result = requests.post("http://localhost:8000/user/preferences/breaking", data=dataToSend)
    elif data[0] == "modLatestNews":
        dataToSend["newPreference"]  =  data[1]
        result = requests.post("http://localhost:8000/user/preferences/news", data=dataToSend)
    return save(update,context)

[之后,修改后的设置将保存在我的后端,理想情况下,我希望ReplyKeyboard消失,直到再次触发/ setting命令为止。这不会发生,因为当我想再次召唤/ settings时,不再触发该命令

我想念的是什么?当然,ConversationHandler和callbackhandler都被初始化并分配给调度程序对象。

python telegram python-telegram-bot
1个回答
0
投票

我有相同的问题,并通过在最后一个状态的末尾添加以下语句来解决它:

return ConversationHandler.END

添加此内容,在每次对话之后,用户可以重新开始。

© www.soinside.com 2019 - 2024. All rights reserved.