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:
2026-02-28 01:44:40 +03:00
parent a18ad30961
commit bb27161524
8 changed files with 537 additions and 99 deletions

132
auth.py
View File

@@ -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