Как сделать пересылку сообщений в Телеграм-боте

Бот перестал пересылать сообщения из канала или чата — в большинстве таких случаев причина кроется не в коде, а в настройке приватности бота или в отсутствии нужных прав в группе. Прежде чем переписывать логику, проверьте, что бот добавлен в чат с правами на чтение сообщений, а режим Group Privacy в @BotFather отключён, если бот должен видеть все сообщения, а не только команды.

Пересылка сообщений — одна из базовых функций Telegram Bot API. Она нужна для ботов-модераторов, систем сбора заявок, дублирования постов из канала в чат и десятков других сценариев. В Telegram Bot API для этого существуют два отдельных метода: forwardMessage и copyMessage, и выбор между ними напрямую влияет на то, как пересланное сообщение будет выглядеть у получателя.

В этой статье разберём оба метода, покажем рабочий код на Python с библиотекой aiogram, объясним типичные ошибки и ограничения, о которых редко пишут в туториалах.

Чем forwardMessage отличается от copyMessage

Метод forwardMessage — это классическая пересылка, аналог кнопки «Переслать» в клиенте Telegram. Получатель видит пометку «Переслано от…» и может перейти к источнику, если тот публичный. Метод требует три параметра: chat_id получателя, from_chat_id чата-источника и message_id конкретного сообщения.

Метод copyMessage работает иначе: он создаёт копию сообщения без ссылки на оригинал. Для получателя такое сообщение выглядит как обычное сообщение от бота. Это удобно, когда не нужно раскрывать источник или когда источник — приватный чат, к которому у получателя нет доступа.

Есть и практическое различие в ограничениях. Копирование работает даже там, где пересылка невозможна из-за настроек приватности чата-источника, но и у копирования есть исключения — например, защищённый контент, о котором речь пойдёт ниже.

Подготовка: создание бота и получение нужных ID

Для работы понадобится токен бота, который выдаёт @BotFather после команды /newbot. Токен выглядит как строка вида 123456789:AAEhBOweik6ad... — храните его в переменных окружения, а не в коде.

Далее нужно узнать идентификаторы чатов. Самый простой способ — временно добавить в бота обработчик, который выводит chat_id любого входящего сообщения, либо воспользоваться ответом метода getUpdates в браузере:

https://api.telegram.org/bot<ТОКЕН>/getUpdates

В ответе найдите поле "chat":{"id": ...}. У личных чатов ID положительный, у групп и каналов — отрицательный, причём у супергрупп и каналов он обычно начинается с -100.

☑️ Подготовка к настройке пересылки

Выполнено: 0 / 5

Пересылка через forwardMessage: код и нюансы

Пример на Python с библиотекой aiogram 3.x. Бот пересылает каждое входящее сообщение в заданный чат:

from aiogram import Bot, Dispatcher, F

from aiogram.types import Message

bot = Bot(token="ВАШ_ТОКЕН")

dp = Dispatcher()

TARGET_CHAT_ID = -1001234567890

@dp.message()

async def forward_handler(message: Message):

await bot.forward_message(

chat_id=TARGET_CHAT_ID,

from_chat_id=message.chat.id,

message_id=message.message_id

)

Обратите внимание: бот должен состоять и в чате-источнике, и в чате-получателе. В каналах боту нужны права администратора, в группах — как минимум возможность читать сообщения. Если бот не видит исходное сообщение, вызов forwardMessage вернёт ошибку Bad Request: message to forward not found.

⚠️ Внимание: если в настройках приватности бота включён режим Group Privacy (это значение по умолчанию), в группах бот получает только команды и ответы на свои сообщения. Отключить режим можно через @BotFather: /mybots → выбор бота → Bot SettingsGroup PrivacyTurn off. После изменения бота нужно удалить из группы и добавить заново.

Копирование через copyMessage: когда оно лучше

Копирование подходит для анонимных пересылок, агрегаторов контента и случаев, когда получатель не должен видеть источник. Код почти идентичен:

@dp.message()

async def copy_handler(message: Message):

await bot.copy_message(

chat_id=TARGET_CHAT_ID,

from_chat_id=message.chat.id,

message_id=message.message_id

)

У copyMessage есть дополнительные возможности: можно заменить подпись к медиа через параметр caption, изменить клавиатуру или убрать её. Это делает метод гибче для сценариев, где контент нужно слегка адаптировать перед отправкой.

📊 Какой метод пересылки вы используете в своих ботах?
forwardMessage — нужна ссылка на источник
copyMessage — важна анонимность
Оба, в зависимости от задачи
Пока только изучаю Bot API

Сравнение методов пересылки

КритерийforwardMessagecopyMessage
Ссылка на источникОтображается («Переслано от…»)Отсутствует
Изменение подписи к медиаНевозможноВозможно через caption
Работа с защищённым контентомЗапрещенаЗапрещена
Замена inline-клавиатурыНетДа
Типичное применениеМодерация, репосты с атрибуциейАнонимные сборы, агрегаторы

Отдельно стоит упомянуть защищённый контент: если в чате-источнике включён запрет на пересылку (настройка «Ограничение сохранения контента»), ни один из методов не сработает — API вернёт ошибку вида can't be forwarded. Обойти это ограничение штатными средствами Bot API нельзя, и это осознанное решение платформы.

Типичные ошибки и их решение

Разберём сбои, с которыми чаще всего сталкиваются при настройке пересылки:

  • 🔹 chat not found — неверный chat_id получателя, либо бот не добавлен в этот чат. Проверьте знак минуса и префикс -100 у каналов.
  • 🔹 message to forward not found — бот не имеет доступа к чату-источнику или сообщение уже удалено.
  • 🔹 not enough rights — в канале боту не хватает прав администратора на публикацию.
  • 🔹 бот «молчит» в группе — включён Group Privacy, бот просто не получает обычные сообщения.
  • 🔹 пересылаются не все типы контента — некоторые служебные сообщения (например, о вступлении участников) имеют особую обработку и требуют отдельных фильтров в коде.
⚠️ Внимание: Telegram применяет лимиты на частоту запросов к Bot API. Если бот пересылает сообщения массово (например, рассылает пост в сотни чатов), добавляйте паузы между отправками и обрабатывайте ошибку 429 Too Many Requests — в её ответе указано время ожидания retry_after.

Автоматическая пересылка из канала в чат

Частая задача — дублировать посты канала в группу обсуждения. В Telegram есть штатная функция привязки группы к каналу с автоматическим репостом, но бот даёт больше контроля: фильтрацию по ключевым словам, форматирование, задержки.

Для каналов в aiogram используется отдельный тип обновления — channel_post. Пример обработчика:

@dp.channel_post()

async def repost(message: Message):

await bot.copy_message(

chat_id=GROUP_CHAT_ID,

from_chat_id=message.chat.id,

message_id=message.message_id

)

Бот должен быть администратором канала, иначе обновления channel_post до него не дойдут. Проверить это можно, отправив тестовый пост и посмотрев логи бота — если событие не приходит, проблема именно в правах.

Как пересылать сообщения с фильтрацией по тексту

Добавьте условие внутри обработчика: if message.text and "ключевое слово" in message.text.lower() — тогда бот будет пересылать только подходящие сообщения. Для медиа без текста проверяйте message.caption.

Безопасность и ограничения

Пересылая пользовательский контент, учитывайте несколько моментов. Во-первых, не пересылайте личные данные пользователей в публичные чаты без их согласия — это может нарушать как правила платформы, так и законодательство о персональных данных. Во-вторых, токен бота даёт полный контроль над ним: при утечке злоумышленник сможет читать и пересылать всё, что видит бот. Отозвать скомпрометированный токен можно через @BotFather командой /revoke.

Также помните, что Bot API не даёт доступа к истории чата до момента добавления бота — пересылать можно только те сообщения, которые бот «увидел» после подключения, либо те, чьи message_id вам известны и доступны.

Частые вопросы

Может ли бот пересылать сообщения из чужого канала, где он не администратор?

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

Почему пересланное сообщение не показывает автора?

Если автор скрыл связь своего аккаунта с пересылаемыми сообщениями в настройках приватности Telegram, вместо имени отобразится только текст без кликабельной ссылки. Это нормальное поведение, а не ошибка бота.

Как переслать сообщение без пометки «Переслано от»?

Используйте метод copyMessage вместо forwardMessage — он создаёт независимую копию, которая выглядит как обычное сообщение от бота.

Можно ли пересылать сообщения из личной переписки пользователя с ботом?

Да. Всё, что пользователь пишет боту в личке, бот может переслать дальше — параметр from_chat_id в этом случае равен ID пользователя. Учитывайте при этом требования к защите персональных данных.

Что делать с ошибкой 429 при массовой рассылке?

Снизьте частоту запросов: добавьте задержку между отправками и реализуйте повторную попытку через время, указанное в поле retry_after ответа API. Игнорирование лимитов может привести к временной блокировке бота.