如何在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
相关产品推荐
相关产品推荐

