Как получить user id, не указывая тип TelegramObject (Message, CallbackQuery) в aiogram?

Делаю бота и хочу добавить что-то вроде авторизации, чтобы никто кроме меня не смог "стучаться" в него.

У меня есть различные хэндлеры, которые реагируют и на Message, и на CallbackQuery.

Пытался сделать Middleware, в котором бы проверял совпадает ли мой id с тем, что, например, прилетает, когда кто-то пишет обычное сообщение в бот (user_id == message.from_user.id).

В итоге столкнулся с тем, что мне нужно указывать, где именно я хочу брать этот id, из Message или из CallbackQuery.

Могу ли я все сделать с помощью одной мидлвари или их нужно несколько. Если второе, то как подключить их к объекту Bot или Dispatcher.


Ответы (1 шт):

Автор решения: CausonQ

Это можно сделать одним Middleware

from typing import Any, Callable, Dict, Awaitable
from aiogram import BaseMiddleware
from aiogram.types import TelegramObject

class SecretZone(BaseMiddleware):
    async def __call__(
            self,
            handler: Callable[[TelegramObject, Dict[str, Any]], Awaitable[Any]],
            event: TelegramObject,
            data: Dict[str, Any],
    ) -> Any:
        user = data["event_from_user"]
        if user.id == user_id: # вместо user_id пишем свой или ы какой-нибудь список
            return await handler(event, data)
        else:
            return

Подключаем на диспетчер:

dp.update.outer_middleware(SecretZone())

В случае, если апдейт приходит от нужного нам id - пропускаем на обработку хендлерами. Если от некоего другого, то обработку прекращаем

→ Ссылка