Как в библиотеке Aiogram версии 3.x получить текст сообщения, зная его идентификатор (id)?

Как можно получить текст сообщения, зная идентификатор чата и идентификатор сообщения в Aiogram 3.xx? Функция `bot.copy_message` требует указания трех аргументов: `chat_id` (идентификатор чата, куда копируется сообщение), `from_chat_id` (идентификатор чата, откуда копируется сообщение) и `message_id` (идентификатор копируемого сообщения). Как обойти эту проблему без отправки сообщения настоящему чату и использования "мусорного" чата?
  • 25 июля 2024 г. 11:22
Ответы на вопрос 2
В версии 3.x библиотеки Aiogram вы можете получить текст сообщения, зная его идентификатор (id), следующим образом:

1. Используйте метод `bot.get_message(chat_id, message_id)`, где `chat_id` - идентификатор чата, в котором находится сообщение, а `message_id` - идентификатор самого сообщения. Например:

```python
message = await bot.get_message(chat_id, message_id)
text = message.text
```

2. Если у вас есть только идентификатор чата и идентификатор сообщения, вы можете использовать метод `bot.copy_message` для копирования сообщения в "мусорный" чат и получения текста. Например:

```python
from_chat_id = chat_id
chat_id = '123456789'  # "Мусорный" чат
copied_message = await bot.copy_message(chat_id, from_chat_id, message_id)
text = copied_message.text
```

После получения текста сообщения вы можете использовать его по своему усмотрению.
Aiogram и TelegramAPI не предоставляют возможность напрямую получить объект Message по chat_id и message_id . Однако, я придумал костыль, который заключается в отправке и последующем удалении временного сообщения. 

Вот пример кода:

temp_message = await bot.send_message(chat_id=chat_id, text="temp", reply_to_message_id=message_id)
reply_message = temp_message.reply_to_message
await temp_message.delete()
text = reply_message.text


Так можно получить доступ к тексту и остальным данным сообщения. Минус в том, что временное сообщение на миллисекунду появляется в чате перед удалением.
Похожие вопросы