aiogram中callback_query_handler内调用answer()方法出现'reply_markup'意外关键字参数错误的原因排查
问题原因与解决方案
这个报错的核心问题其实很简单——你搞错了handler接收的对象类型!
你的handler用了@dp.callback_query_handler装饰器,这意味着这个函数接收的参数是CallbackQuery对象,而不是你声明的Message对象。这两个对象的answer()方法差异很大:
Message.answer()是用来给用户发送一条新消息的,确实支持reply_markup参数来附带键盘;- 但
CallbackQuery.answer()是用来回复回调查询本身的(比如给用户一个短暂的提示弹窗),它根本没有reply_markup这个参数,所以你传了这个参数就会触发TypeError。
修复方案
方案1:发送新消息带键盘
如果你想给用户发一条全新的带选择键盘的消息,需要通过CallbackQuery对象获取对应的原始消息,再调用它的answer()方法:
# 记得先导入CallbackQuery from aiogram.types import CallbackQuery @dp.callback_query_handler(text='add word') async def add_word(callback_query: CallbackQuery): keyboard = all_dictionaries_keyboard() # 用callback_query.message来发送新消息 await callback_query.message.answer( 'Please choose dictionary at which words will be added:', reply_markup=keyboard ) await AddWords.get_dictionary.set() # 务必给回调查询一个空回复,否则用户的按钮会一直处于加载转圈状态 await callback_query.answer()
方案2:修改原有消息的内容和键盘
如果你想直接替换掉触发回调的那条消息的内容和键盘,可以用CallbackQuery.edit_message_text()方法:
from aiogram.types import CallbackQuery @dp.callback_query_handler(text='add word') async def add_word(callback_query: CallbackQuery): keyboard = all_dictionaries_keyboard() await callback_query.edit_message_text( text='Please choose dictionary at which words will be added:', reply_markup=keyboard ) await AddWords.get_dictionary.set() await callback_query.answer()
额外提醒
别忘了把函数参数的类型声明从Message改成CallbackQuery,同时导入对应的类型,这样不仅能解决报错,还能获得正确的IDE类型提示。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

