Telegram-бот для создания видео из фотографий с использованием ComfyUI-Connect API.
Бот принимает фотографию от пользователя, отправляет её на сервер обработки ComfyUI-Connect и возвращает готовое видео с анимацией.
- 🎨 Красивый интерфейс - полностью кнопочный интерфейс без команд
- 🎉 Онбординг - приветствие новых пользователей с бонусом
- ⚡ Надёжная работа - гибридный подход Connect API + History API
- 💰 Система токенов - контроль использования с балансами
- 🧠 Умное предсказание времени - на основе истории по конкретным настройкам
- 🎬 Интерактивный мастер - выбор длительности и качества видео
- ⚡ Быстрый режим - создание видео одним кликом
- 🔄 Кнопки "Создать еще" - удобное создание нескольких видео подряд
- 🔗 Вирусное распространение - ссылка на бота в каждом видео
- 🎯 Персистентность - сохранение статистики и балансов
- 🔐 Безопасность - каждый пользователь получает только своё видео
- 👥 Управление пользователями - детальная информация для админа
- 🔄 Production-ready - systemd service с автозапуском
- 📝 Детальное логирование - DEBUG режим для диагностики
git clone https://github.com/erliona/lora.git
cd lorapip install -r requirements.txt# Скопируйте пример конфигурации
cp env.example .env
# Отредактируйте .env
nano .envОбязательные параметры:
BOT_TOKEN=your_telegram_bot_token_here
ADMIN_USER_ID=your_telegram_user_idПолучите токен у @BotFather:
- Напишите
/newbot - Следуйте инструкциям
- Скопируйте полученный токен
Узнайте свой User ID:
- Напишите боту @userinfobot
Опциональные параметры:
TOKENS_PER_VIDEO=10 # Стоимость одного видео (по умолчанию 10)
DEFAULT_TOKENS=100 # Начальный баланс (по умолчанию 100)
DEBUG=true # Включить детальные логиpython bot.py# Скопируйте systemd service
sudo cp lora-bot.service /etc/systemd/system/
# Отредактируйте пути под ваш сервер
sudo nano /etc/systemd/system/lora-bot.service
# Запустите как сервис
sudo systemctl daemon-reload
sudo systemctl enable lora-bot
sudo systemctl start lora-bot
# Проверьте статус
sudo systemctl status lora-bot
# Смотрите логи в реальном времени
journalctl -u lora-bot -f
# Или логи из файла
tail -f /path/to/lora_bot/bot.log- Напишите боту
/startдля приветствия - Отправьте любую фотографию
- Дождитесь обработки (1-2 минуты)
- Получите готовое видео!
🎨 Полностью кнопочный интерфейс:
- Все действия через красивые кнопки
- Никаких команд для пользователей
- Интуитивная навигация
🎬 Способы создания видео:
- Мастер создания - выбор длительности (5/10/15 сек) и качества (300/600/832px)
- Быстрый режим - 10 секунд, среднее качество, одним кликом
- Прямая отправка фото - автоматически быстрый режим
🎯 Кнопки главного меню:
- 🎬 Создать видео - запускает мастер с выбором параметров
- ⚡ Быстрый режим - быстрое создание с настройками по умолчанию
- 💰 Баланс - показывает токены и доступные видео
- 📊 Статистика - время обработки и статистика
- ❓ Помощь - инструкции по использованию
🔄 Кнопки "Создать еще":
- Появляются после каждого видео
- Позволяют сразу создать следующее видео
- Быстрый возврат в главное меню
👨💼 Администратор:
/start- главное меню (единственная команда)/addtokens USER_ID AMOUNT- пополнить баланс пользователя/users- список всех пользователей с полной информацией
🎬 Через мастер создания:
1. /start → кнопка "🎬 Создать видео"
2. Отправка фото → выбор длительности (5/10/15 сек)
3. Выбор качества (300/600/832px) → подтверждение
4. Обработка → готовое видео + кнопки "Создать еще"
⚡ Быстрый режим:
1. /start → кнопка "⚡ Быстрый режим" ИЛИ прямая отправка фото
2. Отправка фото → автоматическая обработка (10 сек, среднее качество)
3. Готовое видео + кнопки "Создать еще"
🔄 Создание нескольких видео:
1. После первого видео → кнопка "🎬 Создать еще"
2. Отправка нового фото → выбор параметров
3. Повторение процесса
- Новый пользователь → Автоматически получает 100 токенов (бонус новичка)
- Проверка баланса → Перед обработкой проверяется достаточно ли токенов
- Создание видео → Списывается токены в зависимости от параметров:
- 5 секунд: 5 токенов
- 10 секунд: 10 токенов
- 15 секунд: 15 токенов
- Качество: +0 токенов (все уровни бесплатные)
- Недостаточно токенов → Пользователь получает сообщение с просьбой обратиться к админу
CREATE TABLE balances (
user_id INTEGER PRIMARY KEY,
tokens INTEGER NOT NULL,
username TEXT,
first_name TEXT,
last_name TEXT,
videos_created INTEGER DEFAULT 0,
created_at TIMESTAMP,
updated_at TIMESTAMP
)При вызове /users администратор видит:
📋 Пользователи:
👤 Sergey Zheleznov
ID: 423721043
@serge_k
💰 Токенов: 170
🎬 Видео: 5
📅 С 21.10.2025
📊 Всего пользователей: 12
- При
/startобновляются имя, фамилия, username - При отправке фото обновляется last_updated
- После создания видео увеличивается счетчик videos_created
- python-telegram-bot 20.7 - Telegram Bot API
- aiohttp 3.9.1 - Асинхронные HTTP запросы
- websockets 12.0 - WebSocket клиент (для будущих улучшений)
- sqlite3 - Встроенная БД для балансов
- python-dotenv 1.0.0 - Управление переменными окружения
- ComfyUI-Connect - REST API обёртка для ComfyUI
Бот использует ComfyUI-Connect - плагин превращающий ComfyUI workflows в REST API endpoints.
Для максимальной совместимости бот использует два метода получения результата:
Для нод которые возвращают данные в ответе API (Preview Image, Save Image):
POST /api/connect/workflows/api-video
↓
{
"status": "success",
"result": {
"output": ["base64_video..."]
}
}
↓
Декодируем и отправляем
Для нод которые сохраняют на диск (VHS_VideoCombine):
POST /api/connect/workflows/api-video
↓
result.output = [] (пусто)
↓
Опрос /history каждые 3 сек (до 60 сек)
↓
Находим задачу по имени файла input_{client_id}.jpg
↓
Скачиваем через /view?filename=...
↓
Отправляем пользователю
Каждому запросу присваивается уникальный client_id:
client_id = f"telegram_{user_id}_{timestamp}"Это гарантирует что:
- ✅ Пользователь A не получит видео пользователя B
- ✅ При параллельной обработке видео не путаются
- ✅ Каждая задача легко идентифицируется в логах
{
"image": {
"image": {
"type": "file",
"content": "base64_encoded_image...",
"name": "input_telegram_423721043_1729545678123.jpg"
}
},
"client_id": "telegram_423721043_1729545678123"
}- Инициализация SQLite базы
- Автоматическая миграция схемы
- Управление балансами пользователей
- Счетчики созданных видео
- Сохранение времени обработки в файл
- Загрузка при старте (поддержка старого формата)
- Расчет адаптивных оценок времени
- Хранение последних 100 записей
- Проверка баланса токенов
- Скачивание фото из Telegram
- Конвертация в base64
- Отправка на ComfyUI-Connect
- Мониторинг прогресса
- Получение результата (direct или через history)
- Списание токенов
- Отправка видео пользователю
- Отправка POST запроса с таймаутом 10 минут
- Детальное логирование ответа
- Автоматический поиск видео в разных форматах
- Fallback на History API при пустом output
- Анимированный спиннер (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏)
- Динамический прогресс [▓▓▓░░░░░] 0-95%
- Адаптивная оценка оставшегося времени
- Обновление каждые 2 секунды
balances.db - SQLite база данных:
- Балансы пользователей
- Личная информация (имя, username)
- Счетчики созданных видео
- Timestamps
processing_stats.json - Статистика обработки:
- Времена выполнения последних 100 видео
- Используется для прогнозирования
- Загружается при старте
API_URL = 'https://cuda.serge.cc/api/connect/workflows/api-video' # Запуск workflow
HISTORY_URL = 'https://cuda.serge.cc/history' # Поиск результата
VIEW_URL = 'https://cuda.serge.cc/view' # Скачивание файла| Параметр | Обязательный | По умолчанию | Описание |
|---|---|---|---|
BOT_TOKEN |
✅ Да | - | Токен Telegram бота от @BotFather |
ADMIN_USER_ID |
✅ Да | 0 | Telegram User ID администратора |
TOKENS_PER_VIDEO |
Нет | 10 | Стоимость создания одного видео |
DEFAULT_TOKENS |
Нет | 100 | Начальный баланс для новых пользователей |
DEBUG |
Нет | false | Режим детального логирования (true/false) |
- Таймаут запроса: 600 секунд (10 минут)
- Обновление прогресса: каждые 2 секунды
- History polling: 20 попыток × 3 секунды = 60 секунд
- Хранение статистики: последние 100 видео
- Показ пользователей: первые 15 в
/users
INFO (по умолчанию):
📸 Запрос от 423721043 (Sergey), баланс: 170
🚀 Отправляю запрос на ComfyUI-Connect
✅ Получен ответ от сервера
🔍 Output пустой, пробую через History API...
✅ Найдена наша задача: uuid-here
✅ Найдено видео: Wan2.2-KJ_00065.mp4
✅ Скачано 2548392 байт
💸 -10 токенов для 423721043, осталось: 160
DEBUG (DEBUG=true):
Response keys: ['status', 'workflow', 'result']
🔍 Проверяю ключ 'result' типа dict
✓ Декодировано 2548392 байт, первые байты: 0000001866747970...
History: 3 записей
На сервере (systemd):
# В файл
tail -f /root/lora_bot/bot.log
# Через systemd
journalctl -u lora-bot -f
# Только ошибки
journalctl -u lora-bot -p err-
Приоритет 1: Точное время для конкретных настроек
- Если есть история для
5_low,10_medium,15_highи т.д. - Используется среднее время именно для этих настроек
- Если есть история для
-
Приоритет 2: Общее среднее время
- Если нет точного времени для конкретных настроек
- Используется среднее время по всем предыдущим обработкам
-
Приоритет 3: Время по умолчанию
- Только если вообще нет истории (первый запуск бота)
- 2 минуты - разумное время по умолчанию
{
"times": [120.5, 99.3, 103.8, 67.6, ...],
"times_by_settings": {
"5_low": [95, 100, 90],
"10_medium": [180, 175],
"15_high": [300, 320]
}
}Возможности:
- Автозагрузка при старте бота
- Поддержка старого формата (
completion_times) - Хранение последних 100 записей в общем списке
- Хранение последних 20 записей для каждой настройки
- Расчет среднего времени последних 10 видео
- Используется для прогресс-бара и предсказания времени
# Проверьте статус
systemctl status lora-bot
# Проверьте логи
tail -50 /root/lora_bot/bot.log | grep ERROR
# Перезапустите
systemctl restart lora-bot# Создайте резервную копию
cp balances.db balances.db.backup
# Удалите базу (будет пересоздана)
rm balances.db
systemctl restart lora-botМиграция происходит автоматически при запуске. В логах должно быть:
📝 Миграция: добавляем поле first_name
📝 Миграция: добавляем поле last_name
💾 База данных балансов готова
# Администратор может пополнить баланс
/addtokens USER_ID 100
# Или измените стоимость в .env
TOKENS_PER_VIDEO=5Проверьте в ComfyUI что:
- Нода с видео имеет аннотацию
#outputв названии - Workflow называется точно
api-video - Нода не в bypass режиме
- В логах DEBUG видно структуру ответа
Особенности:
- ✅ Автозапуск при загрузке сервера
- ✅ Автоматический перезапуск при крашах (RestartSec=10)
- ✅ Логи в файл и через journalctl
- ✅ Работа от имени root (можно изменить)
Управление:
# Статус
systemctl status lora-bot
# Запуск/остановка
systemctl start lora-bot
systemctl stop lora-bot
systemctl restart lora-bot
# Логи
journalctl -u lora-bot -f # В реальном времени
journalctl -u lora-bot --since today # За сегодня
journalctl -u lora-bot -n 100 # Последние 100 строк# Использование памяти
systemctl status lora-bot | grep Memory
# Время работы
systemctl status lora-bot | grep Active
# Количество пользователей
sqlite3 /root/lora_bot/balances.db "SELECT COUNT(*) FROM balances"
# Топ пользователей по балансу
sqlite3 /root/lora_bot/balances.db "SELECT username, tokens FROM balances ORDER BY tokens DESC LIMIT 5"- Python 3.8+
- Telegram Bot Token
- Доступ к ComfyUI-Connect серверу
- Для production: Linux сервер с systemd
- 💰 Система токенов с SQLite базой данных
- 👥 Детальная информация о пользователях
- 💾 Сохранение статистики между перезапусками
- 🔧 Автоматическая миграция базы данных
- 📊 Счетчики созданных видео
- 🔐 Поиск видео по уникальному client_id (безопасность)
- 🚀 Production deployment с systemd
- 🎨 Полностью кнопочный интерфейс - никаких команд для пользователей
- 🎉 Онбординг - приветствие новых пользователей с бонусом
- 🧠 Умное предсказание времени - на основе истории по конкретным настройкам
- 🎬 Интерактивный мастер - выбор длительности и качества видео
- ⚡ Быстрый режим - создание видео одним кликом
- 🔄 Кнопки "Создать еще" - удобное создание нескольких видео подряд
- 🔗 Вирусное распространение - ссылка на бота в каждом видео
- 💰 Гибкая система токенов - стоимость зависит от длительности
- 🎯 Улучшенный UX - интуитивная навигация и красивые кнопки
- ♻️ Полная переработка под ComfyUI-Connect API
- 🔄 Гибридный подход: Connect API + History API
- 📊 Улучшенный прогресс-бар с адаптивными оценками
- 🐛 Детальное логирование для отладки
- 📉 Упрощение кода: 802 → 602 строки
- WebSocket мониторинг очереди
- Polling History API
- Сложная логика с фазами и трекерами
- 800+ строк кода
Если хотите улучшить бота:
- Fork репозиторий
- Создайте feature branch
- Сделайте изменения
- Отправьте Pull Request
MIT
- ComfyUI-Connect GitHub
- python-telegram-bot Documentation
- Telegram Bot API
- Получить Bot Token
- Узнать User ID
Сделано с ❤️ для работы с ComfyUI-Connect
Если у вас возникли вопросы или проблемы - создайте Issue на GitHub!