Как правильно установить два фильтра одновременно в aiogram?

Как сделать 2 фильтра при регистрации хэндлера с использованием модуля `dp.callback_query.register` вместо модуля `router`, чтобы избежать логической ошибки, указав поле `State()` вместо логического значения?
  • 25 октября 2023 г. 18:48
Ответы на вопрос 2
Для установки двух фильтров одновременно в aiogram можно использовать комбинатор фильтров `Filters`. Вот пример кода:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher.filters import Filters

bot_token = "YOUR_BOT_TOKEN"
bot = Bot(token=bot_token)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


# Определим два фильтра
filter1 = Filters.Regexp("pattern1")
filter2 = Filters.Regexp("pattern2")


@dp.callback_query_handler(filter1 & filter2)
async def callback_handler(callback_query: types.CallbackQuery):
    # Обработка события


if __name__ == "__main__":
    import asyncio

    loop = asyncio.get_event_loop()
    loop.create_task(dp.start_polling())
    loop.run_forever()
```

В этом примере мы создаем два фильтра `filter1` и `filter2`, используя `Filters.Regexp`, чтобы фильтровать callback queries. Затем мы объединяем эти два фильтра с помощью оператора `&` (логическое И). Затем мы регистрируем хэндлер с помощью декоратора `dp.callback_query_handler` и передаем объединенный фильтр как аргумент.

Чтобы избежать логической ошибки при использовании `dp.callback_query.register`, вы можете указать поле `state` вместо логического значения `Filters`, чтобы фильтровать callback queries на основе состояния. Вот пример кода:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext

bot_token = "YOUR_BOT_TOKEN"
bot = Bot(token=bot_token)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class MyStates:
    STATE1 = "state1"
    STATE2 = "state2"


@dp.callback_query_handler(state=MyStates.STATE1)
async def callback_handler1(callback_query: types.CallbackQuery, state: FSMContext):
    # Обработка события


@dp.callback_query_handler(state=MyStates.STATE2)
async def callback_handler2(callback_query: types.CallbackQuery, state: FSMContext):
    # Обработка события


if __name__ == "__main__":
    import asyncio

    loop = asyncio.get_event_loop()
    loop.create_task(dp.start_polling())
    loop.run_forever()
```

В этом примере мы определили два состояния `MyStates.STATE1` и `MyStates.STATE2`. Затем мы зарегистрировали два хэндлера с помощью `dp.callback_query_handler` и указали необходимое состояние для каждого хэндлера. Это позволит нам использовать состояние вместо логических значений для фильтрации callback queries.
Я понял, что для передачи состояния нужно просто использовать отдельный параметр при регистрации функции dp.callback_query.register. В данном случае речь идет о параметре состояния Form.like_bots и условии F.data.startswith("bot_").
Похожие вопросы