#!/usr/bin/env python3
"""
СБОРЩИК КОММЕНТАРИЕВ ИЗ TELEGRAM КАНАЛА

Парсит СУЩЕСТВУЮЩИЕ комментарии под последними 4 постами в @applifegame
Использует MTProto API (Telethon) - ЕДИНСТВЕННЫЙ способ получить историю!

Bot API НЕ МОЖЕТ парсить историю - только MTProto!
"""

import asyncio
import os
from telethon import TelegramClient
from telethon.tl.functions.messages import GetRepliesRequest
from datetime import datetime

# КОНФИГУРАЦИЯ - ЗАМЕНИТЕ НА СВОИ ЗНАЧЕНИЯ!
API_ID = 'YOUR_API_ID'  # Получить на https://my.telegram.org/apps
API_HASH = 'YOUR_API_HASH'  # Получить на https://my.telegram.org/apps
CHANNEL_USERNAME = 'applifegame'  # Канал для парсинга
OUTPUT_FILE = '/var/www/wsalesite.ru/avatar/channel_comments_usernames.txt'
POSTS_TO_ANALYZE = 4  # Количество последних постов

async def main():
    print("=" * 70)
    print("🚀 СБОРЩИК КОММЕНТАРИЕВ - ПАРСИНГ СУЩЕСТВУЮЩИХ КОММЕНТАРИЕВ")
    print("=" * 70)
    print(f"📢 Канал: @{CHANNEL_USERNAME}")
    print(f"📊 Количество постов: {POSTS_TO_ANALYZE}")
    print("=" * 70 + "\n")
    
    # Создаем клиент (при первом запуске попросит ввести номер телефона и код)
    async with TelegramClient('avatar_comments_session', API_ID, API_HASH) as client:
        print("✅ Подключено к Telegram")
        print(f"   Ваш аккаунт: {await client.get_me()}\n")
        
        # Получаем канал
        try:
            channel = await client.get_entity(CHANNEL_USERNAME)
            print(f"✅ Канал найден: {channel.title}")
            print(f"   ID: {channel.id}")
            print(f"   Подписчиков: {getattr(channel, 'participants_count', 'N/A')}\n")
        except Exception as e:
            print(f"❌ ОШИБКА: Не удалось получить канал @{CHANNEL_USERNAME}")
            print(f"   {e}")
            return
        
        # Получаем последние посты
        print(f"🔍 Шаг 1: Получаем последние {POSTS_TO_ANALYZE} постов с комментариями...")
        print("-" * 70)
        
        posts_with_replies = []
        post_count = 0
        
        async for message in client.iter_messages(channel, limit=100):
            # Проверяем, есть ли комментарии (replies)
            if message.replies and message.replies.replies > 0:
                posts_with_replies.append(message)
                post_count += 1
                
                # Показываем информацию о посте
                text_preview = (message.text or message.message or "Медиа")[:50]
                print(f"   ✅ Пост #{message.id}: {message.replies.replies} комментариев")
                print(f"      Дата: {message.date}")
                print(f"      Текст: {text_preview}...\n")
                
                if post_count >= POSTS_TO_ANALYZE:
                    break
        
        if not posts_with_replies:
            print("⚠️  НЕ НАЙДЕНО постов с комментариями!")
            print("   Возможно, в канале отключены комментарии")
            return
        
        print(f"✅ Найдено постов с комментариями: {len(posts_with_replies)}\n")
        
        # Собираем комментарии
        print("🔍 Шаг 2: ПАРСИМ СУЩЕСТВУЮЩИЕ КОММЕНТАРИИ...")
        print("=" * 70)
        
        all_usernames = set()
        posts_data = []
        
        for i, post in enumerate(posts_with_replies, 1):
            print(f"\n📝 Пост {i}/{len(posts_with_replies)} (ID: {post.id})")
            print(f"   Ожидается комментариев: {post.replies.replies}")
            
            post_usernames = []
            comment_count = 0
            
            # ПАРСИМ комментарии к этому посту
            try:
                # Получаем все replies (комментарии) к этому посту
                async for comment in client.iter_messages(
                    entity=channel,
                    reply_to=post.id,
                    limit=None  # Получаем ВСЕ комментарии
                ):
                    comment_count += 1
                    
                    if comment.sender:
                        # Формируем идентификатор пользователя
                        if comment.sender.username:
                            username = f"@{comment.sender.username}"
                        else:
                            first = comment.sender.first_name or ''
                            last = comment.sender.last_name or ''
                            full_name = f"{first} {last}".strip()
                            username = full_name if full_name else f"ID:{comment.sender.id}"
                        
                        post_usernames.append(username)
                        all_usernames.add(username)
                
                print(f"   ✅ Спарсено комментариев: {comment_count}")
                print(f"   ✅ Уникальных пользователей: {len(set(post_usernames))}")
                
                posts_data.append({
                    'post_id': post.id,
                    'post_date': post.date,
                    'post_text': (post.text or post.message or "Медиа")[:100],
                    'usernames': post_usernames
                })
                
            except Exception as e:
                print(f"   ❌ Ошибка при парсинге: {e}")
        
        # Формируем результат
        print("\n" + "=" * 70)
        print("💾 Шаг 3: Сохраняем результаты...")
        print("=" * 70 + "\n")
        
        output = f"# Ники пользователей из комментариев канала @{CHANNEL_USERNAME}\n"
        output += f"# Дата сбора: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
        output += f"# Метод: MTProto API (Telethon) - парсинг существующих комментариев\n"
        output += f"# Количество постов: {len(posts_data)}\n"
        output += "=" * 70 + "\n\n"
        
        total_comments = 0
        
        for i, post_data in enumerate(posts_data, 1):
            output += f"## Пост {i} (ID: {post_data['post_id']})\n"
            output += f"Дата поста: {post_data['post_date']}\n"
            output += f"Текст: {post_data['post_text']}\n"
            output += f"Комментариев: {len(post_data['usernames'])}\n"
            output += f"Уникальных пользователей: {len(set(post_data['usernames']))}\n"
            output += "-" * 70 + "\n"
            
            # Сортируем и убираем дубликаты в рамках поста
            unique_usernames = sorted(set(post_data['usernames']))
            for username in unique_usernames:
                output += f"{username}\n"
            
            output += "\n"
            total_comments += len(post_data['usernames'])
        
        # Итоговый список ВСЕХ уникальных пользователей
        output += "=" * 70 + "\n"
        output += f"## ИТОГО: Все уникальные ники (всего: {len(all_usernames)})\n"
        output += "=" * 70 + "\n"
        
        for username in sorted(all_usernames):
            output += f"{username}\n"
        
        # Сохраняем
        with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
            f.write(output)
        
        print("\n" + "=" * 70)
        print("✅ ГОТОВО! КОММЕНТАРИИ СПАРСЕНЫ!")
        print("=" * 70)
        print(f"📊 Статистика:")
        print(f"   - Проанализировано постов: {len(posts_data)}")
        print(f"   - Всего комментариев: {total_comments}")
        print(f"   - Уникальных пользователей: {len(all_usernames)}")
        print(f"   - Файл результатов: {OUTPUT_FILE}")
        print("=" * 70)
        print("\n✅ Файл готов к использованию!")

if __name__ == '__main__':
    asyncio.run(main())