Парсинг Telegram: как сохранить несколько медиа и текст из поста

    При разработке бота-автопостера и модуля парсера для Telegram часто возникает проблема: если в сообщении больше одного медиафайла, скачивается только часть, а текст теряется. В этой статье разберём типичные ошибки в коде на Telethon и предложим рабочие решения для корректного сохранения всех данных.

    Почему парсер не сохраняет несколько медиа?

    Основная причина - неправильная проверка типа message.media. В Telethon сообщение с несколькими медиа (например, альбом) представлено не как список, а как объект MessageMediaAlbum или группировка из нескольких сообщений. В вашем коде проверка isinstance(message.media, list) редко срабатывает, поэтому обработка нескольких файлов не запускается.

    Как Telethon обрабатывает альбомы?

    Альбомы (групповые медиа) в Telegram отправляются как отдельные сообщения с одним медиа, но с одинаковым grouped_id. Парсер должен собирать все сообщения с одинаковым grouped_id и обрабатывать их как единый пост. Ваш код получает только последние 10 сообщений, но не группирует их.

    Исправление кода: получаем все медиа из альбома

    Для корректного парсинга альбомов нужно:

    • Использовать client.get_messages с параметром limit, достаточным для захвата всех сообщений альбома.
    • Группировать сообщения по grouped_id.
    • Для каждой группы собирать все медиа и текст (обычно текст прикреплён к первому сообщению группы).

    Пример изменённого кода:

    from telethon.tl.types import MessageGroupedId
    
    async def process_album(messages, client, channel_folder):
        album_media = []
        album_text = None
        for msg in messages:
            if msg.text:
                album_text = msg.text
            if msg.media:
                file_path = f"{channel_folder}/media/{msg.id}.jpg"
                result = await client.download_media(msg.media, file_path)
                if result:
                    album_media.append({'type': 'media', 'file_path': result})
        return album_text, album_media
    

    Почему текст не сохраняется?

    В вашем коде текст сохраняется только если он есть в message.text, message.raw_text или message.caption. Для альбомов текст может быть только у одного сообщения группы. Если вы обрабатываете только первое сообщение, текст может быть утерян. Решение - собирать текст из всех сообщений альбома.

    Дополнительные ошибки в коде

    • Импорты: MessageMediaPhoto и MessageMediaDocument устарели в новых версиях Telethon. Используйте types.MessageMediaPhoto и types.MessageMediaDocument.
    • Путь сохранения: Для видео вы задаёте расширение .mp4, но тип медиа может быть другим. Лучше не указывать расширение вручную, а использовать client.download_media без второго аргумента или с именем файла без расширения - Telethon подставит правильное.
    • Логирование: Вы используете log_action с ADMIN_ID, но не проверяете, что ADMIN_ID определён - это может вызвать ошибку.

    Как правильно организовать сохранение?

    Рекомендуется:

    • Получать все сообщения из канала с запасом (например, limit=50).
    • Группировать по grouped_id.
    • Для каждой группы обрабатывать все медиа и текст.
    • Сохранять результат в JSON с указанием всех файлов и текста.
    • Обновлять last_post.json только после успешного сохранения группы.

    Заключение

    Парсинг альбомов в Telegram требует особого подхода из-за того, что они состоят из нескольких сообщений. Используя группировку по grouped_id и сбор всех медиа, вы сможете сохранять полный контент поста. Проверьте также версию Telethon и корректность импортов, чтобы избежать ошибок совместимости.

    Часто задаваемые вопросы