Files
TG_autoposter/userbot_service.py
Andrew K. Choi 48f8c6f0eb 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
2025-12-21 12:09:11 +09:00

103 lines
3.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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()