0.0.1 Features: - Multi-account support via session files - AI comments generation via Ollama (local LLM) - Telegram bot for moderation (approve/reject/regenerate) - Docker support (controller + worker) - Auto-join public groups - Comment regeneration on group re-add - Statistics tracking Tech stack: - Python 3.11 - Telethon 1.34 (Telegram user client) - Aiogram 3.4 (Telegram bot framework) - SQLite (Database) - Docker & Docker Compose - Ollama (Local LLM)
131 lines
4.4 KiB
Python
131 lines
4.4 KiB
Python
#!/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="<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"
|
||
)
|
||
|
||
# Загрузка переменных окружения
|
||
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())
|