Как извлечь callback_data из обновления в aiogram?

Как можно с помощью мидлваря получить значение callback_data нажатой пользователем кнопки перед обработкой в хендлере, если количество кнопок в inline клавиатуре задаётся пользователем в "админ панеле" и заранее неизвестно, сколько будет создано callback_query? Я пытался получить эту информацию, но получается лишь другая информация, кроме самого callback_data.
  • 18 октября 2024 г. 17:22
Ответы на вопрос 3
В `aiogram` извлечь `callback_data` из нажатой кнопки можно с помощью хендлера для `CallbackQuery`. Если вы хотите использовать middleware для получения `callback_data` перед передачей управления хендлеру, это вполне возможно.

Ниже приведен пример реализации такого middleware:

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

API_TOKEN = 'YOUR_BOT_TOKEN'

bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

class CallbackDataMiddleware(MiddlewareMixin):
    async def on_pre_process_callback_query(self, callback_query: types.CallbackQuery, data: dict):
        # Извлекаем callback_data
        callback_data = callback_query.data
        data['callback_data'] = callback_data
        print(f'Callback data: {callback_data}')  # Выводим в консоль или обрабатываем по-другому

@dp.middleware.setup(CallbackDataMiddleware())
    
@dp.callback_query_handler(lambda c: True)  # Можно задать свой фильтр
async def handle_callback_query(callback_query: types.CallbackQuery, data: dict):
    # Доступ к callback_data через data['callback_data']
    callback_data = data.get('callback_data')
    await bot.answer_callback_query(callback_query.id, text=f'Вы нажали кнопку с данными: {callback_data}')
    # Здесь добавьте дальнейшую обработку

if __name__ == '__main__':
    import logging
    from aiogram import executor
    
    logging.basicConfig(level=logging.INFO)
    
    executor.start_polling(dp, skip_updates=True)
```

В этом примере мы создали middleware, которая перехватывает все запросы типа `CallbackQuery` и извлекает `callback_data`, добавляя его в `data` для дальнейшего использования. Мы выводим `callback_data` в консоль, но вы можете обрабатывать его любым другим способом.

Потом в вашем хендлере вы можете получить `callback_data` через словарь `data`, который был модифицирован в middleware. Это позволяет вам иметь доступ к `callback_data` до начала обработки, что может быть полезно для различных целей, включая ведение журнала или дополнительную логику на основе значений.
Добавь этим кнопкам одинаковый префикс (например prefix_btn1, prefix_btn2, prefix_btn3 ...) И создай один callback_query, для F.data.startswith('prefix_')
Используйте Callback Data Factory
Похожие вопросы