Как использовать библиотеку aiogram, чтобы скопировать альбом из одного чата и отправить его другому пользователю?

Каким образом можно правильно реализовать отправку альбома, состоящего из нескольких фотографий, вместе с текстом каждому пользователю в телеграм боте, при использовании aiogram 3, если стандартный метод send_copy_message отправляет только первое фото?
  • 21 октября 2023 г. 18:08
Ответы на вопрос 1
Для того чтобы скопировать альбом из одного чата и отправить его другому пользователю с использованием библиотеки aiogram, можно воспользоваться методом `send_media_group` или `send_copy_message`. Но, увы, в стандартной версии aiogram 3 метод `send_copy_message` действительно отправляет только первое фото.

Однако, можно воспользоваться несколькими подходами для отправки альбома с текстом каждому пользователю. 

Первый подход - разделить отправку фотографий и отправку текста на два отдельных сообщения. 

```python
async def send_album_with_text(user_id: int, photo_urls: List[str], captions: List[str]):
    for i in range(len(photo_urls)):
        if i == 0:
            message = await bot.send_photo(user_id, photo_urls[i], caption=captions[i])
        else:
            await bot.send_photo(user_id, photo_urls[i], reply_to_message_id=message.message_id, caption=captions[i])
```
В примере выше мы создаем отдельное сообщение с первым фото и текстом и сохраняем его в переменной `message`. Затем отправляем остальные фото с текстом, указывая `reply_to_message_id` равным `message.message_id`.

Второй подход - использовать метод `send_media_group`. В этом случае необходимо подготовить список `InputMediaPhoto` для каждого фото и объединить их в атрибут `media` в соответствующем порядке.

```python
async def send_album_with_text(user_id: int, photo_urls: List[str], captions: List[str]):
    media = [InputMediaPhoto(photo_url, caption=caption) for photo_url, caption in zip(photo_urls, captions)]
    await bot.send_media_group(user_id, media)
```
В данном примере мы создаем список `media` с помощью генератора списков, где каждому фото-URL соответствует `InputMediaPhoto` с соответствующим заголовком. Затем мы передаем данный список в метод `send_media_group` для отправки альбома.

В обоих случаях, аргумент `user_id` - это ID пользователя, которому вы хотите отправить альбом, а аргументы `photo_urls` и `captions` - это списки URL-адресов фотографий и соответствующих текстовых подписей. Вызов данной функции отправит альбом с фотографиями и текстом пользователю.
Похожие вопросы