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 шт):
Сообщение с различными медиафайлами в телеграме - это группа разных сообщений. То есть на каждый медиа файл приходится 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}/")