You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于aiogram的Telegram多聊天机器人功能异常问题求助

问题分析与修复方案

问题原因

你的代码在处理/help命令时,最后执行了await AnswerState.helpInfo.set(),给发起求助的聊天设置了FSM状态。但aiogram中,当聊天处于某个FSM状态时,只有匹配该状态的消息处理器会生效,其他所有命令、普通消息的处理器都会被跳过。而你并没有为AnswerState.helpInfo状态编写对应的处理逻辑来结束状态,导致发起求助的聊天会一直卡在这个状态里,直到其他聊天触发/help命令(或者手动重置状态)才能恢复使用机器人的功能。

修复后的代码

核心修改是删除/help命令处理函数末尾的await AnswerState.helpInfo.set(),因为发起求助的用户不需要进入任何状态,状态仅需要给点击回复按钮的用户设置。

from aiogram import types, Dispatcher
from aiogram.dispatcher import FSMContext
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils.callback_data import CallbackData

# 假设AnswerState、db、bot已提前定义
help_cb = CallbackData("help",'SenderId', "SenderName", 'action')
appeal_cb = CallbackData("appeal",'SenderId', 'action')

@dp.message_handler(commands="help")
async def help(message: types.Message):
    print("help")
    result = await db.check_if_allow(message.chat.id)
    if not result:
        await message.answer("Поки-що вам не дозволено відправляти запити про допогу. Спробуйте пізніше")
    else:
        if len(message.text) < 3:
            await message.answer("Опишіть вашу проблему детальніше.")
        else:
            forms, form = await db.get_chats_name(message.chat.id)
            await db.update_cooldown(message.chat.id)

            markup = InlineKeyboardMarkup()
            markup.add(InlineKeyboardButton("📨 Відповісти", callback_data=help_cb.new(SenderId = message.chat.id, SenderName = form[0],  action='answer')))
            markup.add(InlineKeyboardButton("🗑️ Видалити", callback_data=help_cb.new(SenderId = message.chat.id, SenderName = form[0], action='delete')))
            markup.add(InlineKeyboardButton("⛔ Поскаржитися", callback_data=help_cb.new(SenderId = message.chat.id, SenderName = form[0], action='appeal')))

            await message.answer("Запит на допомогу успішно надіслана")
            
            text = f"<b>🔔 Новий запит про допомогу!</b>\nКлас: {form[0]}\nЗапитання: {message.text}"

            for form in forms:
                await bot.send_message(form[0], text=text, reply_markup = markup)

            # 移除不必要的状态设置代码
            # await AnswerState.helpInfo.set()

@dp.callback_query_handler(help_cb.filter(action='answer'))
async def help_handler_answer(query: CallbackQuery, callback_data: dict, state: FSMContext):
    print("answer")
    await state.update_data(helpInfo = [callback_data["SenderId"], callback_data["SenderName"]])
    text = f"<b>Введіть відповідь на запитання</b>"
    await query.message.edit_reply_markup(None)
    await query.answer(text=text)
    await AnswerState.text.set()

@dp.message_handler(state=AnswerState.text)
async def process_title(message: Message, state: FSMContext):
    print("text")
    if len(message.text) < 3:
        await message.answer("В пояснені напишіть більше 2 слів.")
    else:
        await state.update_data(text = message.text)
        data = await state.get_data()

        await message.answer(f"<b>{data['helpInfo'][1]} щиро вдячний за допомогу!</b>")
        await state.finish()
        await bot.send_message(chat_id=data["helpInfo"][0], text=f"<b>🎉 Відповідь отримана!</b>\n\n{message.text}")

内容的提问来源于stack exchange,提问作者user21559340

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:49:57