Skip to content

erliona/lora

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🎬 Telegram Video Bot

Telegram-бот для создания видео из фотографий с использованием ComfyUI-Connect API.

📋 Описание

Бот принимает фотографию от пользователя, отправляет её на сервер обработки ComfyUI-Connect и возвращает готовое видео с анимацией.

✨ Особенности:

  • 🎨 Красивый интерфейс - полностью кнопочный интерфейс без команд
  • 🎉 Онбординг - приветствие новых пользователей с бонусом
  • Надёжная работа - гибридный подход Connect API + History API
  • 💰 Система токенов - контроль использования с балансами
  • 🧠 Умное предсказание времени - на основе истории по конкретным настройкам
  • 🎬 Интерактивный мастер - выбор длительности и качества видео
  • Быстрый режим - создание видео одним кликом
  • 🔄 Кнопки "Создать еще" - удобное создание нескольких видео подряд
  • 🔗 Вирусное распространение - ссылка на бота в каждом видео
  • 🎯 Персистентность - сохранение статистики и балансов
  • 🔐 Безопасность - каждый пользователь получает только своё видео
  • 👥 Управление пользователями - детальная информация для админа
  • 🔄 Production-ready - systemd service с автозапуском
  • 📝 Детальное логирование - DEBUG режим для диагностики

🚀 Установка

1. Клонируйте репозиторий

git clone https://github.com/erliona/lora.git
cd lora

2. Установите зависимости

pip install -r requirements.txt

3. Настройте переменные окружения

# Скопируйте пример конфигурации
cp env.example .env

# Отредактируйте .env
nano .env

Обязательные параметры:

BOT_TOKEN=your_telegram_bot_token_here
ADMIN_USER_ID=your_telegram_user_id

Получите токен у @BotFather:

  1. Напишите /newbot
  2. Следуйте инструкциям
  3. Скопируйте полученный токен

Узнайте свой User ID:

Опциональные параметры:

TOKENS_PER_VIDEO=10     # Стоимость одного видео (по умолчанию 10)
DEFAULT_TOKENS=100      # Начальный баланс (по умолчанию 100)
DEBUG=true              # Включить детальные логи

4. Запустите бота

Локально (для разработки):

python bot.py

На сервере (production):

# Скопируйте 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

📱 Использование

Для пользователей:

  1. Напишите боту /start для приветствия
  2. Отправьте любую фотографию
  3. Дождитесь обработки (1-2 минуты)
  4. Получите готовое видео!

📱 Интерфейс:

🎨 Полностью кнопочный интерфейс:

  • Все действия через красивые кнопки
  • Никаких команд для пользователей
  • Интуитивная навигация

🎬 Способы создания видео:

  • Мастер создания - выбор длительности (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. Повторение процесса

💰 Система токенов

Как это работает:

  1. Новый пользователь → Автоматически получает 100 токенов (бонус новичка)
  2. Проверка баланса → Перед обработкой проверяется достаточно ли токенов
  3. Создание видео → Списывается токены в зависимости от параметров:
    • 5 секунд: 5 токенов
    • 10 секунд: 10 токенов
    • 15 секунд: 15 токенов
    • Качество: +0 токенов (все уровни бесплатные)
  4. Недостаточно токенов → Пользователь получает сообщение с просьбой обратиться к админу

База данных (balances.db):

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 API

Бот использует ComfyUI-Connect - плагин превращающий ComfyUI workflows в REST API endpoints.

Гибридный подход:

Для максимальной совместимости бот использует два метода получения результата:

1. Direct Response (быстрый путь)

Для нод которые возвращают данные в ответе API (Preview Image, Save Image):

POST /api/connect/workflows/api-video
  ↓
{
  "status": "success",
  "result": {
    "output": ["base64_video..."]
  }
}
  ↓
Декодируем и отправляем

2. History API Fallback (для VHS_VideoCombine)

Для нод которые сохраняют на диск (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"
}

📊 Архитектура

Основные компоненты:

1. TokenBalance - Система балансов

  • Инициализация SQLite базы
  • Автоматическая миграция схемы
  • Управление балансами пользователей
  • Счетчики созданных видео

2. ProcessingStats - Статистика обработки

  • Сохранение времени обработки в файл
  • Загрузка при старте (поддержка старого формата)
  • Расчет адаптивных оценок времени
  • Хранение последних 100 записей

3. handle_photo() - Обработка фото

  1. Проверка баланса токенов
  2. Скачивание фото из Telegram
  3. Конвертация в base64
  4. Отправка на ComfyUI-Connect
  5. Мониторинг прогресса
  6. Получение результата (direct или через history)
  7. Списание токенов
  8. Отправка видео пользователю

4. process_comfyui_connect() - Работа с API

  • Отправка POST запроса с таймаутом 10 минут
  • Детальное логирование ответа
  • Автоматический поиск видео в разных форматах
  • Fallback на History API при пустом output

5. update_progress() - Прогресс-бар

  • Анимированный спиннер (⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏)
  • Динамический прогресс [▓▓▓░░░░░] 0-95%
  • Адаптивная оценка оставшегося времени
  • Обновление каждые 2 секунды

Хранение данных:

balances.db - SQLite база данных:

  • Балансы пользователей
  • Личная информация (имя, username)
  • Счетчики созданных видео
  • Timestamps

processing_stats.json - Статистика обработки:

  • Времена выполнения последних 100 видео
  • Используется для прогнозирования
  • Загружается при старте

🔧 Конфигурация

API Endpoints

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. Приоритет 1: Точное время для конкретных настроек

    • Если есть история для 5_low, 10_medium, 15_high и т.д.
    • Используется среднее время именно для этих настроек
  2. Приоритет 2: Общее среднее время

    • Если нет точного времени для конкретных настроек
    • Используется среднее время по всем предыдущим обработкам
  3. Приоритет 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 что:

  1. Нода с видео имеет аннотацию #output в названии
  2. Workflow называется точно api-video
  3. Нода не в bypass режиме
  4. В логах DEBUG видно структуру ответа

⚙️ Production Deployment

Systemd Service

Особенности:

  • ✅ Автозапуск при загрузке сервера
  • ✅ Автоматический перезапуск при крашах (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

📄 История изменений

v3.0 (Текущая) - Октябрь 2025

  • 💰 Система токенов с SQLite базой данных
  • 👥 Детальная информация о пользователях
  • 💾 Сохранение статистики между перезапусками
  • 🔧 Автоматическая миграция базы данных
  • 📊 Счетчики созданных видео
  • 🔐 Поиск видео по уникальному client_id (безопасность)
  • 🚀 Production deployment с systemd

v3.0 - Декабрь 2024

  • 🎨 Полностью кнопочный интерфейс - никаких команд для пользователей
  • 🎉 Онбординг - приветствие новых пользователей с бонусом
  • 🧠 Умное предсказание времени - на основе истории по конкретным настройкам
  • 🎬 Интерактивный мастер - выбор длительности и качества видео
  • Быстрый режим - создание видео одним кликом
  • 🔄 Кнопки "Создать еще" - удобное создание нескольких видео подряд
  • 🔗 Вирусное распространение - ссылка на бота в каждом видео
  • 💰 Гибкая система токенов - стоимость зависит от длительности
  • 🎯 Улучшенный UX - интуитивная навигация и красивые кнопки

v2.0 - Октябрь 2024

  • ♻️ Полная переработка под ComfyUI-Connect API
  • 🔄 Гибридный подход: Connect API + History API
  • 📊 Улучшенный прогресс-бар с адаптивными оценками
  • 🐛 Детальное логирование для отладки
  • 📉 Упрощение кода: 802 → 602 строки

v1.0

  • WebSocket мониторинг очереди
  • Polling History API
  • Сложная логика с фазами и трекерами
  • 800+ строк кода

🤝 Вклад

Если хотите улучшить бота:

  1. Fork репозиторий
  2. Создайте feature branch
  3. Сделайте изменения
  4. Отправьте Pull Request

📄 Лицензия

MIT


🔗 Полезные ссылки


Сделано с ❤️ для работы с ComfyUI-Connect

Если у вас возникли вопросы или проблемы - создайте Issue на GitHub!

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages