Нужно, чтобы бот принимал несколько фотографий от пользователей и пересылал их в отдельный чат в телеграмме (aiogram)

Самостоятельно смог реализовать прием только 1 фотографии через метод bot.send_photo, а нужно, чтобы бот мог принимать сразу несколько фотографий и пересылать их в отдельный чат


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

Автор решения: Артем Торшин

Вам нужно создать машину состояний, после первой отправки бот будет ждать следующую и так далее.Кол-во фотографий будет зависеть от того сколько Вы сами зададите.

from aiogram.contrib.fsm_storage.memory import MemopyStorage
from aiogram.dispatcher import FSMContext
        
        
storage = MemopyStorage()
# нужно передать в диспетчер Dispatcher(bot, storage =storage)
class GetImage(StatesGroup):
    image_1=State()
    image_2=State()
        
@dp.message_handler(commands=['add_image'],state=None)
async def get_photo(message : types.Message):
    await GetImage.image_1.set()
    await message.reply('Загрузи фото')
    
#обработчик выхода из машины состояний
@dp.message_handler(state='*', commands='отмена')
async def cancel_handler(message: types.Message, state: FSMContext):
    current_state = await state.get_state()
    if current_state is None:
        return
    await state.finish()
    await message.answer('Добавление фото отменено!')
        
        
@dp.message_handler(state=GetImage.image_1)
async def process_photo(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['image_1'] = message.photo[0].file_id
    await GetImage.next()
    await message.reply('Загрузи следующее фото!')
        
@dp.message_handler(state=GetImage.image_2)
async def process_photo(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data['image_2'] = message.photo[0].file_id
    await state.finish()
    await message.reply('Все фото загружены')
→ Ссылка
Автор решения: Alex

Могу предложить вам вариант использования Media.Group() недавно сам воспользовался, нужно было на входе получать альбом из фото и пересылать их в другой чат, чтобы это реализовать можете воспользоваться моим ответом из данного вопроса Вот его код:

import asyncio
from typing import List, Union

from aiogram import Bot, Dispatcher, executor, types
from aiogram.dispatcher.handler import CancelHandler
from aiogram.dispatcher.middlewares import BaseMiddleware

bot = Bot(token="TOKEN_HERE")  # Place your token here
dp = Dispatcher(bot)


class AlbumMiddleware(BaseMiddleware):
    """This middleware is for capturing media groups."""

    album_data: dict = {}

    def __init__(self, latency: Union[int, float] = 0.01):
        """
        You can provide custom latency to make sure
        albums are handled properly in highload.
        """
        self.latency = latency
        super().__init__()

    async def on_process_message(self, message: types.Message, data: dict):
        if not message.media_group_id:
            return

        try:
            self.album_data[message.media_group_id].append(message)
            raise CancelHandler()  # Tell aiogram to cancel handler for this group element
        except KeyError:
            self.album_data[message.media_group_id] = [message]
            await asyncio.sleep(self.latency)

            message.conf["is_last"] = True
            data["album"] = self.album_data[message.media_group_id]

    async def on_post_process_message(self, message: types.Message, result: dict, data: dict):
        """Clean up after handling our album."""
        if message.media_group_id and message.conf.get("is_last"):
            del self.album_data[message.media_group_id]


@dp.message_handler(is_media_group=True, content_types=types.ContentType.ANY)
async def handle_albums(message: types.Message, album: List[types.Message]):
    """This handler will receive a complete album of any type."""
    media_group = types.MediaGroup()
    for obj in album:
        if obj.photo:
            file_id = obj.photo[-1].file_id
        else:
            file_id = obj[obj.content_type].file_id

        try:
            # We can also add a caption to each file by specifying `"caption": "text"`
            media_group.attach({"media": file_id, "type": obj.content_type})
        except ValueError:
            return await message.answer("This type of album is not supported by aiogram.")

    await message.answer_media_group(media_group)


if __name__ == "__main__":
    dp.middleware.setup(AlbumMiddleware())
    executor.start_polling(dp, skip_updates=True)

Можете убрать одно из состояний и просто получать на одном состоянии все фото, которые требуются и отправлять их сразу группой в другой чат. А для пересылки в другой чат сообщений можете использовать обычный метод await bot.send_message просто в качестве chat_id укажите id чата куда нужно что-то отправить, просто на нужном этапе записывайте в переменную и отправляйте.

→ Ссылка