Пишу функцию рассылки для тг бота на 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 шт):
Проблема заключается в том, что библиотека Telebot
ожидает конкретное содержание в объекте InputMediaPhoto
для каждой фотографии в группе, а если передавать одно и то же file_id
для всех медиафайлов, она отправит одно и то же изображение
Чтобы caption
отображался правильно и каждая фотография была уникальной, в коде нужно:
- Создать один объект
InputMediaPhoto
для каждого фото изmsg.photo
. - Добавить
caption
к первому объекту, как это ожидаетAPI Telegram
. - Использовать результат обработки как один массив для
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}")
Код, который исправил stackoverflow_errors работает. Но проблема с фотографиями сохраняется. Бот берёт и дублирует одну фотографию n-ое кол-во раз (См. Скрин). Не совсем понимаю с чем это может быть связано.