Эхо бот который отправляет обратно ГРУППУ ФОТО ВМЕСТЕ С ОПИСАНИЕМ(telebot python)

Смотрите, есть бот, которому я присылаю целую группу картинок одновременно и мне нужно, что бы бот ответил тем же. У этой группы картинок тоже есть описание и это тоже нужно отправить боту

caption = ''
media_group = []
old_media_group = []
@bot.message_handler(content_types=["photo"])
def handle_photos(message):
    global media_group
    global old_media_group
    global caption
    photos = message.photo
    for i in photos:
        if i not in old_media_group:
            media_group.append(types.InputMediaPhoto(i.file_id))
            old_media_group.append(types.InputMediaPhoto(i.file_id))
        else:
            media_group.clear()
    caption = message.caption
    if caption != '':
        bot.send_media_group(message.chat.id, media_group)
        bot.send_message(message.chat.id, caption)
        media_group.clear()
        caption = ''
    '''
    global caption
    photos = message.photo

    if caption == '':
        try:
            caption = message.text
        except:
            caption = message.caption
    bot.send_message(message.chat.id, str(message)[:3000])
    media_group = []
    for photo in photos:
        media_group.append(types.InputMediaPhoto(photo.file_id))
    if checker(message.message_id, len(media_group)):
        bot.send_message(message.chat.id, 'Ваше сообщение будет отправлено в канал')
        bot.send_media_group(channel_chat_id, media_group)
        bot.send_message(channel_chat_id, caption)'''

Если я что-то не дописал, то напомните мне пожалуйста. Я очень много нервов потратил на этот код


Ответы (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)
→ Ссылка