基于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
相关产品推荐
相关产品推荐

