@Wolfengo
Я ещё зелёный, сильно не душите

Как избежать повторения функции при получении коложа фотографий?

Если я отправляю боту сообщения с фото:
6352aae25ef09728011060.png

то бот начинает повторять функцию 3 раза.

async def call_admin(message: types.Message, state: FSMContext):
    if not message.text:
        async with state.proxy() as data:
            try:
                full_message = data['photo']
                all_message = []
                for mess in full_message:
                    all_message.append(mess)
                all_message.append(message.photo[0].file_id)
                data['photo'] = all_message
            except KeyError:
                all_message = [message.photo[0].file_id]
                data['photo'] = all_message
        print(all_message)
        for i in all_message:
            print(i)
            # await bot.edit_message_text(chat_id=message.from_user.id,
            #                             message_id=message.message_id - 1,
            #                             text='Пожалуйста, опишите проблему и мы разрешим её как можно скорее!\n')
    else:
        """Условия при обычном тексте"""


я написал цикл, который запаковывает айди фотографий. Но я не могу додуматься, как мне их правильно передать и реализовать, если функция повторяется по 2 и более раз (смотря сколько фото)

Объясните, как мне вообще правильно реализовать "переход на следующий этап", если функция повторяется несколько раз? Потому что если я буду её пропускать, то, к примеру, админу придёт 2 и более сообщений с 1 фото, потом с 2 и т.д.

Или что я могу вообще поменять, чтобы это работало как нужно?
  • Вопрос задан
  • 422 просмотра
Решения вопроса 1
@Wolfengo Автор вопроса
Я ещё зелёный, сильно не душите
Я нашёл решение этого вопроса. Я сделал так, чтобы через content_types=["text", "photo"]
бот пересылал медиагруппу вместе с подписью (если не нужно, можно убрать), если 1 фото, то 1 фото с подписью и если текст, то перешлёт текст.

Долее код подбивайте под ваши нужды

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="")
dp = Dispatcher(bot)


class AlbumMiddleware(BaseMiddleware):

    album_data: dict = {}

    def __init__(self, latency: Union[int, float] = 0.01):
        self.latency = latency
        super().__init__()

    async def on_process_message(self, message: types.Message, data: dict):
        if not message.media_group_id:
            self.album_data[message.from_user.id] = [message]

            message.conf["is_last"] = True
            data["album"] = self.album_data[message.from_user.id]
            await asyncio.sleep(self.latency)
        else:
            try:
                self.album_data[message.media_group_id].append(message)
                raise CancelHandler()
            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):
        if not message.media_group_id:
            if message.from_user.id and message.conf.get("is_last"):
                del self.album_data[message.from_user.id]
        else:
            if message.media_group_id and message.conf.get("is_last"):
                del self.album_data[message.media_group_id]


@dp.message_handler(content_types=['text', 'photo'])
async def handle_albums(message: types.Message, album: List[types.Message]):
    if not message.media_group_id:
        if message.photo:
            await bot.send_photo(chat_id=message.chat.id, photo=message.photo[-1].file_id, caption=message.caption)
        else:
            await bot.send_message(message.chat.id, message.text)
    else:
        media_group = types.MediaGroup()
        for obj in album:
            if obj.photo:
                file_id = obj.photo[-1].file_id
                caption = album[0].caption
            else:
                file_id = obj[obj.content_type].file_id

            try:
                media_group.attach({"media": file_id, "type": obj.content_type})
                media_group.media[0]["caption"] = caption
            except ValueError:
                return await message.answer("Этот тип не поддерживается aiogram.")

        await message.answer_media_group(media_group)


if __name__ == "__main__":
    dp.middleware.setup(AlbumMiddleware())
    executor.start_polling(dp, skip_updates=True)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AlbertForest
1 фото - это 1 сообщение. Бот получил 3 сообщения - выполнил функцию 3 раза
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы