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
This commit is contained in:
132
auth.py
132
auth.py
@@ -1,14 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Скрипт для создания сессии Telegram
|
||||
Запустите этот скрипт для авторизации и создания файла сессии
|
||||
Telegram Session Creator
|
||||
Создаёт сессию для бота через интерактивную авторизацию
|
||||
"""
|
||||
|
||||
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
|
||||
@@ -27,80 +26,114 @@ logger.add(
|
||||
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")
|
||||
# Пути
|
||||
BASE_DIR = Path(__file__).parent
|
||||
SESSIONS_DIR = BASE_DIR / "sessions"
|
||||
SESSIONS_DIR.mkdir(exist_ok=True)
|
||||
|
||||
|
||||
async def main():
|
||||
"""Создание сессии"""
|
||||
try:
|
||||
# Проверка конфигурации
|
||||
if not all([API_ID, API_HASH]):
|
||||
logger.error("❌ TELEGRAM_API_ID и TELEGRAM_API_HASH должны быть заданы в .env")
|
||||
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
|
||||
|
||||
# Создаём директорию для сессий
|
||||
SESSIONS_DIR.mkdir(exist_ok=True)
|
||||
logger.info("")
|
||||
logger.info("📱 Введите номер телефона")
|
||||
logger.info("Формат: +79991234567 (с кодом страны)")
|
||||
logger.info("")
|
||||
|
||||
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 = input("Номер телефона: ").strip()
|
||||
|
||||
# Запрос телефона если не задан
|
||||
phone = PHONE
|
||||
if not phone:
|
||||
phone = input("📱 Введите номер телефона (с +7): ").strip()
|
||||
logger.error("❌ Номер телефона обязателен")
|
||||
return
|
||||
|
||||
# Создаём клиента
|
||||
client = TelegramClient(
|
||||
StringSession(),
|
||||
API_ID,
|
||||
API_HASH,
|
||||
device_model="comment_bot",
|
||||
system_version="Linux",
|
||||
app_version="1.0",
|
||||
lang_code="ru"
|
||||
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("Подключение к Telegram...")
|
||||
logger.info("")
|
||||
logger.info("⏳ Подключение к Telegram...")
|
||||
await client.connect()
|
||||
|
||||
if not await client.is_user_authorized():
|
||||
logger.info("Отправка кода подтверждения...")
|
||||
logger.info("📲 Отправка кода подтверждения...")
|
||||
|
||||
try:
|
||||
await client.send_code_request(phone)
|
||||
logger.info(f"✅ Код отправлен на {phone}")
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка отправки кода: {e}")
|
||||
logger.error(f"❌ Ошибка отправки кода: {e}")
|
||||
await client.disconnect()
|
||||
return
|
||||
|
||||
# Ввод кода
|
||||
code = input("📲 Введите код из Telegram: ").strip()
|
||||
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:
|
||||
if "PASSWORD" in str(e):
|
||||
error_msg = str(e)
|
||||
|
||||
if "SESSION_PASSWORD_NEEDED" in error_msg or "2FA" in error_msg.upper():
|
||||
# Запрос 2FA пароля
|
||||
password = input("🔒 Введите 2FA пароль: ").strip()
|
||||
await client.sign_in(password=password)
|
||||
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}")
|
||||
logger.error(f"❌ Ошибка входа: {e}")
|
||||
await client.disconnect()
|
||||
return
|
||||
|
||||
# Получаем информацию о пользователе
|
||||
me = await client.get_me()
|
||||
logger.info(f"✅ Успешная авторизация: {me.first_name} @{me.username or 'no_username'}")
|
||||
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()
|
||||
@@ -110,19 +143,24 @@ async def main():
|
||||
with open(session_path, 'w', encoding='utf-8') as f:
|
||||
f.write(session_string)
|
||||
|
||||
logger.info(f"💾 Сессия сохранена: {session_path}")
|
||||
logger.info("💾 Сессия сохранена:")
|
||||
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")
|
||||
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("\n❌ Отменено пользователем")
|
||||
logger.info("")
|
||||
logger.info("❌ Отменено пользователем")
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Ошибка: {e}")
|
||||
logger.exception("Полный стек:")
|
||||
raise
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user