Как добавить функцию бана пользователя в Telegram бота?

Как добавить функцию бана юзера по id в Telegram бота?

Т.е чтобы я мог ввести /ban {userid} и этот юзер больше не мог писать боту. aiogram


Ответы (2 шт):

Автор решения: Alexandr Kiselev

Как вариант добавить хендлер для /ban, который будет реагировать только на твой id (как админа), и добавить хендлер первым в очереди, который будет отлавливать заблокированных пользователей.

Я знаю два возможных варианта. Приведу наиболее простой. Я предполагаю, что ты используешь БД для хранения id пользователей
Добавить функцию, которая достает всех забаненных пользователей и хендлер, который будет сопоставлять id пользователя, совершившего действие и id, которые лежат в забаненных, можно такой:

@dp.message_handler(content_types=ContentType.TEXT)
async def check_ban(message: types.Message):  
ban_ids = # ban_ids - Забаненные пользователи, в моем случае список
if message.from_user.id in ban_ids:  
    pass # Тут любое действие при совпадении
→ Ссылка
Автор решения: Oleg
  1. Создай хранилище нарушителей. Для примера буду использовать обычный сет.
banned_users = set()
  1. Создай хэндлер для нарушителей
@dp.message_handler(user_id=banned_users)
async def handle_banned(msg: Message):
    print(f"{msg.from_user.full_name} пишет, но мы ему не ответим!")
    return True
  1. Создай хэндлер для нормальных пользователей
@dp.message_handler()
async def handle_all(msg: Message):
    await msg.reply(f"Добрый день, {msg.from_user.full_name} :)")
  1. Создай хэндлер для блокировки
@dp.message_handler(commands=['ban'], user_id=12312312312312) # здесь укажи свой ID
async def handle_ban_command(msg: Message):
    # проверяем, что ID передан правильно
    try:
        abuser_id = int(msg.get_args())
    except (ValueError, TypeError):
        return await msg.reply("Укажи ID пользователя.")
    
    banned_users.add(abuser_id)
    await msg.reply(f"Пользователь {abuser_id} заблокирован.")
  1. Не забудь соблюдать правильный порядок хэндлеров, т.к. если поменять пп. 2 и 3, то работать код не будет.

Итого

...

banned_users = set()


@dp.message_handler(user_id=banned_users)
async def handle_banned(msg: Message):
    print(f"{msg.from_user.full_name} пишет, но мы ему не ответим!")
    return True


@dp.message_handler()
async def handle_all(msg: Message):
    await msg.reply(f"Добрый день, {msg.from_user.full_name} :)")


@dp.message_handler(commands=['ban'], user_id=12312312312312) # здесь укажи свой ID
async def handle_ban_command(msg: Message):
    # проверяем, что ID передан правильно
    try:
        abuser_id = int(msg.get_args())
    except (ValueError, TypeError):
        return await msg.reply("Укажи ID пользователя.")
    
    banned_users.add(abuser_id)
    await msg.reply(f"Пользователь {abuser_id} заблокирован.")

→ Ссылка