Как отправить фото пользователя администратору с помощью Aiogram?

Мне требуется помощь в создании бота-предложки. У меня возникла следующая проблема: <br/> <br/> Я не могу понять, как реализовать отправку фотографий. Мне необходимо, чтобы бот мог отправлять как несколько фотографий одновременно, так и одно изображение. Я смог настроить отправку только одного изображения, но не знаю, как реализовать отправку группы фотографий. <br/> <br/> (Я совсем неопытен в этом деле).
  • 25 января 2025 г. 18:54
Ответы на вопрос 2
Чтобы отправить фото пользователя администратору с помощью библиотеки Aiogram, вам нужно будет использовать методы отправки медиа. В этом примере я покажу, как отправить как одно изображение, так и группу изображений (галерею) администратору.

### Установка Aiogram

Если вы ещё этого не сделали, сначала установите библиотеку Aiogram:

```bash
pip install aiogram
```

### Основной код

Вот примерный скелет кода, который демонстрирует, как отправить одно изображение и несколько изображений боту-администратору.

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher import Storage
from aiogram.utils import executor

API_TOKEN = 'ВАШ_API_TOKEN'
ADMIN_ID = 'Ваш ID администратора'

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=MemoryStorage())

# Хэндлер для получения фото от пользователя
@dp.message_handler(content_types=types.ContentType.PHOTO)
async def handle_photo(message: types.Message):
    # Получаем файл изображения
    file_id = message.photo[-1].file_id
    file = await bot.get_file(file_id)
    
    # Отправляем одно изображение администратору
    await bot.send_photo(ADMIN_ID, photo=file.file_id, caption='Получено одно изображение.')
    
    # Если нужно отправить несколько изображений, например, вы решите сохранить их в список
    # и потом отправить все сразу
    # await send_multiple_photos(ADMIN_ID, [file_id1, file_id2, file_id3])

# Функция для отправки нескольких изображений
async def send_multiple_photos(chat_id, photo_ids):
    media = []
    for photo_id in photo_ids:
        media.append(types.InputMediaPhoto(photo_id))
    
    # Отправляем группу изображений
    await bot.send_media_group(chat_id, media)

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
```

### Объяснение кода

1. **Импортируем необходимые библиотеки и создаем объект бота**.
2. **Обработчик сообщений**: `@dp.message_handler(content_types=types.ContentType.PHOTO)` обрабатывает фотографии, отправленные пользователем.
3. **Отправка фотографии администратору**: После получения фотографии от пользователя мы извлекаем `file_id` и отправляем её администратору.
4. **Функция для отправки нескольких изображений**: `send_multiple_photos` формирует список изображений с помощью `InputMediaPhoto` и использует `bot.send_media_group`, чтобы отправить их в одном сообщении.

### Отправка нескольких фотографий

Чтобы отправить несколько фотографий сразу, вы можете вызвать `send_multiple_photos` с массивом идентификаторов файлов, которые хотите отправить.

### Важные моменты
- Убедитесь, что вы заменили `'ВАШ_API_TOKEN'` и `ADMIN_ID` на соответствующие значения.
- Этот бот будет отправлять только фотографии. Вы можете добавить дополнительные функции по обработке текстов, видео и других типов контента по аналогии. 

Теперь у вас есть базовый шаблон для отправки как одиночных, так и групповых изображений!
Когда пользователь отправляет несколько фотографий одним сообщением (альбомом), Telegram отправляет их как группу с одинаковым media_group_id. Нужно собрать все части группы в media_groups по media_group_id. 
Либо, если пользователь отправляет одно фото, обрабатывать сразу и отправлять администратору.

from aiogram import Bot, Dispatcher, types
from aiogram.types import MediaGroup
from aiogram.utils import executor
import asyncio

API_TOKEN = 'YOUR_BOT_API_TOKEN'
ADMIN_CHAT_ID = 'ADMIN_CHAT_ID'  # Замените на ID чата администратора

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

# Хранение временных данных для групп фотографий
media_groups = {}

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.reply("Привет! Отправь мне фотографии для предложки.")

@dp.message_handler(content_types=types.ContentType.PHOTO)
async def handle_photo(message: types.Message):
    user_id = message.from_user.id
    media_group_id = message.media_group_id

    if media_group_id:
        # Если это группа медиафайлов
        if media_group_id not in media_groups:
            media_groups[media_group_id] = {
                'user_id': user_id,
                'photos': []
            }

        # Добавляем фото в группу
        media_groups[media_group_id]['photos'].append(message.photo[-1].file_id)

        # Ждем завершения группы (Telegram отправляет группу частями)
        await asyncio.sleep(1)  # Небольшая задержка для сбора всех частей группы
    else:
        # Если это одиночное фото
        await bot.send_photo(ADMIN_CHAT_ID, message.photo[-1].file_id)

@dp.message_handler(content_types=types.ContentType.ANY)
async def handle_media_group(message: types.Message):
    """Обработчик для завершения группы медиафайлов."""
    media_group_id = message.media_group_id

    if media_group_id and media_group_id in media_groups:
        # Отправляем группу фотографий администратору
        group_data = media_groups[media_group_id]
        album = MediaGroup()

        for photo in group_data['photos']:
            album.attach_photo(photo)

        await bot.send_media_group(ADMIN_CHAT_ID, media=album)

        # Удаляем группу из временного хранилища
        del media_groups[media_group_id]

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
Похожие вопросы