Features: - Multi-account support (session files) - AI comments via Ollama - Telegram bot moderation - Filter by sessions and groups - Docker support - Auto-join groups - Log notifications - DB migration script Bug fixes: - Fixed comment_to for proper post targeting - Fixed entity lookup with multiple ID formats - Fixed callback handlers for filtering - Added auto-join before entity lookup
169 lines
5.8 KiB
Python
169 lines
5.8 KiB
Python
#!/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="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>",
|
||
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())
|