aiogram框架Telegram Bot运行报错求助:Router无message属性
修复aiogram Bot的AttributeError问题
错误原因分析
你遇到的AttributeError: type object 'Router' has no attribute 'message'是因为两个核心问题:
- 直接使用
Router类调用message方法,而非实例化后的Router对象 - 混淆了aiogram 2.x与3.x的API写法,同时第二段代码存在状态参数传递和注入的错误
修正后的代码方案
方案1(基于aiogram 3.x,使用Router)
首先必须实例化Router对象,同时正确注入FSMContext、修正多行字符串写法:
from aiogram import Router, F from aiogram.filters import CommandStart from aiogram.types import Message from aiogram.fsm.context import FSMContext # 导入你定义的UserState from your_module import UserState # 关键:先实例化Router对象 router = Router() # 用F.text匹配/start,或更规范的CommandStart过滤器 @router.message(F.text == "/start") # 也可替换为:@router.message(CommandStart()) async def send_welcome(message: Message, state: FSMContext): await state.set_state(UserState.awaiting_function) # 用三引号包裹多行字符串,避免语法错误 await message.reply("""Hi! I'm EchoBot! Powered by aiogram.""")
方案2(基于aiogram 2.x,使用Dispatcher)
如果你的项目用aiogram 2.x,修正第二段代码的装饰器和参数注入错误:
from aiogram import Dispatcher, types from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters import Text # 导入你定义的UserState和已实例化的dp from your_module import UserState, dp # 用Text过滤器匹配/start,忽略大小写 @dp.message_handler(Text(equals='/start', ignore_case=True)) async def send_welcome(message: types.Message, state: FSMContext): await state.set_state(UserState.awaiting_function) await message.reply("""Hi! I'm EchoBot! Powered by aiogram.""")
关键修正点总结
- aiogram 3.x中必须先实例化
Router(),用实例对象的message装饰器,不能直接调用Router.message - 多行字符串需用三引号包裹,避免语法错误
- 状态参数
state要在函数参数中注入,不能在装饰器里直接传FSMContext类 - 推荐使用官方提供的过滤器(如
CommandStart)匹配命令,比手动判断更可靠
内容的提问来源于stack exchange,提问作者Balsam _
相关产品推荐
相关产品推荐

