Бот для групп/супергрупп: извлекает текст с изображений через OpenAI и проверяет на наличие запрещённого текста. Если текст содержит запрещённые строки, то удаляет сообщение, банит отправителя и уведомляет владельца чата.
- OCR через OpenAI: извлечение видимого текста из изображений
- Фильтрация по правилам: поддержка простых строк и регулярных выражений
- Автодействия: удаление сообщения, бан пользователя, уведомление владельца чата
- Безопасность и логгирование: ротация логов в
logs/tgimguard.log
- Python: >= 3.12
- Telegram Bot Token
- OpenAI API Key (или совместимый API, если меняете
OPENAI_BASE_URL)
- Создайте конфиг на основе примера:
env.example->.env - Заполните
.env: как минимумTELEGRAM_BOT_TOKEN,OPENAI_BASE_URLиOPENAI_API_KEY - Установите зависимости с использованием uv:
uv sync- Запустите бота:
uv run main.py- Добавьте бота в группу и выдайте ему права администратора (удаление сообщений, бан пользователей).
- Владелец группы должен запустить бота (/start), чтобы бот мог уведомлять его о спаме.
TELEGRAM_BOT_TOKEN— токен бота (обязательно)OPENAI_API_KEY— ключ OpenAI (обязательно)OPENAI_BASE_URL— базовый URL API (по умолчаниюhttps://api.openai.com/v1)OPENAI_MODEL_ID— модель, по умолчаниюgpt-4o-mini
Правила фильтрации определены в YAML-файлах в каталоге rules/. Каждый файл *.yaml — это одно правило.
Структура правила:
name: название правила
min_matches: 2
patterns:
- type: literal
value: строка для поиска
- type: regex
value: регулярное выражениеПараметры:
name— человекочитаемое название правила (опционально)min_matches— минимальное количество уникальных паттернов, которые должны совпасть, чтобы правило сработалоpatterns— массив паттернов для проверки:type: literal— простая подстрока, поиск без учёта регистраtype: regex— регулярное выражение Python (флаги через inline, например(?i))
Логика срабатывания:
Правило срабатывает, если в тексте найдено ≥ min_matches уникальных паттернов.
Примеры:
Простое правило (1 паттерн):
name: buy now spam
min_matches: 1
patterns:
- type: literal
value: buy nowКомбинированное правило (несколько паттернов):
name: водительские права
min_matches: 2
patterns:
- type: literal
value: водительск
- type: literal
value: прав
- type: literal
value: удостоверениеВ этом примере правило сработает, если найдены хотя бы 2 из 3 слов.
IMAGE_COMPRESSION_THRESHOLD_KB— порог размера, выше которого изображение ресайзится и преобразуются в JPEGIMAGE_RESIZE_WIDTH_PX— ширина в пикселях при ресайзеCHAT_OWNER_ID— ID владельца чата для уведомлений (опционально, иначе автоопределение)
- Пользователь отправляет изображение в групповой чат
- Бот скачивает файл, при необходимости сжимает/ресайзит
- Отправляет в OpenAI и получает извлечённый с изображения текст
- Проверяет текст на соответствие любому правилу из
rules/ - При совпадении: удаляет сообщение, банит отправителя, уведомляет владельца группы
- Файл:
logs/tgimguard.log(суточная ротация, хранение 30 дней)
- Бот реагирует только в чатах типов
groupиsupergroup - Для корректной работы нужны права: удаление сообщений и бан пользователей
- Чем проще и короче список правил, тем меньше ложных срабатываний