Files
PrimoGuardBot-/README.md

762 lines
35 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🛡️ PrimoGuard Bot
**Умный бот-модератор для Telegram** с системой фильтрации спама, банвордов и защитой от флуда.
[
[
[
***
## 📑 Содержание
- [Возможности](#-возможности)
- [Быстрый старт](#-быстрый-старт)
- [Конфигурация](#-конфигурация)
- [Команды](#-команды)
- [Система фильтрации](#-система-фильтрации)
- [Middleware](#-middleware)
- [Примеры использования](#-примеры-использования)
- [Troubleshooting](#-troubleshooting)
- [FAQ](#-faq)
***
## 🎯 Возможности
### Основные функции
**Многоуровневая система фильтрации:**
- 🔤 **Substring** — фильтрация по подстрокам (например: `хуй`)
- 📖 **Lemma** — фильтрация по лемматизации (например: `пидорас``пидор`, `пидорасом`, `пидораса`)
- 🧩 **Part** — фильтрация по частям слов без спецсимволов (например: `@Astrixkeepbot` → заблокирует `astrix` и `bot`)
**Временные правила:**
- ⏰ Банворды с истечением срока действия
- 🔄 Автоматическая очистка истёкших правил
**Режимы модерации:**
- 🔇 **Silence Mode** — удаление всех сообщений (режим тишины)
- ⚔️ **Conflict Mode** — блокировка конфликтных слов (для предотвращения споров)
-**Whitelist** — исключения для разрешённых слов
**Умный антиспам:**
- 🤖 Адаптивные лимиты (текст, пересылки, медиа, callback)
- 🧠 Детекция спам-паттернов (идентичные сообщения, спам кнопок)
- ⭐ Система репутации пользователей (0.5x - 2.0x к лимитам)
- 🚫 Прогрессивные блокировки (1 мин → 2 мин → 5 мин → 15 мин → 1 час)
**Статистика и аналитика:**
- 📊 Топ-10 самых частых срабатываний
- 👥 Статистика по пользователям
- 📈 Общее количество удалённых сообщений
**Администрирование:**
- 👨‍💼 Многоуровневая система администраторов
- 🔔 Уведомления админов о спаме
- 🎛️ Удобное управление через команды и callback-кнопки
***
## 🚀 Быстрый старт
### 1. Клонируйте репозиторий
```bash
git clone https://github.com/yourusername/primo_guard_bot.git
cd primo_guard_bot
```
### 2. Создайте файл `.env`
```bash
cp .env.example .env
nano .env
```
**Минимальная конфигурация:**
```env
# === BOT SETTINGS ===
BOT_TOKEN=YOUR_BOT_TOKEN_FROM_BOTFATHER
# === ADMIN IDS ===
OWNER_ID=[123456789,987654321]
ADMIN_CHAT_ID=-1001234567890
# === WEBHOOK (если используете) ===
WEBHOOK=true
WEBHOOK_URL=https://yourdomain.com/webhook
SECRET_TOKEN=your_random_secret_32_chars_here
# === SERVER ===
WEBAPP_HOST=0.0.0.0
WEBAPP_PORT=3131
```
### 3. Запустите через Docker Compose
```bash
docker compose up -d
```
### 4. Проверьте логи
```bash
docker compose logs -f
```
### 5. Добавьте бота в группу
1. Добавьте бота в вашу группу
2. Выдайте права администратора (удаление сообщений)
3. Отправьте `/start` в группе
***
## ⚙️ Конфигурация
### Полный `.env` файл
```env
# ═══════════════════════════════════════════════════════════════════════════
# 🤖 BOT TOKEN
# ═══════════════════════════════════════════════════════════════════════════
# [ОБЯЗАТЕЛЬНО] Токен бота от @BotFather
BOT_TOKEN=1234567890:ABCdefGHIjklMNOpqrsTUVwxyz
# ═══════════════════════════════════════════════════════════════════════════
# 👤 АДМИНИСТРАТОРЫ И ID
# ═══════════════════════════════════════════════════════════════════════════
# [ОБЯЗАТЕЛЬНО] ID владельцев бота (список через запятую)
OWNER_ID=[123456789,987654321]
# [ОБЯЗАТЕЛЬНО] ID чата для уведомлений админов
ADMIN_CHAT_ID=-1001234567890
# Дополнительные админы (необязательно)
ADMIN_ID=[111111111,222222222]
# ═══════════════════════════════════════════════════════════════════════════
# ⚙️ ОСНОВНЫЕ НАСТРОЙКИ БОТА
# ═══════════════════════════════════════════════════════════════════════════
# Имя бота
BOT_NAME=PrimoGuard Bot
# Описание бота (до 512 символов)
BOT_DESCRIPTION=Бот-модератор для защиты чата от спама и нецензурных слов
# Короткое описание (до 120 символов)
BOT_SHORT_DESCRIPTION=Тех.поддержка: @yourusername
# Автоматически обновлять настройки бота при запуске
BOT_EDIT=false
# ═══════════════════════════════════════════════════════════════════════════
# 🌐 WEBHOOK SETTINGS
# ═══════════════════════════════════════════════════════════════════════════
# Использовать webhook вместо long polling
# false = long polling (для локальной разработки)
# true = webhook (для продакшена, требует HTTPS)
WEBHOOK=true
# URL вебхука (обязателен если WEBHOOK=true)
WEBHOOK_URL=https://yourdomain.com/webhook
# Секретный токен для вебхука (генерируется автоматически если не указан)
SECRET_TOKEN=vK8mP2nQ7xR4wJ9sL6fY3tB5hN0cV1zA
# Хост для сервера (обычно 0.0.0.0)
WEBAPP_HOST=0.0.0.0
# Порт для сервера
WEBAPP_PORT=3131
# Уровень логов (debug, info, warning, error, critical)
LOG_LEVEL=info
# Включить access log
ACCES_LOG=false
# ═══════════════════════════════════════════════════════════════════════════
# 📊 DATABASE
# ═══════════════════════════════════════════════════════════════════════════
# Путь к базе данных SQLite
DATABASE_PATH=banwords.db
# ═══════════════════════════════════════════════════════════════════════════
# 🔧 ДОПОЛНИТЕЛЬНЫЕ НАСТРОЙКИ
# ═══════════════════════════════════════════════════════════════════════════
# Префикс команд
PREFIX=/
# Таймаут между сообщениями (антиспам, секунды)
TIMEOUT=3
```
### Docker Compose
Ваш `docker-compose.yml` уже настроен оптимально:
```yaml
services:
primoguard:
image: whyverum/primo_guard_bot:latest
container_name: primoguard-bot
restart: unless-stopped
env_file:
- .env
volumes:
- ./banwords.db:/app/banwords.db
- ./Logs:/app/Logs
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
stop_grace_period: 30s
networks:
- proxy
networks:
proxy:
external: true
```
***
## 📝 Команды
### Основные команды
| Команда | Описание | Доступ |
|---------|----------|--------|
| `/start` | Запуск бота и главное меню | Все |
| `/help` | Помощь по командам | Все |
| `/stats` | Статистика модерации | Админы |
| `/id` | Информация о вашем аккаунте | Все |
| `/chatid` | ID текущего чата | Все |
### Управление банвордами (постоянные)
| Команда | Пример | Описание |
|---------|--------|----------|
| `/addword` | `/addword хуй` | Добавить подстроку |
| `/addlemma` | `/addlemma пидорас` | Добавить лемму |
| `/addpart` | `/addpart astrix` | Добавить часть слова |
| `/remword` | `/remword хуй` | Удалить подстроку |
| `/remlemma` | `/remlemma пидорас` | Удалить лемму |
| `/rempart` | `/rempart astrix` | Удалить часть |
### Временные банворды
| Команда | Пример | Описание |
|---------|--------|----------|
| `/addtempword` | `/addtempword спам 24h` | Добавить временную подстроку (24 часа) |
| `/addtemplemma` | `/addtemplemma флудить 12h` | Добавить временную лемму (12 часов) |
| `/remtempword` | `/remtempword спам` | Удалить временную подстроку |
**Форматы времени:** `1h`, `24h`, `7d`, `30d`
### Исключения (whitelist)
| Команда | Пример | Описание |
|---------|--------|----------|
| `/addexcept` | `/addexcept психология` | Добавить в whitelist |
| `/remexcept` | `/remexcept психология` | Удалить из whitelist |
### Конфликтные слова
| Команда | Пример | Описание |
|---------|--------|----------|
| `/addconflictword` | `/addconflictword политика` | Добавить конфликтное слово |
| `/stopconflict` | `/stopconflict` | Включить режим антиконфликта |
| `/unstopconflict` | `/unstopconflict` | Выключить режим |
| `/conflictstatus` | `/conflictstatus` | Проверить статус режима |
### Режим тишины
| Команда | Описание |
|---------|----------|
| `/silence 30m` | Включить тишину на 30 минут |
| `/unsilence` | Выключить режим тишины |
| `/silencestatus` | Проверить статус |
| `/extend_silence 1h` | Продлить тишину на 1 час |
### Администрирование
| Команда | Пример | Описание |
|---------|--------|----------|
| `/addadmin` | `/addadmin @username` | Добавить администратора |
| `/remadmin` | `/remadmin @username` | Удалить администратора |
| `/listadmins` | `/listadmins` | Список администраторов |
| `/checkadmin` | `/checkadmin @username` | Проверить статус |
### Статистика
| Команда | Описание |
|---------|----------|
| `/userstats` | Статистика по пользователю |
| `/resetstats confirm` | Сбросить всю статистику |
### Просмотр правил
| Команда | Описание |
|---------|----------|
| `/listwords` | Список всех подстрок |
| `/listlemmas` | Список всех лемм |
| `/listparts` | Список всех частей |
| `/listexcept` | Список исключений |
| `/listconflict` | Список конфликтных слов |
### Утилиты
| Команда | Описание |
|---------|----------|
| `/emoji текст` | Извлечь все эмодзи из текста |
| `/ping` | Проверить отклик бота |
| `/checkwebhook` | Проверить статус webhook (админы) |
***
## 🔍 Система фильтрации
### 1. Substring (Подстроки)
**Как работает:** Простой поиск подстроки в тексте.
```
Правило: "хуй"
✅ Заблокирует: "хуй", "хуйня", "похуй", "нахуй"
Не заблокирует: "психология" (хотя содержит "хуй", но это безобидное слово)
```
**Когда использовать:** Для коротких и однозначных матов.
### 2. Lemma (Лемматизация)
**Как работает:** Приводит слова к нормальной форме и сравнивает.
```
Правило: "пидорас" (лемма: "пидор")
✅ Заблокирует: "пидорас", "пидораса", "пидорасом", "пидорасы"
Не заблокирует: "пидор123" (не является словом)
```
**Когда использовать:** Для блокировки всех форм слова.
### 3. Part (Части слов)
**Как работает:** Удаляет ВСЕ спецсимволы и ищет часть.
```
Правило: "astrix"
✅ Заблокирует: "@Astrixkeepbot", "astrix.bot", "a-s-t-r-i-x"
Не заблокирует: "astronomy" (не содержит точную последовательность)
```
**Когда использовать:** Для блокировки упоминаний ботов/каналов со спецсимволами.
### 4. Whitelist (Исключения)
**Как работает:** Проверяется ПЕРВЫМ, до всех фильтров.
```
Whitelist: "психология"
✅ Пропустит: "я изучаю психологию"
✅ Пропустит: "психолог"
```
**Когда использовать:** Для безобидных слов, содержащих мат.
### 5. Временные правила
**Как работает:** Автоматически удаляются после истечения срока.
```
Команда: /addtempword флуд 24h
Результат: Слово "флуд" будет блокироваться 24 часа
```
**Когда использовать:** Для временных мер (события, рейды).
***
## 🛡️ Middleware
### 1. BanWordsMiddleware (Основная защита)
**Приоритет:** Высокий
**Применяется к:** Все текстовые сообщения
**Функции:**
- Проверка на substring, lemma, part
- Проверка временных банвордов
- Проверка whitelist
- Режим тишины
- Режим антиконфликта
**Pipeline проверки:**
```
1. Пропуск админов
2. Проверка whitelist → ПРОПУСТИТЬ
3. Silence Mode → УДАЛИТЬ
4. Conflict Mode + конфликтные слова → УДАЛИТЬ
5. Substring → УДАЛИТЬ
6. Part → УДАЛИТЬ
7. Lemma → УДАЛИТЬ
8. Временные банворды → УДАЛИТЬ
9. ✅ Пропустить сообщение
```
***
### 2. AntiSpamMiddleware (Умный антиспам)
**Приоритет:** Средний
**Применяется к:** Все сообщения и callback
**Функции:**
- ⚡ Адаптивные лимиты по типам сообщений
- 🧠 Детекция спам-паттернов
- ⭐ Система репутации (0.5x - 2.0x)
- 🚫 Прогрессивные блокировки
**Лимиты по умолчанию:**
| Тип | Лимит | Окно | Описание |
|-----|-------|------|----------|
| 📝 Текст | 8 сообщений | 10 сек | Обычные текстовые сообщения |
| ↗️ Пересылки | 20 сообщений | 10 сек | Можно массово пересылать! |
| 🔘 Callback | 10 нажатий | 10 сек | Нажатия на кнопки |
| 📷 Медиа | 10 файлов | 10 сек | Фото, видео, документы |
| ⚡ Команды | ∞ | - | Не ограничены |
**Умная детекция:**
- ❌ 5 одинаковых текстов подряд → немедленная блокировка
- ❌ 8 нажатий одной кнопки → блокировка
- ❌ 7+ медиа подряд → предупреждение
**Система репутации:**
```
Новый пользователь: 1.0x (стандартные лимиты)
Хорошее поведение: до 2.0x (лимиты удваиваются!)
Плохое поведение: до 0.5x (лимиты снижаются вдвое)
```
**Прогрессивные блокировки:**
```
1 предупреждение → 2 мин блокировка
2 предупреждения → 4 мин
3 предупреждения → 8 мин
4 предупреждения → 16 мин
5+ предупреждений → 1 час (максимум)
```
***
### 3. LoggingMiddleware (Логирование)
**Приоритет:** Низкий
**Применяется к:** Все события
**Функции:**
- 📝 Логирование всех команд
- 📊 Логирование всех событий
- 🔍 Детальная информация для отладки
***
### 4. ErrorHandlingMiddleware (Обработка ошибок)
**Приоритет:** Последний
**Применяется к:** Все события
**Функции:**
- ❌ Перехват всех исключений
- 📧 Уведомления админов об ошибках
- 🔄 Graceful recovery
***
### 5. TimingMiddleware (Замер времени)
**Приоритет:** Первый
**Применяется к:** Все события
**Функции:**
- ⏱️ Замер времени выполнения
- 📊 Профилирование производительности
***
## 💡 Примеры использования
### Сценарий 1: Настройка для чата с матами
```bash
# 1. Добавляем основные маты
/addword хуй
/addword блять
/addlemma пидорас
/addlemma ебать
# 2. Добавляем исключения
/addexcept психология
/addexcept архитектура
# 3. Проверяем правила
/listwords
```
### Сценарий 2: Блокировка упоминаний ботов
```bash
# 1. Добавляем части названий ботов
/addpart astrix
/addpart keepbot
/addpart spambot
# 2. Проверяем
# ✅ Заблокируется: "@Astrixkeepbot", "astrix_bot"
```
### Сценарий 3: Временная блокировка темы
```bash
# Событие: выборы, запрещаем политику на 3 дня
/addtempword политика 3d
/addtempword выборы 3d
/addtemplemma голосовать 3d
# Через 3 дня слова автоматически разблокируются
```
### Сценарий 4: Режим тишины во время рейда
```bash
# 1. Включаем тишину на 1 час
/silence 1h
# Все сообщения от не-админов удаляются
# 2. Если рейд продолжается, продлеваем
/extend_silence 30m
# 3. Отключаем вручную
/unsilence
```
### Сценарий 5: Антиконфликтный режим
```bash
# 1. Добавляем конфликтные темы
/addconflictword политика
/addconflictword религия
/addconflictlemma спорить
# 2. Включаем режим
/stopconflict
# Теперь сообщения с этими словами удаляются
# 3. Выключаем после события
/unstopconflict
```
***
## 🔧 Troubleshooting
### Бот не отвечает в группе
**Решение:**
```bash
# 1. Проверьте права администратора
# Бот ДОЛЖЕН иметь право "Удаление сообщений"
# 2. Проверьте webhook
docker exec primoguard-bot python -c "
from configs import settings
import requests
url = f'https://api.telegram.org/bot{settings.BOT_TOKEN}/getWebhookInfo'
print(requests.get(url).json())
"
# 3. Проверьте логи
docker compose logs -f
# 4. Перезапустите
docker compose restart
```
### Ошибка 401 Unauthorized (Webhook)
**Причина:** Несовпадение SECRET_TOKEN
**Решение:**
```bash
# 1. Удалите webhook
curl "https://api.telegram.org/botYOUR_TOKEN/deleteWebhook?drop_pending_updates=true"
# 2. Проверьте .env файл
cat .env | grep SECRET_TOKEN
# 3. Перезапустите
docker compose down
docker compose up -d
```
### База данных заблокирована (database is locked)
**Решение:**
```bash
# 1. Остановите все контейнеры
docker compose down
# 2. Проверьте права
sudo chown -R $USER:$USER banwords.db
# 3. Запустите
docker compose up -d
```
### Бот не удаляет сообщения
**Проверьте:**
1. ✅ Бот — администратор группы
2. ✅ Есть право "Удаление сообщений"
3. ✅ Правила банвордов добавлены (`/listwords`)
4. ✅ Пользователь не в списке админов (`/listadmins`)
***
## ❓ FAQ
### Как узнать свой ID?
Отправьте `/id` боту или используйте @userinfobot
### Как узнать ID группы?
1. Добавьте бота в группу
2. Отправьте `/chatid` в группе
### Можно ли использовать без webhook?
Да! Установите в `.env`:
```env
WEBHOOK=false
```
### Как добавить несколько админов?
```env
OWNER_ID=[123456789,987654321,555666777]
ADMIN_ID=[111222333,444555666]
```
### Сколько правил можно добавить?
Ограничений нет, но рекомендуется до 1000 слов для оптимальной производительности.
### Работает ли на русском и английском?
Да! Поддерживаются все языки с Unicode.
### Как сделать backup базы данных?
```bash
# Создайте backup
cp banwords.db banwords_backup_$(date +%Y%m%d).db
# Или через Docker
docker cp primoguard-bot:/app/banwords.db ./backup/
```
### Как обновить бота?
```bash
# 1. Остановите
docker compose down
# 2. Обновите образ
docker pull whyverum/primo_guard_bot:latest
# 3. Запустите
docker compose up -d
```
### Влияет ли на производительность группы?
Нет! Бот обрабатывает сообщения за ~10-50мс. Для пользователей задержка незаметна.
***
## 📊 Мониторинг
### Просмотр логов
```bash
# Все логи
docker compose logs -f
# Только ошибки
docker compose logs -f | grep ERROR
# Последние 100 строк
docker compose logs --tail=100
# Логи за сегодня
docker compose logs --since $(date +%Y-%m-%d)
```
### Статистика Docker
```bash
# Использование ресурсов
docker stats primoguard-bot
# Информация о контейнере
docker inspect primoguard-bot
# Размер логов
docker logs primoguard-bot 2>&1 | wc -l
```
## 📄 Лицензия
MIT License - см. [LICENSE](LICENSE)
***
## 🙏 Благодарности
- [aiogram](https://github.com/aiogram/aiogram) - асинхронный фреймворк для Telegram Bot API
- [pymorphy2](https://github.com/pymorphy2/pymorphy2) - морфологический анализатор для русского языка
- [SQLAlchemy](https://www.sqlalchemy.org/) - ORM для работы с базой данных
***
**⭐ Если бот помог вам, поставьте звезду на GitHub!**