Python/Telethon получение N медиа поста

Я пытаюсь получить медиа постов в телеграмм-канале

Я заметил такую вещь, что если у поста больше 1 медиа, скажем там 3 фотографии, то они будут находиться в разных message.

Например, скажем в посте с id = 1 - 3 фото, когда я получу это сообщение через этот код у поста (message) с id = 1 будет лишь одно фото, а у message с id = 2 будет следующее фото этого поста и тд.

Мне нужно как то группировать медиа по постам, спасибо

код:

history = await client(GetHistoryRequest(
        peer=input_channel,
        offset_id=offset_id,
        offset_date=None,
        add_offset=0,
        limit=limit,
        max_id=0,
        min_id=0,
        hash=0
    ))
    messages: List[Message] = history.messages

    for message in messages:
        if message.id == 2607:
            print(message)
        if message.id == 2606:
            print(message)

        if isinstance(message.media, MessageMediaPhoto):
            await client.download_media(message.media, "")

Ответы (2 шт):

Автор решения: Medvedev

Сообщение с различными медиафайлами в телеграме - это группа разных сообщений. То есть на каждый медиа файл приходится 1 отдельное сообщение. Все эти отдельные сообщения группируются в медиа группу и имеют уникальный grouped_id.

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

@client.on(events.NewMessage(group_id))  # ID группы, из которой берем сообщение
async def handler(event):
    # Выводим новое сообщение в консоль
    print(f'{event.message=}')

И в нем увидим увидим параметр group_id, который будет одинаковым для всех сообщений одной медиагруппы:

Message(id=779, ... media=MessageMediaPhoto(spoiler=False, photo=Photo(id=5 ... ),
... , grouped_id=13893721687211770, ... )

Получив group_id = event.message.grouped_id можно выстраивать дальнейшую логику, собирать все сообщения в одно медиа-сообщение и отправлять далее как вам нужно

→ Ссылка
Автор решения: Рустам Рысаев

Это называется альбом фотографий, и не совсем понятно что вы хотите делать с этими постами. сохранять, или переслыать, или отправлять?

Чтобы правильно группировать медиа по постам, нужно учитывать grouped_id

# Словарь для хранения медиа
grouped_media = defaultdict(list)

history = await client(GetHistoryRequest(
    peer=input_channel,
    offset_id=offset_id,
    offset_date=None,
    add_offset=0,
    limit=limit,
    max_id=0,
    min_id=0,
    hash=0
))
messages = history.messages

# Цикл по сообщениям
for message in messages:
    if isinstance(message.media, (MessageMediaPhoto, MessageMediaDocument)):
        group_id = message.grouped_id or message.id
        grouped_media[group_id].append(message)

# Сохранение медиа
for group_id, media_messages in grouped_media.items():
    
    for msg in media_messages:
        await client.download_media(msg.media, f"downloads/{group_id}/")
→ Ссылка