Personalized Post Bot (example: @mmyyyyau_bot)
Telegram-бот для персонализированной агрегации новостей из каналов с использованием ML-рекомендаций на основе векторных эмбеддингов. Микросервисная архитектура на Docker Compose.
┌─────────────────┐ HTTP/REST ┌──────────────────┐ Vectors ┌──────────────┐
│ main-bot │◄──────────────────►│ core-api │◄───────────────►│ Qdrant │
│ (Aiogram 3) │ │ (FastAPI + ML) │ │ (embeddings)│
└────────┬────────┘ └────────┬─────────┘ └──────────────┘
│ │
│ HTTP /cmd/* │ PostgreSQL
▼ ▼
┌─────────────────┐ ┌──────────────────┐
│ user-bot │ │ postgres │
│ (Telethon) │ │ │
└────────────────┘ └──────────────────┘
┌─────────────────┐
│ frontend-miniapp│
│ (HTML/JS) │
└─────────────────┘
| Сервис | Порт | Описание |
|---|---|---|
core-api |
8000 | FastAPI бэкенд + ML сервис |
main-bot |
- | Aiogram 3.x Telegram бот (AARRR воронка) |
user-bot |
8001 | Telethon скрейпер с HTTP API |
frontend-miniapp |
8080 | Tinder-style интерфейс для оценки постов |
postgres |
5432 | PostgreSQL база данных |
redis |
6379 | Redis для кэширования |
qdrant |
6333 | Векторная БД для эмбеддингов |
pgadmin |
5050 | Веб-интерфейс для БД |
- Docker & Docker Compose
- Telegram Bot Token (@BotFather)
- Telegram API credentials (my.telegram.org)
- OpenAI-совместимый API ключ для эмбеддингов (bothub.chat, OpenAI, etc.)
cp .env.example .env
nano .envОбязательные переменные:
| Переменная | Описание |
|---|---|
TELEGRAM_BOT_TOKEN |
Токен бота от BotFather |
TELEGRAM_API_ID |
API ID от my.telegram.org |
TELEGRAM_API_HASH |
API Hash от my.telegram.org |
TELEGRAM_SESSION_STRING |
Сессия Telethon (см. ниже) |
OPENAI_API_KEY |
API ключ для эмбеддингов |
pip install telethon
python scripts/generate_session.py# Запустить все сервисы
docker-compose up -d --build
# Посмотреть логи
docker-compose logs -f main-bot
# Получить URL туннеля для MiniApp
docker-compose logs tunnel | grep trycloudflare
# Обновить MINIAPP_URL в .env и перезапустить
docker-compose up -d main-bot| URL | Описание |
|---|---|
| http://localhost:8000/docs | API документация |
| http://localhost:8080 | MiniApp (локально) |
| http://localhost:8001/docs | User Bot API |
| http://localhost:5050 | pgAdmin (БД) |
| http://localhost:6333/dashboard | Qdrant UI |
- Acquisition:
/start→ приветствие - Activation: Онбординг → добавление своего канала
- Training: Оценка постов (👍/👎/⏭️) из 3 каналов
- Revenue: Бонусный канал после обучения
- Retention: Персонализированные посты неактивным юзерам
1. Скрейпинг постов → 2. Генерация эмбеддингов → 3. Сохранение в Qdrant
↓
4. Пользователь лайкает/дизлайкает посты
↓
5. Вычисление preference vector = avg(liked) - avg(disliked)
↓
6. Рекомендации = cosine_similarity(preference_vector, post_embeddings)
├── docker-compose.yml # Все сервисы
├── .env.example # Пример конфигурации
├── COMMANDS.md # Полезные команды
├── docs/
│ ├── ARCHITECTURE.md # Детальная архитектура
│ └── MINIAPP_SETUP.md # Настройка туннеля
├── scripts/
│ └── generate_session.py # Генератор Telethon сессии
└── services/
├── core-api/ # Бэкенд + ML
│ └── app/
│ ├── routers/ # API эндпоинты
│ └── services/ # Бизнес-логика + ML
├── main-bot/ # Telegram бот
│ └── bot/
│ ├── handlers/ # Обработчики команд
│ ├── message_manager.py # Registry Pattern
│ └── retention.py # Retention сервис
├── user-bot/ # Telethon скрейпер
└── frontend-miniapp/ # Swipe UI
POST /api/v1/users/- Create or get userGET /api/v1/users/{telegram_id}- Get userPATCH /api/v1/users/{telegram_id}- Update userPOST /api/v1/users/activity- Update activityPOST /api/v1/users/logs- Create log
POST /api/v1/channels/- Create channelGET /api/v1/channels/defaults- Get default channelsPOST /api/v1/channels/user-channel- Add user channel
POST /api/v1/posts/- Create postPOST /api/v1/posts/bulk- Bulk create postsPOST /api/v1/posts/training- Get training postsPOST /api/v1/posts/interactions- Create interactionPOST /api/v1/posts/best- Get best posts
POST /api/v1/ml/train- Train modelPOST /api/v1/ml/predict- Get predictionsGET /api/v1/ml/eligibility/{telegram_id}- Check eligibility
GET /api/v1/analytics/dashboard- Полный дашборд со всеми метрикамиGET /api/v1/analytics/overview- Общая статистика (users, posts, interactions)GET /api/v1/analytics/daily?days=7- Статистика по днямGET /api/v1/analytics/channels?limit=10- Топ каналов по активностиGET /api/v1/analytics/retention?days=7- Метрики retentionGET /api/v1/analytics/recommendations- Эффективность рекомендаций
GET /api/v1/ab-testing/config- Текущая конфигурация тестаPOST /api/v1/ab-testing/config- Обновить конфигурациюGET /api/v1/ab-testing/results- Результаты теста по вариантамGET /api/v1/ab-testing/user/{user_id}/variant- Вариант для юзера
GET /api/v1/admin/users- Список юзеров с пагинациейGET /api/v1/admin/users/{id}- Детали юзера с каналами и статистикойPATCH /api/v1/admin/users/{id}- Обновить юзераDELETE /api/v1/admin/users/{id}- Удалить юзераGET /api/v1/admin/channels- Список каналовPATCH /api/v1/admin/channels/{id}- Обновить каналDELETE /api/v1/admin/channels/{id}- Удалить каналPOST /api/v1/admin/reset-training/{id}- Сбросить обучение юзераPOST /api/v1/admin/clear-all-data?confirm=true- Очистить все данные
GET /health- Базовая проверка (liveness)GET /health/ready- Проверка зависимостей (readiness)
POST /cmd/scrape- Scrape channel messagesPOST /cmd/join- Join a channelGET /health- Базовая проверкаGET /health/ready- Проверка Telethon и core-apiGET /media/photo?channel_username=X&message_id=Y- Получить фотоGET /media/video?channel_username=X&message_id=Y- Получить видео
The MessageManager class in main-bot implements a strict registry pattern for managing three message types:
| Type | Behavior | Example |
|---|---|---|
SYSTEM |
Persistent, edited in place | Main menu |
EPHEMERAL |
Deleted after interaction | Confirmation dialogs |
ONETIME |
Kept in history | Feed posts |
Key methods:
send_system()- Send/edit system messagesend_ephemeral()- Send temporary messagesend_onetime()- Send permanent feed postdelete_ephemeral()- Clean up temporary messagestransition_to_system()- Clean up and switch to system message
# Run API tests
docker-compose exec core-api pytest
# Run bot tests
docker-compose exec main-bot pytest# Просмотр текущей версии
docker exec ppb-core-api alembic current
# Генерация миграции
docker exec ppb-core-api alembic revision --autogenerate -m "description"
# Применить миграции
docker exec ppb-core-api alembic upgrade head
# Откатить миграцию
docker exec ppb-core-api alembic downgrade -1Логи сохраняются в /var/log/ppb/ с ротацией (10MB, 5 файлов):
# Просмотр логов из файла
docker exec ppb-core-api cat /var/log/ppb/core-api.log
docker exec ppb-main-bot cat /var/log/ppb/main-bot.log
# Docker логи (stdout)
docker-compose logs -f main-bot
docker-compose logs -f core-api# Core API - проверка всех зависимостей
curl http://localhost:8000/health/ready
# {"service":"core-api","postgres":"healthy","qdrant":"healthy","status":"healthy"}
# User Bot - проверка Telethon и API
curl http://localhost:8001/health/ready
# {"service":"user-bot","telethon":"healthy","core_api":"healthy","status":"healthy"}# Просмотр таблиц в БД
docker exec ppb-postgres psql -U ppb_user -d ppb_db -c "\dt"
# Топ постов по relevance
docker exec ppb-postgres psql -U ppb_user -d ppb_db -c "SELECT id, relevance_score FROM posts WHERE relevance_score IS NOT NULL ORDER BY relevance_score DESC LIMIT 10;"
# Очистка БД
docker exec ppb-postgres psql -U ppb_user -d ppb_db -c "TRUNCATE TABLE user_logs, interactions, user_channels, posts, channels, users RESTART IDENTITY CASCADE;"
# Перезапуск бота
docker-compose restart main-botMIT