Как отправить сообщение с полным содержимым?

Я хотел бы узнать, как исправить проблему с пересылкой сообщений, содержащих несколько медиафайлов, используя функцию forward_message. В настоящий момент, когда сообщение содержит более двух медиафайлов, пересылаемое сообщение приходит только с одним медиафайлом. Вот пример кода, который вызывает проблему:

await bot.forward_message(chat_id=chat_id['channel'], from_chat_id=chat_id['posts'], message_id=message_id)

Я ожидал, что в другом чате будет переслано полное сообщение, включая все медиафайлы, но вместо этого приходит только один медиафайл. Пожалуйста, дайте мне совет, как исправить эту проблему.
Изображение к вопросу
Изображение к вопросу
  • 21 сентября 2023 г. 17:47
Ответы на вопрос 2
К сожалению, в Telegram API есть ограничение на количество медиафайлов, которое можно переслать через функцию forward_message. Если сообщение содержит более одного медиафайла, то при использовании forward_message будет переслан только первый медиафайл.

Чтобы переслать все медиафайлы сообщения, вам нужно воспользоваться другим методом Telegram API - send_media_group. Этот метод позволяет отправить группу медиафайлов вместе с подписями (опционально) и переслать их целиком.

Вот пример кода для отправки группы медиафайлов:

media = []  # список медиафайлов в виде tuple (type, media)
for file_id in message['media']:
    media.append(('photo', file_id))  # здесь можно добавить другие типы медиафайлов, если необходимо

await bot.send_media_group(chat_id=chat_id['channel'], media=media)

Пожалуйста, учтите, что чтобы использовать метод send_media_group, ваш бот должен иметь возможность отправлять медиафайлы в указанный чат (требуются соответствующие разрешения).
Убедитесь, что MediaGroup в Telegram означает, что сообщение, содержащее несколько медиафайлов, на самом деле представляет собой несколько отдельных сообщений, каждое из которых содержит один медиафайл. Для обработки таких сообщений вы можете использовать мидлварь с функциональностью сборки в одно сообщение.

Вот пример реализации мидлвари:

```python
import asyncio
from typing import List, Union

from aiogram import types
from aiogram.dispatcher.handler import CancelHandler
from aiogram.dispatcher.middlewares import BaseMiddleware

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:
            return

        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, result: dict, data: dict):
        if message.media_group_id and message.conf.get("is_last"):
            del self.album_data[message.media_group_id]
```

Для обработки сообщений из MediaGroup, вы можете использовать обработчик сообщений с проверкой типа контента и флагом is_media_group=True. Вот пример обработчика:

```python
@dp.message_handler(content_types=['photo'], is_media_group=True)
async def all_message(message: types.Message, album: List[types.Message]):
    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:
            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.bot.send_media_group(chat_id=chat_id, media=media_group)
```

Да, это отправляет новое сообщение, а не пересылает существующее, но вы можете отправить это сообщение любому пользователю вашего бота.
Похожие вопросы