Можно ли заблокировать или разблокировать пользователя по его никнейму с помощью aiogram?

Я разрабатываю команды для модераторов и хотел бы уточнить: возможно ли реализовать функцию разблокировки пользователя без использования сторонних библиотек, таких как pyrogram или telethon? В приведенном ниже фрагменте кода используется обработка команды разбанивания, и мне нужно знать, как узнать user_id пользователя по его юзернейму, если он не отвечает на сообщение. <br/> <br/> <pre><code class="python">@group_actions_router.message(Command("aunban", prefix="/!"))
async def cmd_unban(message: types.Message):
    if not message.reply_to_message:
        msg = message.text.split()
        username = msg[1]
        # Дальше то, что поможет узнать user_id пользователя по юзернейму пользователя
    else:
        if message.reply_to_message.from_user.id == message.from_user.id:
            await message.reply("Вы не можете разбанить самого себя")
        else:
            with suppress(TelegramBadRequest):
                await message.reply(f"✔️ Пользователь &lt;b&gt;{message.reply_to_message.from_user.first_name}&lt;/b&gt; разбанен", parse_mode='HTML')
                await message.bot.unban_chat_member(chat_id=message.chat.id, user_id=message.reply_to_message.from_user.id, only_if_banned=True)
                print(f"[INFO] {message.from_user.id} разбанил {message.reply_to_message.from_user.id}")</code></pre> <br/> <br/>
  • 21 ноября 2024 г. 16:53
Ответы на вопрос 2
В библиотеке `aiogram` вы можете использовать метод `get_users` или `get_chat_member`, чтобы получить информацию о пользователе по его юзернейму. Однако, поскольку Telegram API не предоставляет прямого метода для получения `user_id` по юзернейму, вам нужно будет использовать метод `search_chat_members` или `get_chat_administrators` в случае, если ваш бот является администратором этого чата.

Обратите внимание, что поиск пользователей по юзернейму возможен только для пользователей, которые находятся в одной группе или канале, где находится ваш бот. 

Вот пример того, как можно реализовать вашу функцию разблокировки пользователя по его юзернейму:

```python
from aiogram import types
from aiogram.dispatcher.filters import Command
from aiogram.utils.exceptions import TelegramBadRequest, Unauthorized

@group_actions_router.message(Command("aunban", prefix="/!"))
async def cmd_unban(message: types.Message):
    if not message.reply_to_message:
        msg = message.text.split()
        if len(msg) < 2:
            await message.reply("Укажите юзернейм пользователя для разблокировки.")
            return
        
        username = msg[1].lstrip('@')  # Убираем '@' перед ником, если он есть 

        # Получаем список участников чата
        try:
            members = await message.chat.get_members_count()  # Получаем общее кол-во участников
            async for member in message.chat.iter_members():  # Итерация по участникам
                if member.user.username == username:
                    user_id = member.user.id
                    break
            else:
                await message.reply("Пользователь не найден в чате.")
                return

        except Exception as e:
            await message.reply(f"Ошибка при получении участников: {str(e)}")
            return
        
    else:
        user_id = message.reply_to_message.from_user.id

    if user_id == message.from_user.id:
        await message.reply("Вы не можете разбанить самого себя")
        return

    try:
        await message.bot.unban_chat_member(chat_id=message.chat.id, user_id=user_id, only_if_banned=True)
        await message.reply(f"✔️ Пользователь <b>{username}</b> разбанен", parse_mode='HTML')
        print(f"[INFO] {message.from_user.id} разбанил {user_id}")
    except TelegramBadRequest:
        await message.reply("Ошибка при разблокировке пользователя.")
    except Unauthorized:
        await message.reply("У бота нет прав для разблокировки пользователя.")
```

Здесь мы используем метод `message.chat.iter_members()`, чтобы пройтись по всем членам чата и найти того, у кого совпадает никнейм.

Учтите, что этот код может занять некоторое время при большом количестве участников, но он работает без сторонних библиотек.
Похожие вопросы