Telegram机器人:过滤器传递用户状态至函数的报错解决求助
Telegram机器人过滤器传递state至处理函数的解决方法
你的问题核心是自定义过滤器需要接收state参数,但直接传入message_handler时,框架不会自动传递该参数,导致报错。同时错误地给过滤器加message_handler装饰器会让它变成独立处理器,抢占了原处理函数的消息触发。
正确实现方式
使用filters.create包装你的过滤器函数,指定pass_state=True,让框架自动传递state参数给过滤器:
from telegram import types from telegram.ext import Dispatcher, FSMContext, filters async def my_filter(message: types.Message, state: FSMContext): # 这里可根据state做自定义逻辑,示例固定返回{'to':11} return {'to': 11} # 包装过滤器,声明需要传递state参数 my_custom_filter = filters.create(my_filter, pass_state=True) @dp.message_handler(my_custom_filter, commands=['start22'], state='*') async def my_message_handler(message: types.Message, to: int): await message.reply(f'to = {to}')
错误原因说明
- 原代码直接传递
my_filter给message_handler,框架默认只会向过滤器传递message参数,因此报错missing 1 required positional argument: 'state'。 - 给
my_filter添加@dp.message_handler(state='*')装饰器后,它会被注册为独立的消息处理器,优先捕获匹配消息,导致原my_message_handler无法触发。
内容的提问来源于stack exchange,提问作者Wifirium
相关产品推荐
相关产品推荐

