已注册/sender命令却提示is not handled?Aiogram机器人问题排查
排查aiogram中/sender命令未被处理的问题
问题现象
使用aiogram开发Telegram机器人时,/sender命令无法触发对应的处理逻辑,控制台日志反复提示更新未被处理:
2023-09-19 19:42:22,749 - [INFO] - aiogram.dispatcher - (dispatcher.py).start_polling(524) - Start polling 2023-09-19 19:42:22,796 - [INFO] - aiogram.dispatcher - (dispatcher.py)._polling(340) - Run polling for bot @edu_light_u_bot id=1111111111 - 'edu_light_bot' 2023-09-19 19:42:25,729 - [INFO] - aiogram.event - (dispatcher.py).feed_update(171) - Update id=511111722 is not handled. Duration 14 ms by bot id=1111111111 2023-09-19 19:45:28,590 - [INFO] - aiogram.event - (dispatcher.py).feed_update(171) - Update id=511111723 is not handled. Duration 16 ms by bot id=1111111111
相关代码(main.py)
import asyncpg import asyncio import logging import contextlib from aiogram import Bot, Dispatcher, F from aiogram.filters import Command from aiogram.fsm.storage.redis import RedisStorage from core.middlewares.dbmiddleware import DbSession from core.settings import settings from core.utils.commands import set_commands from core.handlers import sender from core.utils.sender_list import SenderList from core.utils.sender_state import Steps async def start_bot(bot: Bot): await set_commands(bot) await bot.send_message(settings.bots.admin_id, text='Бот запущен!') async def stop_bot(bot: Bot): await bot.send_message(settings.bots.admin_id, text='Бот остановлен!') async def create_pool(): return await asyncpg.create_pool(user=settings.db.db_user, password=settings.db.dp_password, database=settings.db.db_database, host=settings.db.db_host, port=5432, command_timeout=60) async def start(): logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - [%(levelname)s] - %(name)s - " "(%(filename)s).%(funcName)s(%(lineno)d) - %(message)s" ) bot = Bot(token=settings.bots.bot_token, parse_mode='HTML') pool_connect = await create_pool() storage = RedisStorage.from_url('redis://127.0.0.1:6379/0') dp = Dispatcher(storage=storage) dp.update.middleware.register(DbSession(pool_connect)) dp.startup.register(start_bot) dp.shutdown.register(stop_bot) dp.message.register(sender.get_sender, Command(commands='sender', magic=F.args), F.chat.id == settings.bots.admin_id) dp.message.register(sender.get_message, Steps.get_message, F.chat.id == settings.bots.admin_id) dp.callback_query.register(sender.sender_decide, F.data.in_(['confirm_sender', 'cancel_sender'])) dp.callback_query.register(sender.q_button, Steps.q_button) dp.message.register(sender.get_text_button, Steps.get_text_button, F.chat.id == settings.bots.admin_id) dp.message.register(sender.get_url_button, Steps.get_url_button, F.chat.id == settings.bots.admin_id, F.text) sender_list = SenderList(bot, pool_connect) try: await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types(), senderlist=sender_list) except Exception as ex: logging.error(f"[!!! Exception] - {ex}", exc_info=True) finally: await bot.session.close() if __name__ == "__main__": with contextlib.suppress(KeyboardInterrupt, SystemExit): asyncio.run(start())
排查方向及修复建议
1. 命令过滤器的参数限制问题
你在注册/sender命令时,使用了Command(commands='sender', magic=F.args),这个magic=F.args要求命令必须携带参数(比如/sender 测试),如果直接发送不带参数的/sender,过滤器会匹配失败,导致更新未被处理。
修复:
如果该命令不需要参数,直接去掉magic=F.args,修改为:
dp.message.register(sender.get_sender, Command(commands='sender'), F.chat.id == settings.bots.admin_id)
如果确实需要参数,发送命令时必须带上对应的参数。
2. 管理员ID验证问题
检查settings.bots.admin_id的取值是否正确:
- 确保它是整数类型(Telegram用户ID是整数),如果配置中是字符串,需要转换为整数
- 打印
settings.bots.admin_id和当前发送命令的用户ID,确认两者完全一致
3. 临时排除权限过滤测试
可以临时注释掉F.chat.id == settings.bots.admin_id这个过滤条件,测试/sender命令是否能正常触发,以此排除权限验证导致的问题。
4. 中间件干扰
检查DbSession中间件是否有异常逻辑,比如在处理更新时抛出错误,导致后续的处理器无法执行。可以临时移除中间件测试,看命令是否正常工作。
内容的提问来源于stack exchange,提问作者Marinet
相关产品推荐
相关产品推荐

