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

使用aiogram 3.13.1注册带条件回调失败:仅首个回调生效

问题解决:aiogram 3.x 回调处理器仅第一个生效的问题

问题原因

aiogram 3.x 中,Dispatcher 会按注册顺序匹配处理器。你代码里第一个回调处理器dp.callback_query.register(callback)没有设置任何过滤条件,会拦截所有回调查询请求,导致后面的add_money处理器根本没有触发机会,自然不会生效也不会报错。

解决方案

1. 调整处理器注册顺序

把带过滤条件的处理器放在前面,兜底的无过滤处理器放在最后:

# Callback Register
# 先注册带过滤条件的处理器
dp.callback_query.register(add_money, Main.add, F.data == "add_money")
# 最后注册兜底的无过滤处理器
dp.callback_query.register(callback)

2. 验证过滤条件有效性

  • 确认Main.add状态是否正确,触发回调时用户是否确实处于该状态
  • 检查F.data == "add_money"是否和按钮设置的callback_data完全一致(注意大小写、空格等细节)

3. 检查处理器函数定义

确保add_money函数参数符合aiogram 3.x要求,示例:

async def add_money(callback: CallbackQuery, state: FSMContext):
    # 处理器逻辑
    await callback.answer()

修改后的完整代码示例

from config import get_data, cmd
import logging
from msg_handler import *
from call_handler import *
from func import *
from aiogram.filters import F


logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
dp = get_data("dp")


# Message Register
dp.message.register(start, cmd("cmd", cmd="start"))
dp.message.register(add_nick, cmd("state", state="add"))
dp.message.register(amounted, cmd("state", state="amount"))


# Callback Register - 调整顺序
dp.callback_query.register(add_money, Main.add, F.data == "add_money")
dp.callback_query.register(callback)


if __name__ == "__main__":
    asyncio.run(main(dp, get_data("bot")))

内容的提问来源于stack exchange,提问作者Матвей Васильев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:43:15