aiogram как блокировать выполнение handler если нет в белом списке

Рейтинг: 0Ответов: 1Опубликовано: 03.08.2023

Реализовал функцию которая проверяет id пользователя с списком разрешенных id, эту функцию я вставляю в каждый handler:

@dp.message_handler(commands="ping")
async def mess(message):
    if read_config.watch_id(message.from_user.id):
        get_message_bot = message.text.strip()
        mes = get_message_bot.split("/ping ")
        try:
            ip = mes[1]
            ping_ip = ping(ip, count=5)
        except IndexError:
            ping_ip = "Ошибка ввода адреса"
        except RuntimeError as e:
            e1 = e.args[0].split("\"")
            if e1[0] == "Cannot resolve address ":
                 ping_ip = e1[0]
        await bot_token.send_message(message.chat.id, ping_ip, parse_mode='html')
    else:
        await message.answer(f"Ваш ID: {message.from_user.id} Вам доступ запрещен")

Вопрос заключается в следующем, как можно через middleware отменять выполнение handler если нет в белом списке пользователя.

Ответы

▲ 0

Эту проблему понял как решить двумя способами:

  1. Создать отдельный декоратор:

    def access_enabled_id(func) -> str | bool:
    
    async def wrapper(message: types.Message):
        if read_config.watch_id(message.from_user.id):
            await func(message)
        else:
            await message.reply("Вашего ID нету в разрешенном списке")
    
    return wrapper
    

Перед каждым хендлером поставить @access_enabled_id (не забудъте импортировать декоратор в в файл с хендлерами) Здесь я с помощью функции вытаскиваю список моих id из файла и проверяю того кто написал сообщение есть ли в этом списке или нет.

  1. С помощью midleware:

     from aiogram import types
     from aiogram.dispatcher.middlewares import BaseMiddleware
    
     class CheckOnCommandMessage(BaseMiddleware):
    
        def __init__(self):
            BaseMiddleware.__init__(self)
    
    
         async def on_post_process_message(self, message: types.Message, result, data: dict):
     ### До обработки считываю сообщения
            --- Cюда напишите функцию для проверки---
    

испортируйте этот клас в основное тело бота и зарегестрируйте его dp.middleware.setup(CheckOnCommandMessage())

С декоратором я реализовал у себя а через мидлваре еще не добрался, возможно скоро сделаю

Вот здесь можно посмотреть инфу https://victor-komlev.ru/klass-dispatcher-frejmvorka-aiogram/