Эхо бот который отправляет обратно ГРУППУ ФОТО ВМЕСТЕ С ОПИСАНИЕМ(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)