Как реализовать функцию anti_flood только для чата, не применяя ее к боту?

У меня есть рабочая, хотя и не очень качественно написанная функция антифлуда: <br/> <br/> <pre><code class="python">async def anti_flood(*args, **kwargs):
    message = args[0]
    muteint = int(1)
    await message.answer(f"{message.from_user.first_name}, Бан 1 минута за флуд!")
    await bot.restrict_chat_member(message.chat.id, message.from_user.id, until_date=int(time.time()) + muteint*30)</code></pre> <br/> <br/> Я не уверен, правильно ли описал обработчики, хотя они работают: <br/> <pre><code class="python">@dp.message_handler(content_types=['text'])
@dp.throttled(anti_flood, rate=1)
async def main(message: types.Message):
    handle = None</code></pre> <br/> <br/> <b>Основная проблема</b> заключается в том, что функция срабатывает при флуде непосредственно в чате с ботом, и, соответственно, бот не может заблокировать диалог со своим пользователем, что приводит к ошибке <b>Method is available only for supergroups</b>. <br/> <br/> Я понимаю, что нужно добавить проверку внутри функции <b>anti_flood</b>: <br/> <pre><code class="python">if message.from_user.id == message.chat.id:
............</code></pre> <br/> <br/> Однако эта проверка не работает... Можете ли вы подсказать, как правильно решить эту проблему? Заранее спасибо.
  • 22 февраля 2025 г. 9:14
Ответы на вопрос 1
Для того чтобы внедрить функцию антифлуда только в чате, но не применять ее к ботам, вам нужно убедиться, что проверка условий выполняется корректно. Ошибка `Method is available only for supergroups` возникает потому, что бот пытается применить ограничения к пользователю, находящемуся в одновременно и в чате с ботом.

Вам нужно изменить вашу функцию `anti_flood`, чтобы она могла распознавать, является ли сообщение из личного чата с ботом или из группового чата. Для этого можно добавить условие, проверяющее, что идентификатор чата не равен идентификатору пользователя.

Вот пример, как это сделать:

```python
import time
from aiogram import types
from aiogram.dispatcher import throttling

async def anti_flood(message: types.Message):
    # Проверяем, что сообщение пришло из группового чата
    if message.chat.type in ['group', 'supergroup']:
        muteint = 1
        await message.answer(f"{message.from_user.first_name}, Бан 1 минута за флуд!")
        await bot.restrict_chat_member(message.chat.id, message.from_user.id, until_date=int(time.time()) + muteint * 60)

@dp.message_handler(content_types=['text'])
@dp.throttled(anti_flood, rate=1)
async def main(message: types.Message):
    # Здесь добавьте логику обработки сообщения
    pass
```

### Объяснение изменений:

1. **Проверка типа чата**: Добавлена проверка `if message.chat.type in ['group', 'supergroup']`, чтобы выяснить, что сообщение пришло из групповки. Если это личное сообщение, функция не будет выполняться далее, избегая попытки применять ограничения к пользователю.

2. **Код ответа и кастомизация**: Не забудьте, что время бана указано в секундах, и в вашем случае пропускайте секундное значение, если хотите оставить одно значение (60 секунд = 1 минута).

3. **Правильное использование методов**: Убедитесь, что подключены все необходимые модули и настройки для работы с библиотекой aiogram.

Теперь функция антифлуда будет срабатывать только для сообщений, отправленных в группы, и избегать попыток применения ограничения на пользователе при прямом взаимодействии с ботом.
Похожие вопросы