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

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}')

错误原因说明

  1. 原代码直接传递my_filter给message_handler,框架默认只会向过滤器传递message参数,因此报错missing 1 required positional argument: 'state'。
  2. 给my_filter添加@dp.message_handler(state='*')装饰器后,它会被注册为独立的消息处理器,优先捕获匹配消息,导致原my_message_handler无法触发。

内容的提问来源于stack exchange,提问作者Wifirium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:35:32