Парсинг 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 и корректность импортов, чтобы избежать ошибок совместимости.