Бот пересылает только первое изображение и текст (telebot)

У меня есть функция которая получает, какое сообщение надо скопировать:

@bot.message_handler(commands=['post'])
def post_to_channel(message):
    reply_to_message = message.reply_to_message
    if reply_to_message:
        admin_id = message.from_user.id
        channel_id = get_value_from_admin_data_db(admin_id, 'channel_id')
        copy_message_to_channel(bot, reply_to_message, channel_id)
        bot.delete_message(message.chat.id, message.message_id)
    else:
        bot.reply_to(message, "Эта команда должна быть ответом на сообщение, которое вы хотите запостить.")

А так же функция которая собственно и должна копировать:

def copy_message_to_channel(bot, message, channel_id):
    try:
        sent_message = bot.copy_message(
            chat_id=channel_id,    
            from_chat_id=message.chat.id,
            message_id=message.message_id
            )
        
        bot.delete_message(
        chat_id=message.chat.id,
        message_id=message.message_id
        )
        
        return sent_message
    except Exception:
        bot.reply_to(message, 'Произошла ошибка, убедитесь, что вы указали корректный channel_id.\nОшибка так же может возникнуть, если бот не добавлен в канал/не обладает нужными правами.')

Проблема в том, что функция копирует только первое изображение и подпись: Пост до отправки Пост после отправки

При этом функция forward message работет так же, может быть ошибка в том, что бот принимает именно сообщение на которое ответили, решить так и не смог(


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

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

Решил для вас сделать небольшой пример, для наглядности добавил комментарий к коду:

import telebot
from telebot import types

TOKEN = 'TOKEN'
bot = telebot.TeleBot(TOKEN)

# Словарь для хранения данных о файлах групп медиа для каждого пользователя
user_media_groups = {}

@bot.message_handler(commands=['start'])
def start(message):
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(types.KeyboardButton(text='Верни мои фото'))

    # Отправляем сообщение с кнопкой для возврата медиагруппы
    bot.send_message(message.chat.id, "Привет! Это эхо-бот. Пришли мне несколько картинок.", reply_markup=keyboard)

@bot.message_handler(content_types=['photo'])# , func=lambda message: message.media_group_id is not None) # Если хотим обрабатывать только медио группу, а не отдельные фото
def echo_media_group(message):
    user_id = message.from_user.id
    media_group_id = message.media_group_id

    photo_id = bot.get_file(message.photo[-1].file_id).file_id
    caption = message.caption
    
    # Проверяем, есть ли уже сохраненные данные о группе медиа для текущего пользователя
    if user_id in user_media_groups:
        # Проверяем, совпадает ли media_group_id текущего сообщения с предыдущим сохраненным
        if media_group_id and media_group_id == user_media_groups[user_id]['media_group_id']:
            # Добавляем новые идентификаторы фотографии в список
            user_media_groups[user_id]['photo_ids'].append(photo_id)
        else:
            # Если media_group_id не совпадает или None(отправлено 1 фото), удаляем предыдущие данные о группе медиа
            del user_media_groups[user_id]
            # Инициализируем новую группу медиа
            user_media_groups[user_id] = {
                'media_group_id': media_group_id,
                'photo_ids': [photo_id],
                'caption': caption,
            }
    else:
        # Сохраняем информацию о группе медиа для текущего пользователя если она еще не была инициализированна ранее 
        user_media_groups[user_id] = {
            'media_group_id': media_group_id,
            'photo_ids': [photo_id],
            'caption': caption,
        }
        
    if caption is not None:
        user_media_groups[user_id]['caption'] = caption

    # Отладка
    print(user_media_groups)
 
@bot.message_handler(func=lambda message: message.text == 'Верни мои фото')
def send_media_group(message):
    user_id = message.from_user.id
    print(user_media_groups)

    # Проверяем, есть ли сохраненные данные о группе медиа для текущего пользователя
    if user_id in user_media_groups:
        media_group = [types.InputMediaPhoto(media, caption=user_media_groups[user_id]['caption'] if index == 0 else '') for index, media in enumerate(user_media_groups[user_id]['photo_ids'])]
        bot.send_media_group(chat_id=message.chat.id, media=media_group)
    else:
        bot.send_message(message.chat.id, "Нет сохраненных данных о группе медиа для текущего пользователя.")   

bot.polling(none_stop=True)

введите сюда описание изображения

Второй пример:

import telebot
from telebot import types

bot = telebot.TeleBot('')

@bot.message_handler(commands=['start'])
def send_welcome(message):
    bot.reply_to(message, "Привет! Напиши мне..")

@bot.message_handler(func=lambda message: True)
def send_media_group(message):
   
    media_group = []
    media_group.append(types.InputMediaPhoto('https://ru.freepik.com/free-photo/beautiful-kitten-with-flowers-outdoors_64649240.htm#query=%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8&position=0&from_view=keyword&track=ais_user&uuid=9a385a36-796e-4739-baf6-d79e84799a40', caption='Фото'))
    media_group.append(types.InputMediaPhoto('https://ru.freepik.com/free-photo/beautiful-kitten-with-colorful-clouds_64664723.htm#query=%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8&position=1&from_view=keyword&track=ais_user&uuid=9a385a36-796e-4739-baf6-d79e84799a40'))
    media_group.append(types.InputMediaPhoto('https://ru.freepik.com/free-photo/cute-kitten-sitting-outdoors-playful-and-staring-at-toy-generated-by-artificial-intelligence_161459728.htm#query=%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B8&position=2&from_view=keyword&track=ais_user&uuid=9a385a36-796e-4739-baf6-d79e84799a40'))

    # Отправка медиагруппы
    sent_message = bot.send_media_group(message.chat.id, media=media_group)

    # Получение и сохранение ID каждой отправленной фотографии
    for media in sent_message:
        if media.photo:
            photo_id = media.photo[-1].file_id
            # Здесь можно сохранить photo_id в базу данных или обработать каким-то другим способом
            print(f"ID фотографии: {photo_id}")
            # Проверка корректности photo_id
            bot.send_photo(message.chat.id, photo_id)
bot.polling()

Пример полученных photo_id:

ID фотографии: AgACAgQAAxkDAAIOLmZfaS3tmiyQtvjUKCRANdRvrfJuAALCtDEblgj8Unzsex9oJF_uAQADAgADeAADNQQ
ID фотографии: AgACAgQAAxkDAAIOL2ZfaS3VsqLhjS7Q8h39t69rELFUAAKeszEbwr6dUCFJOstTYG2EAQADAgADeAADNQQ
ID фотографии: AgACAgQAAxkDAAIOMGZfaS2P12pG1MTQKoUnZNLMvBVsAAI8tDEb46YFU5n5QLjhZorzAQADAgADeAADNQQ
→ Ссылка