RedAirsoft VK to Telegram & MAX Messenger Poster

Автоматизированный Docker-сервис для периодического парсинга новых постов из сообщества ВКонтакте (Red Airsoft | Страйкбол) и их одновременной публикации в Telegram и мессенджер МАКС (MAX Messenger) с отчётами администраторам.


📌 Инфраструктура и Деплой

Параметр Значение
Хост Proxmox 192.168.1.222 (root SSH через ключ ~/.ssh/id_ed25519_proxmox)
LXC Контейнер CT 107 (redairsoft-poster, IP: 192.168.1.106, Debian 12)
Ресурсы LXC 2 vCPU, 1.5 GB RAM, 512 MB Swap, 16 GB Disk, onboot=1
Gitea Репозиторий http://192.168.1.135:3000/exostring/redairsoft_vk_gt_max_sender
Gitea SSH Remote ssh://git@192.168.1.135:2222/exostring/redairsoft_vk_gt_max_sender.git
Путь проекта на LXC 107 /opt/redairsoft_poster/
Имя Docker контейнера redairsoft-vk-poster
Локальный Telegram Bot API Встроен в контейнер (http://127.0.0.1:8081), поддерживает загрузку видео до 2 ГБ
База данных SQLite /opt/redairsoft_poster/data/poster.db (персистентный том Docker ./data)

🚀 Управление проектом (Команды из консоли / PowerShell)

Все команды выполняются через Proxmox хост:

# 1. Посмотреть статус и логи бота:
ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- docker logs --tail 50 redairsoft-vk-poster'

# 2. Логи в реальном времени (follow):
ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- docker logs -f redairsoft-vk-poster'

# 3. Запустить проект:
ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- bash -c "cd /opt/redairsoft_poster && docker-compose up -d"'

# 4. Остановить проект:
ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- bash -c "cd /opt/redairsoft_poster && docker-compose stop"'

# 5. Обновить из Gitea и пересобрать:
ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- bash -c "cd /opt/redairsoft_poster && git pull origin main && docker-compose build && docker-compose up -d"'

⚙️ Как работает сервис

  1. Опрос стены ВКонтакте:
    • Каждые 15 минут делает запрос к методу wall.get для группы public36860851 (owner_id: -36860851).
    • Фильтрует посты автора (без репостов и рекламы сторонних сообществ).
  2. Защита от спама и режим запуска (BOOTSTRAP_MODE):
    • Установлен режим BOOTSTRAP_MODE=skip_existing.
    • При первом запуске или перезапуске сервис запоминает текущие посты стены и ничего не публикует, пока в ВК не выйдет новый пост.
  3. Загрузка медиа и поддержка длинных видео:
    • Картинки скачиваются в максимальном разрешении.
    • Видео загружается через yt-dlp в качестве до 720p (длительностью до 2 часов и размером до 2000 МБ).
    • Встроенный в контейнер локальный telegram-bot-api загружает тяжелые видеофайлы напрямую в Telegram без ограничений облачного API (20-50 МБ).
  4. Форматирование текста:
    • Ссылки ВКонтакте вида [club123|Название] и [id123|Имя] преобразуются в корректные кликабельные HTML-ссылки.
    • Первый абзац / заголовок выделяется жирным шрифтом <b>...</b>.
    • Удаляются разделительные полосы (━━━, ───) и лишние переносы строк.
  5. Публикация в мессенджер МАКС:
    • Загрузка медиа в МАКС через /uploads?type=photo и /uploads?type=video.
    • Поллинг готовности видео (/videos/{token}) перед публикацией сообщения.
  6. Отчёты администраторам:
    • После успешной публикации или при ошибке бот отправляет отчёт со ссылками на оригинальный пост в ВК, Telegram и МАКС в личные сообщения администраторам (TG_ADMIN_IDS).
  7. Очистка диска и кэша:
    • Временные файлы удаляются сразу после публикации.
    • Фоновый воркер cleaner.py каждые 15 минут удаляет старые файлы из /tmp/poster_cache, гарантируя защиту активных скачиваний через реестр локов.

🔑 Конфигурация (.env)

Переменная Описание
VK_ACCESS_TOKEN Сервисный токен приложения ВК (d0a64...)
VK_SOURCE public36860851
TG_BOT_TOKEN Токен Telegram бота (от @BotFather)
TG_CHAT_ID ID канала Telegram (например -1001303630155)
TG_MEDIA_CHANNEL_ID Скрытый канал-хранилище (опционально)
TG_ADMIN_IDS Telegram ID админов через запятую (например 442509142)
LOCAL_BOT_API_URL http://127.0.0.1:8081 (встроен в контейнер)
MAX_BOT_TOKEN Токен бота в мессенджере МАКС
MAX_CHAT_ID ID чата в МАКС
BOOTSTRAP_MODE skip_existing
CHECK_INTERVAL_MINUTES 15
VIDEO_MAX_DURATION_SEC 7200 (2 часа)
VIDEO_MAX_SIZE_MB_LOCAL 2000 (2 ГБ)

📁 Структура исходного кода

├── src/
│   ├── config.py           # Настройки Pydantic Settings
│   ├── database.py         # Хранилище SQLite (посты, статусы, даты)
│   ├── vk_client.py        # Клиент VK API (wall.get, извлечение медиа)
│   ├── media_processor.py  # Загрузка фото/видео (yt-dlp, aiohttp)
│   ├── text_formatter.py   # Конвертер ссылок ВК, очистка текста, HTML
│   ├── tg_poster.py        # Отправка в Telegram (Rich Message + Local API)
│   ├── max_poster.py       # Отправка в MAX Messenger (Uploads + Polling)
│   ├── cleaner.py          # Фоновая очистка временных файлов
│   ├── admin_notifier.py   # Отправка отчётов администраторам
│   └── main.py             # Точка входа и главный цикл опроса
├── Dockerfile              # Multi-stage образ: aiogram/telegram-bot-api + python:3.12-slim + ffmpeg
├── docker-compose.yml      # Конфигурация запуска сервиса
├── docker-entrypoint.sh    # Автозапуск локального Telegram Bot API + постера
├── requirements.txt        # Python зависимости (aiogram, yt-dlp, loguru, aiohttp, pydantic)
└── .env                    # Переменные окружения
S
Description
No description provided
Readme 382 KiB
Languages
Python 97.7%
Dockerfile 1.4%
Shell 0.9%