Проблема, с которой вы столкнулись, связана с тем, что вы пытаетесь получить `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`, то бот будет корректно находить и обрабатывать запрос о бане, не зависимо от того, в ответ на сообщение это сделано или нет.