Как можно сделать что бы при пересылке фото и видео, все фото и видео с текстом пересылались одним сообщением на pyTelegramBotAPI 4.22.0

Я хочу что бы человек когда отправляет сообщение с фото и видео, мне оно приходило точно так же в виде одного сообщения, а не множества разных, но пока у меня не получилось так сделать, если кто-то уже сталкивался с таким, подскажите пожалуйста как это можно реализовать.

Я уже попробовал множество разных методов, и ни один не подходит. Кодом приведен последний из примеров.

Вот код который относится к пересылке сообщений.

Сначала я вызываю функцию которая потом перенаправляет меня на сам код который отвечает за пересылку.

@bot.message_handler(commands=['offer'])
def offer_news(message):
    bot.send_message(message.chat.id, "Предложите новость с текстом, фото и/или видео.")
    bot.register_next_step_handler(message, handle_media_group)

Вот сам код пересылки сообщений из бота к администратору администратор находится в списке.

Список:

AdminID = [12345678, 987654321]

Код пересылки:

@bot.message_handler(content_types=['photo', 'video'])
def handle_media_group(message):
    media_group = []
    
    if message.media_group_id:
        if message.content_type == 'photo':
            media_group.append(InputMediaPhoto(message.photo[-1].file_id, caption=message.caption))

        for admin_id in AdminID:
            bot.send_media_group(admin_id, media_group)
    else:
        # Если это одиночное фото или видео, отправляем отдельно
        if message.content_type == 'photo':
            for admin_id in AdminID:
                bot.send_photo(admin_id, message.photo[-1].file_id, caption=message.caption)
        elif message.content_type == 'video':
            for admin_id in AdminID:
                bot.send_video(admin_id, message.video.file_id, caption=message.caption)
    
    bot.send_message(message.chat.id, "Ваша новость отправлена администраторам.")

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

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

В логике кода вопроса есть существенные ошибки:

  1. В хендлере offer_news Вы регистрируете для следующего шага функцию handle_media_group с помощью соответствующего метода — это бессмысленно т.к.:
  • media_group_id — это только маркер для визуальной группировки от 2 до 10 сообщений в приложении, содержащих один из типов контента (audio, photo, video, document).
    Т.е., используя метод register_next_step_handler Вы обработаете одно сообщение первое из медиагруппы либо одиночное сообщение не входящее в медиагруппу.
  • далее в функции handle_media_group, если message.media_group_id not is None можно было бы регистрировать следующий шаг (рекурсивно вызывая эту же функцию).
    Но из-за ограничений Telegram Bot API не возможно получить историю сообщений, и в моменте мы не знаем —
    сколько сообщений принадлежат медиагруппе (2 или 10 !?).
    Тут можно воткнуть костыль, но это не круто...
  • функция handle_media_group зарегистрирована как хендлер (см. код ниже),
    и с указанным фильтром будет вызываться для всех сообщений содержащих перечисленные типы контента.
@bot.message_handler(content_types=['photo', 'video'])
def handle_media_group(message):
    media_group = []  # В media_group ни когда не будет больше одного элемента
    
    if message.media_group_id:
        if message.content_type == 'photo':
            media_group.append(
                InputMediaPhoto(message.photo[-1].file_id, caption=message.caption)
                )

        for admin_id in AdminID:
            bot.send_media_group(admin_id, media_group)
    else:
        # Next, the code for processing single messages
    
    bot.send_message(message.chat.id, "Ваша новость отправлена администраторам.")
  1. Ошибки в функции handle_media_group (см. код выше):
  • media_group должна быть глобальной переменной и не списком,
    а словарём вида:
    {'media_group_id': 'List'['InputMediaPhoto' | 'InputMediaVideo']}
  • при обработке сообщений принадлежащих медиагруппе в функции handle_media_group не должна происходить отправка, только заполнение значения в словаре media_group.
    Ну, и логика определения момента, когда обработаны все сообщения принадлежащие медиагруппе.
    Отправка медиагруппы выполняется другой функцией.

Отработав эти замечания,
и решив сложности с которыми столкнётесь двигаясь в указанном направлении...

Можете получить такой результат:

Предложение новости Получение новости админом
введите сюда описание изображения введите сюда описание изображения
→ Ссылка