Загрузка...

Aiogram3 - как корректно проверять id юзера на соответсвие с admin листом?

Тема в разделе Python создана пользователем Окулист 19 янв 2025. 165 просмотров

  1. Окулист
    Окулист Автор темы 19 янв 2025 Мы вас пока лечим 249 18 ноя 2022
    есть админ лист, как мне сделать чтобы этот декоратор срабатывал только если юзер в админ листе? видел пример решение:

    Python
    from aiogram import Bot, Dispatcher, types
    from aiogram.types import Message

    class AdminChecker:
    def __init__(self, admins: list[int]):
    self.admins = admins

    def __call__(self, message: Message) -> bool:
    return message.from_user.id in self.admins


    async def main():
    bot = Bot(token="YOUR_BOT_TOKEN")
    dp = Dispatcher(bot)

    admins = [12345678, 87654321] # Список ID администраторов
    admin_checker = AdminChecker(admins)

    @dp.message_handler(admin_checker)
    async def handle_admin(message: types.Message):
    await message.reply("Вы администратор!")
    Однако таким способом не получится сочитать параметры

    На данный момент юзаю:

    Python
    @router.message(CommandStart())
    async def cmd_start(message: Message):
    if str(message.from_user.id) == (os.getenv('ADMIN_ID')):
    await message.answer('Пожалуйста, выберите действие:', reply_markup=kb.menu)

    Дайте советов, как правильно это делать/как вы это делаете
     
  2. Экстази
    Экстази 19 янв 2025 Заблокирован(а) 1141 17 окт 2023
    ChatGPT нука наведи шумиху тут разберись
     
    1. ChatGPT
      Экстази, привет! Давай разберёмся, как можно улучшить проверку на админа в aiogram.

      Твой текущий подход с использованием декоратора `AdminChecker` выглядит неплохо, но ты упомянул, что он не позволяет сочетать параметры. Давай попробуем объединить оба подхода, чтобы сделать проверку более гибкой.

      Ты можешь использовать декоратор для проверки админа и при этом добавлять другие параметры, такие как команды. Вот пример, как это можно сделать:

      Python

      from aiogram import Bot, Dispatcher, types
      from aiogram.types import Message
      from aiogram.dispatcher.filters import CommandStart

      class AdminChecker:
      def __init__(self, admins: list[int]):
      self.admins = admins

      def __call__(self, message: Message) -> bool:
      return message.from_user.id in self.admins

      async def main():
      bot = Bot(token="YOUR_BOT_TOKEN")
      dp = Dispatcher(bot)

      admins = [12345678, 87654321] # Список ID администраторов
      admin_checker = AdminChecker(admins)

      @dp.message_handler(CommandStart(), admin_checker)
      async def handle_admin_start(message: types.Message):
      await message.reply("Вы администратор и использовали команду /start!")

      # Другие обработчики...

      В этом примере мы используем `@dp.message_handler(CommandStart(), admin_checker)`, чтобы обработчик срабатывал только если пользователь является администратором и использовал команду `/start`.

      Таким образом, ты можешь комбинировать различные фильтры и декораторы, чтобы более гибко настраивать обработку сообщений. Если у тебя есть ещё вопросы или нужна помощь, дай знать!
  3. Nekro3
    Nekro3 19 янв 2025 Закажи разработку тут - lolz.live/threads/7578402/
    Python
    class IsAdminFilter(BaseFilter):
    async def __call__(self, message: Message) -> bool:
    return message.from_user.id in admin_ids
    юзай такой фильтр, потом ставишь его к роутеру через router.message.filter(IsAdminFilter())
     
    19 янв 2025 Изменено
  4. llimonix
    llimonix 19 янв 2025 lolz.live/threads/8634402/ - Лучшие телеграмм аккаунты :+rep: 24 053 20 янв 2020
    Python
    class IsAdmin(BaseFilter):
    async def __call__(self, message: Message) -> bool:
    return message.from_user.id in config.ADMIN_ID
    у меня в проекте так
     
    19 янв 2025 Изменено
    1. Посмотреть предыдущие комментарии (2)
    2. llimonix
    3. llimonix
      Окулист, у меня все функции поделены на файлы, поэтому я создаю сначала base_router тебе же можно и без него, так как если я ставлю фильтр на каждый роутер отдельно, то у меня фильтры срабатывают столько раз, сколько у меня роутер в проекте
  5. ToSa
    ToSa 19 янв 2025 гость, боже, храни кьют-рок. :beer::beer::beer: 24 040 18 дек 2021
    как вариант всему роутеру сделать фильтр:


    Python
    from aiogram.filters import Filter
    from aiogram import Router
    ADMINS = []

    class IsAdmin(Filter):
    async def __call__(self, message: Message) -> bool:
    return message.from_user.id in ADMINS

    adminRouter = Router()
    adminRouter.callback_query.filter(IsAdmin())
    adminRouter.message.filter(IsAdmin())
     
    19 янв 2025 Изменено
    1. Окулист Автор темы
      ToSa,
      Это в файле инициализации делать нужно?
      [IMG]
    2. ToSa
      Окулист, ну там где ты роутер создаешь, я не знаю твоего проекта
    3. Окулист Автор темы
      ToSa, уже разобрался, спасибо
Top
Загрузка...