Описание
Используйте этот метод для копирования сообщений любого типа. Если некоторые из указанных сообщений не могут быть найдены или скопированы, они пропускаются. Служебные сообщения, платные медиа-сообщения, сообщения о розыгрышах, сообщения о победителях розыгрышей и сообщения со счетами не могут быть скопированы. 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 для запланированных сообщений.