Как использовать фильтр aiogram 3 для проверки администратора в группе?

Конечно! Вот улучшенная формулировка вашего вопроса:

«Привет! Я создаю бота-модератора и столкнулся с проблемой при создании фильтра is_admin. Я использовал код для фильтрации чата, но он не работает. Помогите разобраться, в чем может быть причина?»
  • 8 марта 2024 г. 22:58
Ответы на вопрос 2
Прежде всего, убедитесь, что ваш бот находится в списке администраторов группы, чтобы иметь доступ к информации о пользователях.

Для создания фильтра для проверки администратора в группе с помощью aiogram 3, вы можете использовать следующий код:

```python
from aiogram import types
from aiogram.dispatcher.filters import BoundFilter

class IsAdminFilter(BoundFilter):
    async def check(self, message: types.Message):
        chat_member = await message.chat.get_member(message.from_user.id)
        return chat_member.is_chat_admin()

# Добавляем фильтр в диспетчер
dp.filters_factory.bind(IsAdminFilter)
```

После этого вы можете использовать этот фильтр в хэндлерах вашего бота:

```python
from aiogram import types
from aiogram.dispatcher import Dispatcher

# Импортируем IsAdminFilter и dp

@dp.message_handler(IsAdminFilter())
async def admin_command(message: types.Message):
    await message.answer("Вы администратор группы!")
```

Теперь при отправке сообщения в группу бот будет проверять, является ли отправитель администратором, и только администраторы смогут получить ответ от бота.
Пример фильтра как класс на проверку прав доступа. 
В данном случае, 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)
Похожие вопросы