🌙

Фильтры

Фильтры

Фильтры ограничивают, какие апдейты попадают в хендлер. Несколько фильтров объединяются через AND.

from pykodaribot import filters

command

Срабатывает на команды вида /cmd или /cmd@botname.

filters.command("start")           # только /start
filters.command("start", "help")   # /start или /help

text

Проверяет текст сообщения через regex.

filters.text(r"привет|hello")

@dp.message(filters.text(r"^привет$"))
async def hi(msg):
    await msg.answer("Привет!")

callback_data

Точное совпадение callback_data inline-кнопки.

@dp.callback_query(filters.callback_data("yes"))
async def on_yes(cb): ...

callback_data_prefix

callback_data начинается с указанного префикса — удобно для передачи ID через кнопки.

@dp.callback_query(filters.callback_data_prefix("item:"))
async def on_item(cb):
    item_id = cb.data.split(":")[1]
    await cb.answer()
    await cb.message.answer(f"Выбрано: {item_id}")

reaction

Фильтрует события message_reaction. Без аргументов — принимает все реакции.

filters.reaction()               # любая реакция
filters.reaction("👍")           # только 👍
filters.reaction("👍", "❤️")    # 👍 или ❤️

@dp.message_reaction(filters.reaction("🔥"))
async def on_fire(reaction): ...

is_forward

Принимает только пересланные сообщения.

@dp.message(filters.is_forward())
async def on_forward(msg):
    await msg.answer(f"Переслано от: {msg.forward_from_user_name}")

has_media

Принимает только сообщения с медиафайлами.

filters.has_media()              # любой тип медиа
filters.has_media("image")       # только фото
filters.has_media("video", "audio")  # видео или аудио

@dp.message(filters.has_media("image"))
async def on_photo(msg):
    await msg.answer("Получил фото!")

Доступные типы: "image", "video", "audio", "file"

Комбинирование

@dp.message(filters.command("buy"), filters.text("premium"))
async def buy_premium(msg): ...

Свой фильтр

from pykodaribot.filters import Filter

class OnlyDirectFilter(Filter):
    async def __call__(self, msg) -> bool:
        return msg.chat.type == "direct"

@dp.message(OnlyDirectFilter())
async def private_only(msg): ...
1 просмотр