be01558ddb217627b351a1dd8a032483753b9082
MAX Bot API has no reaction endpoint (confirmed 404 in production logs), so drop the dead code path entirely instead of eating a warning every post. Telegram's setMessageReaction is a real Bot API method (verified against aiogram 3.21.0, the pinned version) - wire it up as a non-fatal best-effort call after a successful send, mirroring the same try/except-and-log pattern MAX already used.
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"'
⚙️ Как работает сервис
- Опрос стены ВКонтакте:
- Каждые 15 минут делает запрос к методу
wall.getдля группыpublic36860851(owner_id: -36860851). - Фильтрует посты автора (без репостов и рекламы сторонних сообществ).
- Каждые 15 минут делает запрос к методу
- Защита от спама и режим запуска (
BOOTSTRAP_MODE):- Установлен режим
BOOTSTRAP_MODE=skip_existing. - При первом запуске или перезапуске сервис запоминает текущие посты стены и ничего не публикует, пока в ВК не выйдет новый пост.
- Установлен режим
- Загрузка медиа и поддержка длинных видео:
- Картинки скачиваются в максимальном разрешении.
- Видео загружается через
yt-dlpв качестве до 720p (длительностью до 2 часов и размером до 2000 МБ). - Встроенный в контейнер локальный
telegram-bot-apiзагружает тяжелые видеофайлы напрямую в Telegram без ограничений облачного API (20-50 МБ).
- Форматирование текста:
- Ссылки ВКонтакте вида
[club123|Название]и[id123|Имя]преобразуются в корректные кликабельные HTML-ссылки. - Первый абзац / заголовок выделяется жирным шрифтом
<b>...</b>. - Удаляются разделительные полосы (
━━━,───) и лишние переносы строк.
- Ссылки ВКонтакте вида
- Публикация в мессенджер МАКС:
- Загрузка медиа в МАКС через
/uploads?type=photoи/uploads?type=video. - Поллинг готовности видео (
/videos/{token}) перед публикацией сообщения.
- Загрузка медиа в МАКС через
- Отчёты администраторам:
- После успешной публикации или при ошибке бот отправляет отчёт со ссылками на оригинальный пост в ВК, Telegram и МАКС в личные сообщения администраторам (
TG_ADMIN_IDS).
- После успешной публикации или при ошибке бот отправляет отчёт со ссылками на оригинальный пост в ВК, Telegram и МАКС в личные сообщения администраторам (
- Очистка диска и кэша:
- Временные файлы удаляются сразу после публикации.
- Фоновый воркер
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 # Переменные окружения
Description
Languages
Python
97.7%
Dockerfile
1.4%
Shell
0.9%