@marakhd

Фильтр aiogram 3 (проверка на админа группы)?

Делаю бота модератора, и мне нужно создать в нем фильтр is_admin, прогуглил все форумы, обыскал
половину интернета и нашел только это

Фильтр должен проверять именно, то что пользователь написавший сообщение админ группы (супер группы)!!!

<b>class IsAdminChatF(BoundFilter):
    key = "is_admin"

    def __init__(self, is_admin):
        self.is_admin = is_admin

    async def __call__(self, message: types.Message) -> bool:
        member = await message.bot.get_chat_member(message.chat.id, message.from_user.id)
        return member.is_chat_admin()</b>

Этот код не работает, понял что он от aiogram 2, погуглил и заменил BoundFilter просто на Filter (естественно я не забыл его импортировать), но даже так этот фильтр не работает...

В чем может быть причина?
  • Вопрос задан
  • 1103 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Causon
Пример фильтра как класс на проверку прав доступа.
В данном случае, id внесены просто в словарь.

from aiogram.filters import BaseFilter

admin_ids = [123, 456]

class IsAdmin(BaseFilter):
    def __init__(self, admin_ids) -> None:
        self.admin_ids = admin_ids
    
    async def __call__(self, message: Message) -> bool:
        return message.from_user.id in self.admin_ids


Пример хендлера с использованием фильтра:

@router.message(IsAdmin(admin_ids), F.text == "admin")
async def admin_handler(message: Message) -> None:
    kb_admin = [
        [types.KeyboardButton(text="Статистика")],
        [types.KeyboardButton(text="Выход")],
        [types.KeyboardButton(text="Настройки")],
    ]
    keyboard_admin = types.ReplyKeyboardMarkup(
        keyboard=kb_admin,
        resize_keyboard=True
    )
    await message.answer("Меню администратора", reply_markup=keyboard_admin)
Ответ написан
@Wratixor
тут есть https://wratixor.ru/about/about_me
Если именно на админа группы, а не по списку известных айдишников
в aiogram 3 в middleware сделал так
data['isadmin']: bool = (await event.chat.get_member(event.from_user.id)) in (await event.chat.get_administrators())

можно запихнуть в фильтр или в самом обработчике команды сделать через message вместо event
дополнительно нужна проверка, что это группа, а не личный чат, чтобы в консоль не ругалось
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы