Мне требуется помощь в создании бота-предложки. У меня возникла следующая проблема: <br/> <br/> Я не могу понять, как реализовать отправку фотографий. Мне необходимо, чтобы бот мог отправлять как несколько фотографий одновременно, так и одно изображение. Я смог настроить отправку только одного изображения, но не знаю, как реализовать отправку группы фотографий. <br/> <br/> (Я совсем неопытен в этом деле).
Чтобы отправить фото пользователя администратору с помощью библиотеки 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. <br/> Либо, если пользователь отправляет одно фото, обрабатывать сразу и отправлять администратору. <br/> <br/> <pre><code class="python">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)</code></pre>