113 lines
7.8 KiB
Markdown
113 lines
7.8 KiB
Markdown
# 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 хост:
|
|
|
|
```bash
|
|
# 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 # Переменные окружения
|
|
```
|