Что делать, если вместо указанного @username в чате отображается имя владельца?

Я работал над кодом, но столкнулся с проблемой: когда я использую команду /ban @username, вместо указанного @username отображается тег владельца чата. При ответе на сообщения такой ситуации не возникает. Я перепроверил всю информацию в интернете и не нашел решения. Можете помочь? <br/> <br/> Код: <br/> <br/> <pre><code class="python">import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.types import ChatPermissions
from aiogram import F
from aiogram.client.session.aiohttp import AiohttpSession

API_TOKEN = "token"

logging.basicConfig(level=logging.INFO)

# Создание бота и диспетчера
session = AiohttpSession()

bot = Bot(token=API_TOKEN, session=session)
dp = Dispatcher()

@dp.message(F.text.startswith("/ban"))
async def ban_user(message: types.Message):
    if not message.reply_to_message:
        await message.reply("Используйте команду в ответ на сообщение пользователя, которого хотите уволить!")
        return

    user_to_ban = message.reply_to_message.from_user
    user_id = user_to_ban.id
    username = user_to_ban.username or "Бездарь"

    chat_member = await bot.get_chat_member(message.chat.id, user_id)
    if chat_member.status == "creator":
        await message.reply("⚠ Невозможно уволить владельца чата!")
        return
    if user_id == message.from_user.id:
        await message.reply("⚠ Нельзя уволить самого себя!")
        return

    epic_messages = [
        f" Приказ об увольнении подписан! @{username}, твоя карьера подошла к концу!",
        " Надзиратель уже ставит свою подпись...",
        " Охрана уже идёт за тобой...",
        f" @{username} уволен! Его пропуск деактивирован, а вещи собраны в коробку и скинуты с 19 этажа!"
  • 23 февраля 2025 г. 0:14
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с тем, что вы пытаетесь получить `username` для забаненного пользователя, но вместо этого получаете информацию об владельце чата, если команда вызвана не в ответ на сообщение конкретного пользователя. Чтобы это исправить, вы можете изменить логику обработки команды `/ban`, чтобы правильно извлекать пользователя по его `username` в случае, если команда была вызвана не в ответ на сообщение. 

Вот как вы можете это сделать:

1. Использовать регулярные выражения для извлечения `username` из команды `/ban @username`.
2. Проверить правильность введенного `username`.
3. Далее, использовать полученный `username` для получения информации о пользователе в чате.

Вот исправленный код:

```python
import asyncio
import logging
import re
from aiogram import Bot, Dispatcher, types
from aiogram.types import ChatPermissions
from aiogram import F
from aiogram.client.session.aiohttp import AiohttpSession

API_TOKEN = "token"

logging.basicConfig(level=logging.INFO)

# Создание бота и диспетчера
session = AiohttpSession()
bot = Bot(token=API_TOKEN, session=session)
dp = Dispatcher()

@dp.message(F.text.startswith("/ban"))
async def ban_user(message: types.Message):
    # Проверяем, если команда была выполнена в ответ на сообщение
    if message.reply_to_message:
        user_to_ban = message.reply_to_message.from_user
    else:
        # Извлекаем username из команды
        match = re.search(r'@([a-zA-Z0-9_]+)', message.text)
        if not match:
            await message.reply("Пожалуйста, укажите пользователя для бана в формате /ban @username")
            return
        username = match.group(1)

        # Получаем информацию о пользователе по username
        user_to_ban = await bot.get_chat_member(message.chat.id, username)
        if not user_to_ban:
            await message.reply(f"Пользователь @{username} не найден в этом чате.")
            return

    user_id = user_to_ban.user.id

    # Проверяем право удалить пользователя
    chat_member = await bot.get_chat_member(message.chat.id, user_id)
    if chat_member.status == "creator":
        await message.reply("⚠ Невозможно уволить владельца чата!")
        return
    if user_id == message.from_user.id:
        await message.reply("⚠ Нельзя уволить самого себя!")
        return

    # Ваши сообщения
    epic_messages = [
        f" Приказ об увольнении подписан! @{user_to_ban.user.username}, твоя карьера подошла к концу!",
        " Надзиратель уже ставит свою подпись...",
        " Охрана уже идёт за тобой...",
        f" @{user_to_ban.user.username} уволен! Его пропуск деактивирован, а вещи собраны в коробку и скинуты с 19 этажа!"
    ]
   
    # Теперь отправляем сообщения
    for message in epic_messages:
        await message.reply(message)

    # Если нужно, можно забанить пользователя
    await bot.ban_chat_member(message.chat.id, user_id)

# Запуск бота
if __name__ == '__main__':
    from aiogram import executor
    executor.start_polling(dp, skip_updates=True)
```

В этом коде мы добавили возможность извлекать `@username` из текста команды `/ban`, если команда не была вызвана в ответ на сообщение другого пользователя. Таким образом, если вы передали команду как `/ban @username`, то бот будет корректно находить и обрабатывать запрос о бане, не зависимо от того, в ответ на сообщение это сделано или нет.
У вас отсутствует логика для выполнения команды /ban @username . 
Вы обрабатываете только случай, когда команда используется в ответ на сообщение.
Похожие вопросы