Files
batch-bot/auth.py
bilal bb27161524 Final release: Multi-session comment bot with filtering
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
2026-02-28 01:44:40 +03:00

169 lines
5.8 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
"""
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())