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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:02:30