#!/usr/bin/env python3 """ Telegram Session Creator Создаёт сессию для бота через интерактивную авторизацию """ import asyncio import os import sys from pathlib import Path from loguru import logger from telethon import TelegramClient from telethon.sessions import StringSession # Настройка логирования logger.remove() logger.add( sys.stdout, format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {message}", level="INFO" ) logger.add( "logs/auth.log", rotation="1 day", retention="7 days", level="DEBUG" ) # Пути BASE_DIR = Path(__file__).parent SESSIONS_DIR = BASE_DIR / "sessions" SESSIONS_DIR.mkdir(exist_ok=True) async def main(): """Создание сессии""" try: logger.info("=" * 50) logger.info("🔐 Telegram Session Creator") logger.info("=" * 50) logger.info("") # Запрос API credentials logger.info("📋 Для работы нужны API credentials") logger.info("Получить можно здесь: https://my.telegram.org/apps") logger.info("") api_id = input("Введите API ID: ").strip() api_hash = input("Введите API Hash: ").strip() if not api_id or not api_hash: logger.error("❌ API ID и API Hash обязательны") return logger.info("") logger.info("📱 Введите номер телефона") logger.info("Формат: +79991234567 (с кодом страны)") logger.info("") phone = input("Номер телефона: ").strip() if not phone: logger.error("❌ Номер телефона обязателен") return # Создаём клиента client = TelegramClient( StringSession(), int(api_id), api_hash, device_model="Desktop (X64)", system_version="Windows 11", app_version="3.2.2", lang_code="en", system_lang_code="en-US" ) logger.info("") logger.info("⏳ Подключение к Telegram...") await client.connect() if not await client.is_user_authorized(): logger.info("📲 Отправка кода подтверждения...") try: await client.send_code_request(phone) logger.info(f"✅ Код отправлен на {phone}") except Exception as e: logger.error(f"❌ Ошибка отправки кода: {e}") await client.disconnect() return # Ввод кода logger.info("") code = input("Введите код из Telegram: ").strip() if not code: logger.error("❌ Код обязателен") await client.disconnect() return try: await client.sign_in(phone, code) except Exception as e: error_msg = str(e) if "SESSION_PASSWORD_NEEDED" in error_msg or "2FA" in error_msg.upper(): # Запрос 2FA пароля logger.info("") logger.info("🔒 Требуется 2FA пароль") password = input("Введите пароль: ").strip() try: await client.sign_in(password=password) except Exception as e2: logger.error(f"❌ Ошибка 2FA: {e2}") await client.disconnect() return elif "PHONE_CODE_INVALID" in error_msg: logger.error("❌ Неверный код") await client.disconnect() return else: logger.error(f"❌ Ошибка входа: {e}") await client.disconnect() return # Получаем информацию о пользователе me = await client.get_me() logger.info("") logger.info("✅ Успешная авторизация!") logger.info(f"👤 {me.first_name} {me.last_name or ''}") logger.info(f"📱 @{me.username or 'нет username'}") logger.info(f"🆔 ID: {me.id}") logger.info(f"📞 {me.phone}") logger.info("") # Сохраняем сессию session_string = client.session.save() session_filename = f"user_{me.id}.session" session_path = SESSIONS_DIR / session_filename with open(session_path, 'w', encoding='utf-8') as f: f.write(session_string) logger.info("💾 Сессия сохранена:") logger.info(f"📁 {session_path}") logger.info("") logger.info("📋 Следующие шаги:") logger.info("1. Файл сессии уже в папке sessions/") logger.info("2. Перезапустите worker: docker-compose restart worker") logger.info("3. Проверьте логи: docker-compose logs -f worker") logger.info("") logger.info("=" * 50) await client.disconnect() except KeyboardInterrupt: logger.info("") logger.info("❌ Отменено пользователем") except Exception as e: logger.error(f"❌ Ошибка: {e}") logger.exception("Полный стек:") raise if __name__ == "__main__": asyncio.run(main())