Метод copyMessages

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

Описание

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

Параметр Тип Обязательный Описание
chat_id Integer или String Да Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
message_thread_id Integer Необязательный Уникальный идентификатор целевой ветки сообщений (темы) форума; только для супергрупп-форумов
direct_messages_topic_id Integer Необязательный Идентификатор темы личных сообщений, в которую будут отправлены сообщения; требуется, если сообщения отправляются в чат личных сообщений
from_chat_id Integer или String Да Уникальный идентификатор чата, в котором были отправлены исходные сообщения (или имя пользователя канала в формате @channelusername)
message_ids Array of Integer Да JSON-сериализованный список из 1-100 идентификаторов сообщений в чате from_chat_id для копирования. Идентификаторы должны быть указаны в строго возрастающем порядке.
disable_notification Boolean Необязательный Отправляет сообщения бесшумно. Пользователи получат уведомление без звука.
protect_content Boolean Необязательный Защищает содержимое отправленных сообщений от пересылки и сохранения
remove_caption Boolean Необязательный Передайте True, чтобы скопировать сообщения без их подписей

Примеры

php

<?php

// Конфигурация
$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/";

// Параметры для copyMessages
$params = [
    'chat_id' => '@target_channel_username', // ID чата или username канала
    'from_chat_id' => '@source_channel_username', // Откуда копируем
    'message_ids' => [123, 124, 125], // ID сообщений для копирования (в возрастающем порядке)
    'disable_notification' => false, // Опционально: тихая отправка
    'protect_content' => true, // Опционально: защита от пересылки
    'remove_caption' => false, // Опционально: удалить подписи
];

// Для форумов можно добавить:
// $params['message_thread_id'] = 456; // ID топика в форуме

// Для личных сообщений:
// $params['direct_messages_topic_id'] = 789;

// Отправка запроса
function copyMessages(array $params) {
    global $apiUrl;
    
    // Преобразуем массив message_ids в JSON
    $params['message_ids'] = json_encode($params['message_ids']);
    
    // Инициализируем cURL
    $ch = curl_init($apiUrl . 'copyMessages');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        'Content-Type: multipart/form-data'
    ]);
    
    // Выполняем запрос
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    
    if (curl_errno($ch)) {
        throw new Exception('cURL error: ' . curl_error($ch));
    }
    
    curl_close($ch);
    
    // Декодируем ответ
    $result = json_decode($response, true);
    
    if (!$result['ok']) {
        throw new Exception('API error: ' . ($result['description'] ?? 'Unknown error'));
    }
    
    return $result['result']; // Возвращаем массив MessageId
}

// Пример использования
try {
    $messageIds = copyMessages($params);
    
    // Выводим результат
    echo "Скопировано сообщений: " . count($messageIds) . "\n";
    foreach ($messageIds as $messageId) {
        echo "ID скопированного сообщения: {$messageId['message_id']}\n";
    }
    
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage() . "\n";
}

// Альтернативный вариант с использованием file_get_contents
function copyMessagesSimple(array $params) {
    global $apiUrl;
    
    $params['message_ids'] = json_encode($params['message_ids']);
    $query = http_build_query($params);
    
    $response = file_get_contents($apiUrl . 'copyMessages?' . $query);
    $result = json_decode($response, true);
    
    if (!$result['ok']) {
        throw new Exception('API error: ' . ($result['description'] ?? 'Unknown error'));
    }
    
    return $result['result'];
}

?>

python

import asyncio
from telegram import Bot
from telegram.error import TelegramError

async def copy_messages_example():
    # Инициализация бота с вашим токеном
    bot = Bot(token="YOUR_BOT_TOKEN")
    
    try:
        # Копирование сообщений из одного чата в другой
        result = await bot.copy_messages(
            chat_id=-1001234567890,  # ID целевого чата/канала
            from_chat_id=-1009876543210,  # ID чата, откуда копируем
            message_ids=[123, 124, 125],  # ID сообщений для копирования
            message_thread_id=456,  # Опционально: ID темы в форуме
            disable_notification=True,  # Опционально: без звука
            protect_content=False,  # Опционально: защита от пересылки
            remove_caption=False  # Опционально: удалить подписи
        )
        
        # Вывод результатов
        print(f"Скопировано {len(result)} сообщений:")
        for msg_id in result:
            print(f"ID нового сообщения: {msg_id.message_id}")
            
    except TelegramError as e:
        print(f"Ошибка: {e}")

# Запуск асинхронной функции
if __name__ == "__main__":
    asyncio.run(copy_messages_example())

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

  • API 7.0. Добавлен метод copyMessages
  • API 9.2. Обновлен метод copyMessages: Добавлен параметр direct_messages_topic_id
  • API 9.3. Обновлен метод copyMessages: Поддержан параметр message_thread_id в личных чатах с темами для отправки сообщения в конкретную тему.

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

  • Poll - Объект, содержащий информацию об опросе, включая вопрос, варианты ответов, настройки и результаты голосования.
  • forwardMessages - Метод для пересылки нескольких сообщений из одного чата в другой с сохранением группировки альбомов и возможностью защиты содержимого.
  • MessageId - Объект, содержащий уникальный идентификатор сообщения в Telegram, который может быть равен 0 для запланированных сообщений.
Комментарии