使用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,提问作者Матвей Васильев
相关产品推荐
相关产品推荐

