UserBot Integration Complete: Fixed container startup, integrated UserBot menu to main bot

MAJOR FIXES:
 Fixed UserBot container startup by making TELEGRAM_BOT_TOKEN optional
 Broke circular import chain between app modules
 Made Config.validate() conditional for UserBot-only mode
 Removed unused celery import from userbot_service.py

INTEGRATION:
 UserBot menu now accessible from main bot /start command
 Added 🤖 UserBot button to main keyboard
 Integrated userbot_manager.py handlers:
   - userbot_menu: Main UserBot interface
   - userbot_settings: Configuration
   - userbot_collect_groups: Gather all user groups
   - userbot_collect_members: Parse group members
 UserBot handlers properly registered in ConversationHandler

CONTAINERS:
 tg_autoposter_bot: Running and handling /start commands
 tg_autoposter_userbot: Running as standalone microservice
 All dependent services (Redis, PostgreSQL, Celery workers) operational

STATUS: Bot is fully operational and ready for testing
This commit is contained in:
2025-12-21 12:09:11 +09:00
parent b8136138dc
commit 48f8c6f0eb
48 changed files with 6593 additions and 113 deletions

102
userbot_service.py Normal file
View File

@@ -0,0 +1,102 @@
#!/usr/bin/env python3
"""
Запуск Telethon UserBot микросервиса - STANDALONE
Работает независимо от основного бота
Может быть запущен как отдельный Celery воркер для парсинга групп
"""
import asyncio
import logging
import sys
import os
import sys as sys_module
# Загрузить .env файл в первую очередь
from pathlib import Path
from dotenv import load_dotenv
env_file = Path(__file__).parent / '.env'
load_dotenv(env_file)
# Конфигурация UserBot - использует ТОЛЬКО Telethon переменные
TELETHON_API_ID = os.getenv('TELETHON_API_ID')
TELETHON_API_HASH = os.getenv('TELETHON_API_HASH')
TELETHON_PHONE = os.getenv('TELETHON_PHONE')
LOG_LEVEL = os.getenv('LOG_LEVEL', 'INFO')
# Проверить требуемые переменные
if not all([TELETHON_API_ID, TELETHON_API_HASH, TELETHON_PHONE]):
print("❌ Требуются переменные окружения:")
print(" TELETHON_API_ID")
print(" TELETHON_API_HASH")
print(" TELETHON_PHONE")
sys_module.exit(1)
# Конфигурация логирования
logging.basicConfig(
level=getattr(logging, LOG_LEVEL, logging.INFO),
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# Импортировать ТОЛЬКО парсер напрямую из модуля (без цепочки импортов app)
import sys
sys.path.insert(0, str(Path(__file__).parent))
# Импортировать парсер напрямую
from app.userbot.parser import userbot_parser
from app.database import AsyncSessionLocal
logger.info("="*80)
logger.info("🚀 Telethon UserBot Microservice (Standalone)")
logger.info("="*80)
async def initialize_userbot():
"""Инициализировать userbot при запуске"""
logger.info("=" * 80)
logger.info("🚀 Инициализация Telethon UserBot микросервиса")
logger.info("=" * 80)
success = await userbot_parser.initialize()
if not success:
logger.error("Не удалось инициализировать UserBot")
logger.info("📲 Проверьте конфигурацию Telethon и убедитесь что вы авторизованы")
return False
logger.info("✅ UserBot успешно инициализирован")
return True
async def run_userbot():
"""Основной цикл userbot"""
success = await initialize_userbot()
if not success:
return
try:
logger.info("🔄 UserBot готов к обработке задач")
logger.info("⏸️ Нажмите Ctrl+C для остановки")
# Держать соединение открытым
while True:
await asyncio.sleep(1)
except KeyboardInterrupt:
logger.info("\n⏹️ Получен сигнал остановки")
finally:
await userbot_parser.shutdown()
logger.info("✅ UserBot микросервис остановлен")
def main():
"""Главная функция"""
# Запустить как standalone микросервис
logger.info("🚀 Запуск Telethon UserBot как standalone микросервис")
asyncio.run(run_userbot())
if __name__ == '__main__':
main()