✅ Регистрация и верификация жильцов ✅ Рейтинг активности (уровни) ✅ Детект шпионов (Score 0-100) ✅ Анти-мат система (3 предупреждения → бан) ✅ Админ-панель с рассылкой ✅ Учёт квартир (несколько жильцов) ✅ Телефоны экстренных служб и мастеров ✅ Еженедельный экспорт JSON ✅ Прокси (socks5) для обхода РКН Бекап: backups/versions/v1.0_mvp_2026-02-26/ Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
11 KiB
🚦 Анти-спам лимиты — v1.3
Версия: v1.3 Дата: 26 февраля 2026 г. Статус: ✅ Реализовано
📋 Описание
Защита от флуда (спама сообщениями). Бот подсчитывает количество сообщений от каждого пользователя за период времени. При превышении лимита — предупреждает, при повторных нарушениях — мутит.
🎯 Возможности
- ✅ Подсчёт сообщений за период (10 за 60 сек)
- ✅ Авто-удаление сообщений при превышении лимита
- ✅ Система предупреждений (2 → мут)
- ✅ Мут на 30 минут (настраивается)
- ✅ Уведомление админа о нарушениях
- ✅ Команды мута/размута вручную
- ✅ Проверка истечения мута
⚙️ Настройки по умолчанию
| Параметр | Значение |
|---|---|
| Макс. сообщений | 10 |
| За период | 60 секунд |
| Предупреждений до мута | 2 |
| Длительность мута | 30 минут |
| Исключать админов | ✅ Да |
📱 Команды админа
Мут/размут:
| Команда | Описание | Пример |
|---|---|---|
/mute <ID> [минуты] |
Замутить пользователя | /mute 123456789 30 |
/unmute <ID> |
Размутить пользователя | /unmute 123456789 |
/check_mute <ID> |
Проверить статус мута | /check_mute 123456789 |
/muted |
Список замученных | /muted |
Статистика:
| Команда | Описание | Пример |
|---|---|---|
/rate_stats |
Статистика лимитов | /rate_stats |
/user_rate <ID> |
Статистика пользователя | /user_rate 123456789 |
/clear_rate_warnings <ID> |
Сбросить предупреждения | /clear_rate_warnings 123456789 |
🎯 Сценарии использования
Сценарий 1: Превышение лимита (флуд)
Пользователь быстро отправляет 10 сообщений:
Привет!
Как дела?
Что нового?
Кто сегодня будет?
Во сколько встреча?
Где встреча?
Нужно взять что-то?
Сколько стоит?
Кто организует?
Можно с детьми?
Бот:
- ✅ Находит превышение лимита (10 за 60 сек)
- ✅ Удаляет 11-е сообщение
- ✅ Пишет нарушителю в личку:
⚠️ Предупреждение #1 Вы превысили лимит сообщений! 📊 Ваши нарушения: 1 из 2 Лимит: 10 сообщений за 60 сек. Вы отправили: 10 сообщ. При достижении 2 предупреждений вы будете замучены на 30 мин. - ✅ Уведомляет админа:
⚠️ ФЛУД В ЧАТЕ! Пользователь: Иван Иванов ID: 123456789 Квартира: 45 Сообщений: 10 (лимит: 10) Предупреждений: 1 из 2
Сценарий 2: Повторный флуд — МУТ
Пользователь снова флудит через 5 минут:
Бот:
- ✅ Находит превышение
- ✅ Удаляет сообщение
- ✅ Пишет предупреждение #2
- ✅ Мутит на 30 минут
- ✅ Пишет пользователю:
🔇 ВЫ ЗАМУЧЕНЫ Причина: Превышение лимита сообщений (2 предупреждений). Мут до: 26.02.2026 17:30 Вы не сможете писать в чат до указанного времени.
Сценарий 3: Ручной мут админом
Админ видит что пользователь нарушает:
Админ:
/mute 123456789 60
Бот:
🔇 Пользователь замучен
Пользователь: Иван Иванов
ID: 123456789
До: 26.02.2026 18:00
Пользователь не сможет писать в чат до указанного времени.
Сценарий 4: Истечение мута
Через 30 минут:
Бот автоматически:
- ✅ Проверяет истёк ли мут
- ✅ Размучивает пользователя
- ✅ Следующее сообщение пользователя пропускается
Сценарий 5: Проверка статуса мута
Админ:
/check_mute 123456789
Бот:
⏳ Мут активен
Пользователь: Иван Иванов
ID: 123456789
Осталось: 15 мин.
До: 26.02.2026 17:30
Или если мут истёк:
✅ Мут истёк
Пользователь: Иван Иванов
ID: 123456789
Пользователь размучен автоматически.
Сценарий 6: Список всех замученных
Админ:
/muted
Бот:
🔇 Замученные пользователи
• Иван Иванов (кв. 45) — ещё 25 мин.
• Петр Петров (кв. 88) — ещё 10 мин.
Сценарий 7: Статистика лимитов
Админ:
/rate_stats
Бот:
📊 Статистика лимитов сообщений
⚙️ Настройки:
├─ Максимум сообщений: 10
├─ За период: 60 сек
├─ Длительность мута: 30 мин
└─ Предупреждений перед мутом: 2
🔥 Нарушители (3)
⚠️ Иван Иванов — 8 сообщ.
⚠️ Петр Петров — 6 сообщ.
🔇 Василий Сидоров — 12 сообщ.
🗄️ База данных
Таблица message_rates:
CREATE TABLE message_rates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id BIGINT NOT NULL,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id)
)
Поля в users:
ALTER TABLE users ADD COLUMN is_muted BOOLEAN DEFAULT 0
ALTER TABLE users ADD COLUMN mute_until TIMESTAMP
ALTER TABLE users ADD COLUMN rate_limit_warnings INTEGER DEFAULT 0
🧪 Тестирование
Чек-лист проверки:
1. Быстрая отправка сообщений
# С другого аккаунта:
# Отправить 10 сообщений за 1 минуту
- 11-е сообщение удалено
- Пришло предупреждение #1 в личку
- Админ получил уведомление
2. Повторный флуд
# Через 5 минут снова отправить 10 сообщений
- Предупреждение #2
- Пользователь замучен
- Сообщения удаляются
3. Проверка мута
# Админ:
/check_mute <ID>
/muted
- Показывает правильный статус
- Оставшееся время верно
4. Истечение мута
# Подождать 30 минут
# Отправить сообщение
- Сообщение прошло
- Мут снят автоматически
5. Ручной мут/размут
# Админ:
/mute <ID> 10
/unmute <ID>
- Мут работает
- Размут работает
📁 Изменённые файлы
| Файл | Изменения |
|---|---|
services/rate_limiter.py |
Новый сервис лимитов |
handlers/ratelimit.py |
Новые хендлеры |
handlers/chat_monitor.py |
Проверка лимитов |
database/models.py |
Модели MessageRate + поля |
database/migrate_add_rate_limits.py |
Миграция БД |
handlers/__init__.py |
Импорт ratelimit_router |
main.py |
Регистрация ratelimit_router |
🚀 Как использовать
Для админа:
-
Посмотреть статистику:
/rate_stats -
Замутить нарушителя:
/mute 123456789 30 -
Проверить пользователя:
/user_rate 123456789
Для жильца:
Ничего делать не нужно! Бот работает автоматически.
Если получил предупреждение:
- Не отправляй много сообщений подряд
- Подожди минуту перед новой серией
💡 Советы
Настройка лимитов:
Для активного чата (100+ сообщений/мин):
- Увеличь лимит:
max_messages = 15 - Уменьшь период:
period_seconds = 30
Для спокойного чата:
- Уменьшь лимит:
max_messages = 5 - Увеличь период:
period_seconds = 120
Когда мутить вручную:
- ✅ Троллинг
- ✅ Оскорбления
- ✅ Намеренный флуд
- ✅ Спам ссылками (вместе с чёрным списком)
🔧 Отладка
Посмотреть сообщения в БД:
cd /home/matrixhasyou/domovoy_bot
source venv/bin/activate
sqlite3 database/domovoy.db
SELECT user_id, COUNT(*) as msg_count, MAX(timestamp) as last_msg
FROM message_rates
WHERE timestamp > datetime('now', '-1 minute')
GROUP BY user_id
ORDER BY msg_count DESC;
Логи:
tail -f logs/bot.log | grep -i "флуд\|мут"
✅ Преимущества
| Было | Стало |
|---|---|
| Флуд в чате | Авто-удаление |
| Нет защиты | Лимит 10 сообщ./мин |
| Ручной контроль | Авто-мут |
| Нет статистики | /rate_stats |
Защита от флуда готова! 🛡️
Следующий шаг: тестирование на тестовой группе и фиксация версии v1.3