Загрузка...

Aiogram 3 - how to correctly check the user id for compliance with the admin sheet?

Thread in Python created by Окулист Jan 19, 2025. 164 views

  1. Окулист
    Окулист Topic starter Jan 19, 2025 Мы вас пока лечим 249 Nov 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. Экстази
    Экстази Jan 19, 2025 Banned 1141 Oct 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 Jan 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())
     
  4. llimonix
    llimonix Jan 19, 2025 lolz.live/threads/8634402/ - Лучшие телеграмм аккаунты :+rep: 24,052 Jan 20, 2020
    Python
    class IsAdmin(BaseFilter):
    async def __call__(self, message: Message) -> bool:
    return message.from_user.id in config.ADMIN_ID
    у меня в проекте так
     
    1. View previous comments (1)
    2. Окулист Topic starter
      llimonix,
      Это в файле инициализации делать нужно?
      [IMG]
    3. llimonix
    4. llimonix
      Окулист, у меня все функции поделены на файлы, поэтому я создаю сначала base_router тебе же можно и без него, так как если я ставлю фильтр на каждый роутер отдельно, то у меня фильтры срабатывают столько раз, сколько у меня роутер в проекте
  5. ToSa
    ToSa Jan 19, 2025 guest, боже, храни кьют-рок. :beer::beer::beer: 24,040 Dec 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())
     
    1. Окулист Topic starter
      ToSa,
      Это в файле инициализации делать нужно?
      [IMG]
    2. ToSa
      Окулист, ну там где ты роутер создаешь, я не знаю твоего проекта
    3. Окулист Topic starter
      ToSa, уже разобрался, спасибо
Top
Loading...