#!/usr/bin/env python3
"""
Скрипт для создания сессии Telegram
Запустите этот скрипт для авторизации и создания файла сессии
"""
import asyncio
import os
import sys
from pathlib import Path
from dotenv import load_dotenv
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"
)
# Загрузка переменных окружения
load_dotenv()
# Конфигурация
API_ID = int(os.getenv("TELEGRAM_API_ID", "0"))
API_HASH = os.getenv("TELEGRAM_API_HASH", "")
PHONE = os.getenv("TELEGRAM_PHONE", "")
SESSIONS_DIR = Path("sessions")
async def main():
"""Создание сессии"""
try:
# Проверка конфигурации
if not all([API_ID, API_HASH]):
logger.error("❌ TELEGRAM_API_ID и TELEGRAM_API_HASH должны быть заданы в .env")
return
# Создаём директорию для сессий
SESSIONS_DIR.mkdir(exist_ok=True)
logger.info("🔐 Telegram Session Creator")
logger.info("=" * 40)
logger.info(f"API ID: {API_ID}")
logger.info(f"API Hash: {'*' * len(API_HASH) if API_HASH else 'Не задан'}")
logger.info(f"Phone: {PHONE or 'Будет запрошен'}")
logger.info("=" * 40)
# Запрос телефона если не задан
phone = PHONE
if not phone:
phone = input("📱 Введите номер телефона (с +7): ").strip()
# Создаём клиента
client = TelegramClient(
StringSession(),
API_ID,
API_HASH,
device_model="comment_bot",
system_version="Linux",
app_version="1.0",
lang_code="ru"
)
logger.info("Подключение к Telegram...")
await client.connect()
if not await client.is_user_authorized():
logger.info("Отправка кода подтверждения...")
try:
await client.send_code_request(phone)
except Exception as e:
logger.error(f"Ошибка отправки кода: {e}")
return
# Ввод кода
code = input("📲 Введите код из Telegram: ").strip()
try:
await client.sign_in(phone, code)
except Exception as e:
if "PASSWORD" in str(e):
# Запрос 2FA пароля
password = input("🔒 Введите 2FA пароль: ").strip()
await client.sign_in(password=password)
else:
logger.error(f"Ошибка входа: {e}")
return
# Получаем информацию о пользователе
me = await client.get_me()
logger.info(f"✅ Успешная авторизация: {me.first_name} @{me.username or 'no_username'}")
# Сохраняем сессию
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(f"💾 Сессия сохранена: {session_path}")
logger.info("")
logger.info("Следующие шаги:")
logger.info("1. Скопируйте файл сессии в папку sessions/")
logger.info("2. Запустите бота: python bot/controller.py")
logger.info("3. Запустите воркера: python bot/worker.py")
await client.disconnect()
except KeyboardInterrupt:
logger.info("\n❌ Отменено пользователем")
except Exception as e:
logger.error(f"❌ Ошибка: {e}")
raise
if __name__ == "__main__":
asyncio.run(main())