Метод copyMessage

Метод для копирования сообщений в другой чат без ссылки на оригинал, возвращающий идентификатор отправленного сообщения.

Описание

Используйте этот метод для копирования сообщений любого типа. Сервисные сообщения, платные медиа-сообщения, сообщения о розыгрышах, сообщения о победителях розыгрышей и сообщения со счетами не могут быть скопированы. Poll с викториной может быть скопирован только в том случае, если боту известно значение поля correct_option_id. Метод аналогичен методу forwardMessage, но скопированное сообщение не содержит ссылки на исходное сообщение. При успехе возвращает MessageId отправленного сообщения.

Параметр Тип Обязательный Описание
chat_id Integer или String Да Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
message_thread_id Integer Опционально Уникальный идентификатор целевой ветки сообщений (темы) форума; только для супергрупп-форумов
direct_messages_topic_id Integer Опционально Идентификатор темы личных сообщений, в которую будет отправлено сообщение; требуется, если сообщение отправляется в чат личных сообщений
from_chat_id Integer или String Да Уникальный идентификатор чата, в котором было отправлено исходное сообщение (или имя пользователя канала в формате @channelusername)
message_id Integer Да Идентификатор сообщения в чате, указанном в from_chat_id
video_start_timestamp Integer Опционально Новая начальная временная метка для скопированного видео в сообщении
caption String Опционально Новая подпись для медиа, 0-1024 символа после обработки сущностей. Если не указана, сохраняется исходная подпись
parse_mode String Опционально Режим обработки сущностей в новой подписи. Подробнее см. параметры форматирования.
caption_entities Массив MessageEntity Опционально Список специальных сущностей в формате JSON, которые появляются в новой подписи и могут быть указаны вместо parse_mode
show_caption_above_media Boolean Опционально Передайте True, если подпись должна отображаться над медиа сообщения. Игнорируется, если новая подпись не указана.
disable_notification Boolean Опционально Отправляет сообщение беззвучно. Пользователи получат уведомление без звука.
protect_content Boolean Опционально Защищает содержимое отправленного сообщения от пересылки и сохранения
allow_paid_broadcast Boolean Опционально Передайте True, чтобы разрешить до 1000 сообщений в секунду, игнорируя ограничения на рассылку за плату 0,1 Telegram Stars за сообщение. Соответствующие Stars будут списаны с баланса бота
suggested_post_parameters SuggestedPostParameters Опционально Объект в формате JSON, содержащий параметры предлагаемой публикации для отправки; только для чатов личных сообщений. Если сообщение отправляется в ответ на другую предлагаемую публикацию, то эта публикация автоматически отклоняется.
reply_parameters ReplyParameters Опционально Описание сообщения, на которое нужно ответить
reply_markup InlineKeyboardMarkup или ReplyKeyboardMarkup или ReplyKeyboardRemove или ForceReply Опционально Дополнительные параметры интерфейса. Объект в формате JSON для встроенной клавиатуры, пользовательской клавиатуры ответа, инструкций по удалению клавиатуры ответа или принуждению ответа от пользователя

Примеры

php

<?php

$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/";

// Параметры для копирования сообщения
$params = [
    'chat_id' => 123456789, // ID целевого чата
    'from_chat_id' => -1001234567890, // ID чата с исходным сообщением
    'message_id' => 42, // ID сообщения для копирования
    'caption' => 'Новая подпись для скопированного медиа', // Новая подпись (опционально)
    'parse_mode' => 'HTML', // Режим парсинга HTML (опционально)
    'disable_notification' => false, // Уведомление со звуком
    'protect_content' => true, // Защита от пересылки и сохранения
    'reply_parameters' => json_encode([
        'message_id' => 10, // ID сообщения для ответа
        'allow_sending_without_reply' => true
    ]),
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Кнопка 1', 'callback_data' => 'btn1'],
                ['text' => 'Кнопка 2', 'url' => 'https://example.com']
            ]
        ]
    ])
];

// Отправка запроса
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl . 'copyMessage');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: multipart/form-data']);

$response = curl_exec($ch);
curl_close($ch);

// Обработка ответа
$result = json_decode($response, true);
if ($result['ok']) {
    echo "Сообщение скопировано! ID нового сообщения: " . $result['result']['message_id'];
} else {
    echo "Ошибка: " . $result['description'];
}

// Альтернативный вариант с использованием file_get_contents
/*
$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => 'Content-Type: multipart/form-data',
        'content' => http_build_query($params)
    ]
]);

$response = file_get_contents($apiUrl . 'copyMessage', false, $context);
$result = json_decode($response, true);
*/
?>

python

import requests

def copy_message(bot_token, chat_id, from_chat_id, message_id, **kwargs):
    """
    Копирует сообщение из одного чата в другой.
    
    Args:
        bot_token (str): Токен бота
        chat_id (int/str): ID целевого чата или username канала
        from_chat_id (int/str): ID чата, откуда копируется сообщение
        message_id (int): ID сообщения для копирования
        **kwargs: Дополнительные параметры:
            - message_thread_id (int): ID темы в форуме
            - direct_messages_topic_id (int): ID темы в личных сообщениях
            - video_start_timestamp (int): Новая временная метка начала видео
            - caption (str): Новая подпись к медиа
            - parse_mode (str): Режим парсинга сущностей ('HTML' или 'Markdown')
            - caption_entities (list): Список сущностей для подписи
            - show_caption_above_media (bool): Показывать подпись над медиа
            - disable_notification (bool): Отключить уведомление
            - protect_content (bool): Защитить содержимое
            - allow_paid_broadcast (bool): Разрешить платную рассылку
            - suggested_post_parameters (dict): Параметры предложенного поста
            - reply_parameters (dict): Параметры ответа
            - reply_markup (dict): Разметка клавиатуры
    
    Returns:
        dict: Ответ от Telegram API
    """
    
    url = f"https://api.telegram.org/bot{bot_token}/copyMessage"
    
    payload = {
        'chat_id': chat_id,
        'from_chat_id': from_chat_id,
        'message_id': message_id
    }
    
    # Добавляем опциональные параметры
    optional_params = [
        'message_thread_id', 'direct_messages_topic_id', 'video_start_timestamp',
        'caption', 'parse_mode', 'caption_entities', 'show_caption_above_media',
        'disable_notification', 'protect_content', 'allow_paid_broadcast',
        'suggested_post_parameters', 'reply_parameters', 'reply_markup'
    ]
    
    for param in optional_params:
        if param in kwargs and kwargs[param] is not None:
            payload[param] = kwargs[param]
    
    response = requests.post(url, json=payload)
    return response.json()

# Пример использования
if __name__ == "__main__":
    BOT_TOKEN = "YOUR_BOT_TOKEN"
    
    # Пример 1: Простое копирование сообщения
    result = copy_message(
        bot_token=BOT_TOKEN,
        chat_id=123456789,  # ID целевого чата
        from_chat_id=-1001234567890,  # ID канала/чата откуда копируем
        message_id=123  # ID сообщения для копирования
    )
    print(f"Результат простого копирования: {result}")
    
    # Пример 2: Копирование с изменением подписи
    result = copy_message(
        bot_token=BOT_TOKEN,
        chat_id="@my_channel",  # Username канала
        from_chat_id=-1001234567890,
        message_id=123,
        caption="Новая подпись к сообщению",
        parse_mode="HTML",
        disable_notification=True,
        protect_content=True
    )
    print(f"Результат копирования с подписью: {result}")
    
    # Пример 3: Копирование с клавиатурой
    from telegram import InlineKeyboardButton, InlineKeyboardMarkup
    
    keyboard = InlineKeyboardMarkup([
        [InlineKeyboardButton("Кнопка 1", callback_data="btn1")],
        [InlineKeyboardButton("Кнопка 2", callback_data="btn2")]
    ])
    
    result = copy_message(
        bot_token=BOT_TOKEN,
        chat_id=123456789,
        from_chat_id=-1001234567890,
        message_id=123,
        reply_markup=keyboard.to_dict(),
        caption="Сообщение с клавиатурой",
        show_caption_above_media=True
    )
    print(f"Результат копирования с клавиатурой: {result}")
    
    # Пример 4: Копирование в тему форума
    result = copy_message(
        bot_token=BOT_TOKEN,
        chat_id=-1001234567890,  # ID форум-супергруппы
        from_chat_id=-1009876543210,
        message_id=456,
        message_thread_id=789,  # ID темы в форуме
        caption="Сообщение в теме форума"
    )
    print(f"Результат копирования в тему: {result}")

История изменений

  • API 5.0. Добавлен метод copyMessage
  • API 5.6. Обновлен метод copyMessage: Добавлено поле protect_content
  • API 6.3. Обновлен метод copyMessage: Добавлен параметр message_thread_id
  • API 7.0. Обновлен метод copyMessage: Заменены параметры reply_to_message_id и allow_sending_without_reply на reply_parameters
  • API 7.4. Обновлен метод copyMessage: Добавлен параметр show_caption_above_media
  • API 7.11. Обновлен метод copyMessage: Добавлен параметр allow_paid_broadcast
  • API 8.3. Обновлен метод copyMessage: Добавлен параметр video_start_timestamp для изменения временной метки начала копируемых видео
  • API 9.2. Обновлен метод copyMessage: Добавлен параметр direct_messages_topic_id
  • API 9.3. Обновлен метод copyMessage: Поддержан параметр message_thread_id в личных чатах с темами для отправки сообщения в конкретную тему. Добавлен параметр message_effect_id.

Дополнительно

  • Poll - Объект, содержащий информацию об опросе, включая вопрос, варианты ответов, настройки и результаты голосования.
  • forwardMessage - Метод для пересылки сообщений между чатами с возможностью настройки параметров доставки и защиты содержимого.
  • MessageId - Объект, содержащий уникальный идентификатор сообщения в Telegram, который может быть равен 0 для запланированных сообщений.
  • MessageEntity - Объект MessageEntity представляет специальную форматированную сущность в тексте сообщения, такую как упоминания, хэштеги, ссылки или стилизованный текст.
  • SuggestedPostParameters - Объект содержит параметры публикации, предлагаемой ботом, включая цену и дату отправки.
  • ReplyParameters - Объект, описывающий параметры для ответа на сообщение, включая идентификатор сообщения, чат, цитирование и дополнительные настройки.
  • InlineKeyboardMarkup - Объект для создания встроенной клавиатуры, которая отображается непосредственно в сообщении.
  • ReplyKeyboardMarkup - Объект, представляющий пользовательскую клавиатуру с вариантами ответа для ботов Telegram.
  • ReplyKeyboardRemove - Объект для удаления пользовательской клавиатуры и возврата к стандартной буквенной клавиатуре в клиентах Telegram.
  • ForceReply - Объект ForceReply принудительно отображает интерфейс ответа в клиентах Telegram, упрощая создание пошаговых диалогов с ботом.
Комментарии