Как получить user id, не указывая тип TelegramObject (Message, CallbackQuery) в aiogram?
Делаю бота и хочу добавить что-то вроде авторизации, чтобы никто кроме меня не смог "стучаться" в него.
У меня есть различные хэндлеры, которые реагируют и на Message, и на CallbackQuery.
Пытался сделать Middleware, в котором бы проверял совпадает ли мой id с тем, что, например, прилетает, когда кто-то пишет обычное сообщение в бот (user_id == message.from_user.id).
В итоге столкнулся с тем, что мне нужно указывать, где именно я хочу брать этот id, из Message или из CallbackQuery.
Могу ли я все сделать с помощью одной мидлвари или их нужно несколько. Если второе, то как подключить их к объекту Bot или Dispatcher.
Ответы (1 шт):
Это можно сделать одним 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 - пропускаем на обработку хендлерами. Если от некоего другого, то обработку прекращаем