Пишу функцию рассылки для тг бота на Python библиотека Telebot

Пишу функцию рассылки для бота на библиотеке Telebot. В качестве метода рассылки выбрал метод копирования сообщений администратора.

Текстовая рассылка работает отлично, но при рассылке группы медиафайлов бот тупо копирует первый медиафайл и отправляет его в одном сообщении несколько раз.

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

Кусок кода:

@bot.message_handler(commands=['broadcast'])
def handle_broadcast(message):
    if message.from_user.id == ADMIN_ID:
        if message.reply_to_message:
            msg = message.reply_to_message
            user_ids = execute_query('SELECT user_id FROM users WHERE is_subscribed = 1').fetchall()
            media = []
            sent_count = 0  # Счетчик успешно отправленных сообщений

            # Проверяем, есть ли медиафайлы в сообщении
            if msg.photo:
                # Собираем все фото в список
                for photo in msg.photo:
                    media.append(types.InputMediaPhoto(photo.file_id))

                # Добавляем подпись, если она есть
                caption = msg.caption if msg.caption else ""

                for user_id in user_ids:
                    try:
                        # Отправляем группу медиафайлов
                        bot.send_media_group(chat_id=user_id[0], media=media)
                        # Отправляем подпись отдельно, если она есть
                        if caption:
                            bot.send_message(chat_id=user_id[0], text=caption)
                        sent_count += 1  # Увеличиваем счетчик
                        time.sleep(0.5)
                    except Exception as e:
                        print(f"Failed to send message to {user_id[0]}: {e}")

                bot.reply_to(message, f"Сообщение успешно разослано. Количество получателей: {sent_count}.")
            else:
                # Если это не фото, просто копируем сообщение
                for user_id in user_ids:
                    try:
                        bot.copy_message(chat_id=user_id[0], from_chat_id=msg.chat.id, message_id=msg.message_id)
                        sent_count += 1  # Увеличиваем счетчик
                        time.sleep(0.5)
                    ex

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

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

Проблема заключается в том, что библиотека Telebot ожидает конкретное содержание в объекте InputMediaPhoto для каждой фотографии в группе, а если передавать одно и то же file_id для всех медиафайлов, она отправит одно и то же изображение

Чтобы caption отображался правильно и каждая фотография была уникальной, в коде нужно:

  1. Создать один объект InputMediaPhoto для каждого фото из msg.photo.
  2. Добавить caption к первому объекту, как это ожидает API Telegram.
  3. Использовать результат обработки как один массив для send_media_group

def handle_broadcast(message):
    if message.from_user.id == ADMIN_ID:
        if message.reply_to_message:
            msg = message.reply_to_message
            user_ids = execute_query('SELECT user_id FROM users WHERE is_subscribed = 1').fetchall()
        sent_count = 0  # Счетчик успешно отправленных сообщений

        # Проверяем, есть ли медиафайлы в сообщении
        if msg.photo:
            media = []
            caption = msg.caption if msg.caption else ""

            # Добавляем каждое фото в список media, добавляя caption к первому фото
            for i, photo in enumerate(msg.photo):
                if i == 0:
                    media.append(types.InputMediaPhoto(photo.file_id, caption=caption))
                else:
                    media.append(types.InputMediaPhoto(photo.file_id))

            # Рассылаем медиафайлы всем пользователям
            for user_id in user_ids:
                try:
                    bot.send_media_group(chat_id=user_id[0], media=media)
                    sent_count += 1  # Увеличиваем счетчик
                    time.sleep(0.5)
                except Exception as e:
                    print(f"Failed to send message to {user_id[0]}: {e}")

            bot.reply_to(message, f"Сообщение успешно разослано. Количество получателей: {sent_count}.")
        else:
            # Если это не фото, просто копируем сообщение
            for user_id in user_ids:
                try:
                    bot.copy_message(chat_id=user_id[0], from_chat_id=msg.chat.id, message_id=msg.message_id)
                    sent_count += 1  # Увеличиваем счетчик
                    time.sleep(0.5)
                except Exception as e:
                    print(f"Failed to send message to {user_id[0]}: {e}")
→ Ссылка
Автор решения: ksov

Код, который исправил stackoverflow_errors работает. Но проблема с фотографиями сохраняется. Бот берёт и дублирует одну фотографию n-ое кол-во раз (См. Скрин). Не совсем понимаю с чем это может быть связано.Сообщение, которое отправляет администратор Сообщение получаемое пользователем

→ Ссылка