Бот пересылает только первое изображение и текст (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