@bifronte
учусь

Как переслать сообщение полностью?

Доброго времени, нужно переслать сообщение из одного чата в другой. Сообщение содержит видео фото и текст. Использую функцию forward_message. И проблема в том, что когда сообщение содержит более двух медиа, пересланное сообщение приходит уже только с одним.
await bot.forward_message(chat_id=chat_id['channel'], from_chat_id=chat_id['posts'], message_id=message_id)

Вот что должно было прийти в другой канал:
650c7fd40454a509717429.jpeg
И вот что пришло в итоге:
650c7ff4c302e481183650.jpeg

Подскажите пожалуйста, что поделать.
  • Вопрос задан
  • 975 просмотров
Решения вопроса 1
febday
@febday
Уже давно Telegram сделал так, что сообщения, в которых есть MediaGroup являются составными, то есть - сообщение состоящее из двух картинок и текста на самом деле является двумя сообщениями состоящими из одной картинки с текстом и просто картинки.
Поэтому придумали небольшой костыль ну или всё таки это годное решение, как мидлварь, который видит пришедшие сообщения и запоминается media_group_id, ну а после собирает их в одно сообщение

https://github.com/WhiteMemory99/aiogram_album_han...

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):
	"""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(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)


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

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

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