User: Отвечай на вопросы строго простым текстом. Не используй Markdown (**жирный текст**, *курсив*), LaTeX (\(скобки\), \frac{}{}, \times, \boxed), фигурные скобки {} или другие символы форматирования. Для умножения используй *, для дробей — / Если пользователь просит сделать презентацию ответь "генерация презентации"
Assistant: Understood. I will strictly follow these instructions in this conversation.
User: import os
import pandas as pd
import random
import time
from dotenv import load_dotenv
from telethon import TelegramClient

load_dotenv()
API_ID = os.getenv('API_ID')  # Ваш API ID
API_HASH = os.getenv('API_HASH')  # Ваш API Hash
PHONE_NUMBER = os.getenv('PHONE_NUMBER')  # Ваш номер телефона

# Создаем клиент Telegram
client = TelegramClient('session_name', API_ID, API_HASH)

async def get_comments_count(chat_id, message_id):
    comments_count = 0
    async for message in client.iter_messages(chat_id):
        if message.reply_to_msg_id == message_id:
            comments_count += 1
    return comments_count

async def get_messages(chat_id, message_id, existing_messages):
    async with client:
        messages = []
        
        # Получаем конкретное сообщение по его ID
        message = await client.get_messages(chat_id, ids=message_id)
        
        # Проверяем, был ли пост уже сохранен
        if message.id in existing_messages:
            print(f"Сообщение ID {message.id} уже обработано.")
            return messages
        
        # Количество реакций
        reactions_count = sum(reaction.count for reaction in message.reactions.reactions) if message.reactions and message.reactions.reactions else 0
        
        comments_count = await get_comments_count(chat_id, message.id)  # Получаем количество комментариев
        views_count = message.views if message.views else 0  # Получаем количество просмотров

        # Определяем количество вложений
        media_count = 1 if message.media else 0

        messages.append({
            'Сообщение': message.message,
            'Реакции': reactions_count,
            'Комментарии': comments_count,
            'Просмотры': views_count,
            'Количество вложений': media_count,
            'Дата': message.date.isoformat(),
            'Владелец ответил': message.reply_to_msg_id is not None,
            'ID': message.id  # Сохраняем ID сообщения для проверки
        })

        # Случайный таймслип для предотвращения блокировок
        time.sleep(random.uniform(1, 3))  # Задержка от 1 до 3 секунд
        
        print(f"Обработано сообщение ID: {message.id}")

        return messages

def save_to_excel(data, channel_name, link, title, filename='output_tg.xlsx'):
    df = pd.DataFrame(data)
    df['Название канала'] = channel_name
    df['Ссылка'] = link
    df['Название'] = title
    
    # Если файл существует, добавляем новые данные к существующим
    if os.path.exists(filename):
        existing_df = pd.read_excel(filename)
        df = pd.concat([existing_df, df]).drop_duplicates(subset=['ID'], keep='last')
    
    df.to_excel(filename, index=False)
вот часть кода
вот ошибка
Traceback (most recent call last):
  File "/home/torshindd/Downloads/project glavy/tg/tg_stats.py", line 106, in <module>
    client.loop.run_until_complete(main())
  File "/usr/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/home/torshindd/Downloads/project glavy/tg/tg_stats.py", line 97, in main
    results = await get_messages(chat_id, message_id, existing_messages)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/torshindd/Downloads/project glavy/tg/tg_stats.py", line 36, in get_messages
    reactions_count = sum(reaction.count for reaction in message.reactions.reactions) if message.reactions and message.reactions.reactions else 0
                                                                                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'MessageReactions' object has no attribute 'reactions'
Assistant: