Как можно сделать что бы при пересылке фото и видео, все фото и видео с текстом пересылались одним сообщением на 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 шт):
В логике кода вопроса есть существенные ошибки:
- В хендлере
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, "Ваша новость отправлена администраторам.")
- Ошибки в функции
handle_media_group
(см. код выше):
media_group
должна быть глобальной переменной и не списком,
а словарём вида:
{'media_group_id': 'List'['InputMediaPhoto' | 'InputMediaVideo']}
- при обработке сообщений принадлежащих медиагруппе в функции
handle_media_group
не должна происходить отправка, только заполнение значения в словареmedia_group
.
Ну, и логика определения момента, когда обработаны все сообщения принадлежащие медиагруппе.
Отправка медиагруппы выполняется другой функцией.
Отработав эти замечания,
и решив сложности с которыми столкнётесь двигаясь в указанном направлении...
Можете получить такой результат: