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

如何在aiogram 3.4中实现自定义字符过滤(替代BoundFilter)

在aiogram 3.4中实现自定义非法字符过滤(替代旧版BoundFilter)

在aiogram 3.x版本中,BoundFilter已被移除,取而代之的是BaseFilter类来实现自定义过滤逻辑。以下是具体实现步骤和代码示例:

1. 自定义字符过滤器类

继承aiogram.filters.BaseFilter,实现核心的__call__方法完成字符校验:

from aiogram import types
from aiogram.filters import BaseFilter

class AllowedCharactersFilter(BaseFilter):
    def __init__(self, allowed_chars: str):
        # 将允许的字符转换为集合,提升校验效率
        self.allowed_chars = set(allowed_chars)
    
    async def __call__(self, message: types.Message) -> bool:
        # 无文本内容直接返回False,不触发后续处理器
        if not message.text:
            return False
        
        # 校验文本中所有字符是否都在允许范围内
        return all(char in self.allowed_chars for char in message.text.strip())

2. 在处理器中使用过滤器

实例化自定义过滤器,并将其绑定到指定的消息处理器上:

from aiogram import Router

router = Router()

# 定义允许的字符范围(可根据需求自行调整)
allowed_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_ "
valid_char_filter = AllowedCharactersFilter(allowed_chars=allowed_chars)

# 仅处理符合字符要求的文本消息
@router.message(valid_char_filter)
async def process_valid_message(message: types.Message):
    await message.answer("内容合法,已接收处理!")

# 处理不符合字符要求的文本消息(需放在合法处理器之后,保证路由匹配顺序)
@router.message()
async def process_invalid_message(message: types.Message):
    if message.text:
        await message.answer("内容包含非法字符,请检查后重新发送!")
    else:
        await message.answer("请发送文本类型的消息!")

关键说明

  • __call__方法是过滤器的核心,返回True时会触发绑定的处理器,返回False则跳过该处理器,继续匹配后续路由。
  • 允许的字符集合可根据业务需求灵活调整,比如添加中文、特殊符号等。
  • 路由匹配顺序很重要,需将合法处理器放在前面,否则不符合要求的消息会被默认处理器优先捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:46:06