Метод sendPhoto

Метод для отправки фотографий в чат с поддержкой подписей, форматирования и различных параметров настройки.

Описание

Используйте этот метод для отправки фотографий. При успешном выполнении возвращается отправленное Message.

Параметр Тип Обязательный Описание
business_connection_id String Опционально Уникальный идентификатор бизнес-подключения, от имени которого будет отправлено сообщение
chat_id Integer или String Да Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
message_thread_id Integer Опционально Уникальный идентификатор целевой ветки сообщений (темы) форума; только для супергрупп-форумов
direct_messages_topic_id Integer Опционально Идентификатор темы личных сообщений, в которую будет отправлено сообщение; требуется, если сообщение отправляется в чат личных сообщений
photo InputFile или String Да Фотография для отправки. Передайте file_id в виде строки, чтобы отправить фотографию, существующую на серверах Telegram (рекомендуется), передайте HTTP-URL в виде строки, чтобы Telegram загрузил фотографию из интернета, или загрузите новую фотографию, используя multipart/form-data. Размер фотографии не должен превышать 10 МБ. Сумма ширины и высоты фотографии не должна превышать 10000. Соотношение сторон не должно превышать 20. Подробнее об отправке файлов »
caption String Опционально Подпись к фотографии (также может использоваться при повторной отправке фотографий по file_id), 0-1024 символа после обработки сущностей
parse_mode String Опционально Режим обработки сущностей в подписи к фотографии. Подробнее см. параметры форматирования.
caption_entities Массив MessageEntity Опционально Список специальных сущностей в подписи в формате JSON, который можно указать вместо parse_mode
show_caption_above_media Boolean Опционально Передайте True, если подпись должна отображаться над медиафайлом сообщения
has_spoiler Boolean Опционально Передайте True, если фотографию нужно скрыть анимацией спойлера
disable_notification Boolean Опционально Отправляет сообщение беззвучно. Пользователи получат уведомление без звука.
protect_content Boolean Опционально Защищает содержимое отправленного сообщения от пересылки и сохранения
allow_paid_broadcast Boolean Опционально Передайте True, чтобы разрешить до 1000 сообщений в секунду, игнорируя ограничения рассылки за плату 0,1 Telegram Stars за сообщение. Соответствующие Stars будут списаны с баланса бота
message_effect_id String Опционально Уникальный идентификатор эффекта сообщения, который будет добавлен к сообщению; только для личных чатов
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}/sendPhoto";

// 1. Пример отправки фото по file_id (рекомендуемый способ)
$data1 = [
    'chat_id' => 123456789, // ID чата
    'photo' => 'AgACAgIAAxkBAAIB...', // file_id фото с серверов Telegram
    'caption' => 'Фото с подписью *жирным* текстом',
    'parse_mode' => 'MarkdownV2',
    'disable_notification' => true,
    'protect_content' => false,
    'has_spoiler' => true, // Скрыто спойлером
];

// 2. Пример отправки фото по URL
$data2 = [
    'chat_id' => '@channelusername', // Имя канала
    'photo' => 'https://example.com/image.jpg', // URL фото
    'caption' => 'Фото из интернета',
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Кнопка 1', 'callback_data' => 'btn1'],
                ['text' => 'Кнопка 2', 'url' => 'https://example.com']
            ]
        ]
    ])
];

// 3. Пример с загрузкой нового фото (multipart/form-data)
$data3 = [
    'chat_id' => 123456789,
    'caption' => 'Новое загруженное фото',
    'photo' => new CURLFile('/path/to/local/photo.jpg'), // Локальный файл
    'reply_parameters' => json_encode([
        'message_id' => 42, // ID сообщения для ответа
        'chat_id' => 123456789
    ]),
    'allow_paid_broadcast' => true // Платная рассылка
];

// 4. Пример для бизнес-аккаунта с топиком форума
$data4 = [
    'business_connection_id' => 'business_conn_123',
    'chat_id' => -1001234567890, // ID супергруппы
    'message_thread_id' => 123, // ID топика форума
    'photo' => 'AgACAgIAAxkBAAIB...',
    'caption' => 'Сообщение в топике форума',
    'show_caption_above_media' => true, // Подпись над медиа
    'parse_mode' => 'HTML',
    'caption_entities' => json_encode([
        [
            'type' => 'bold',
            'offset' => 0,
            'length' => 6
        ]
    ])
];

// Функция отправки запроса
function sendPhoto($data, $useMultipart = false) {
    global $apiUrl;
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    if ($useMultipart) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    } else {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Content-Type: application/x-www-form-urlencoded'
        ]);
    }
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return json_decode($response, true);
}

// Примеры вызовов:
// 1. Отправка по file_id
// $result = sendPhoto($data1);

// 2. Отправка по URL
// $result = sendPhoto($data2);

// 3. Загрузка нового файла (multipart)
// $result = sendPhoto($data3, true);

// 4. Для бизнес-аккаунта
// $result = sendPhoto($data4);

// Обработка результата
// if ($result['ok']) {
//     echo "Сообщение отправлено! ID: " . $result['result']['message_id'];
// } else {
//     echo "Ошибка: " . $result['description'];
// }

?>

python

import requests
from typing import Optional, Union

def send_photo(
    token: str,
    chat_id: Union[int, str],
    photo: Union[str, bytes],
    business_connection_id: Optional[str] = None,
    message_thread_id: Optional[int] = None,
    direct_messages_topic_id: Optional[int] = None,
    caption: Optional[str] = None,
    parse_mode: Optional[str] = None,
    caption_entities: Optional[list] = None,
    show_caption_above_media: Optional[bool] = None,
    has_spoiler: Optional[bool] = None,
    disable_notification: Optional[bool] = None,
    protect_content: Optional[bool] = None,
    allow_paid_broadcast: Optional[bool] = None,
    message_effect_id: Optional[str] = None,
    suggested_post_parameters: Optional[dict] = None,
    reply_parameters: Optional[dict] = None,
    reply_markup: Optional[dict] = None
) -> dict:
    """
    Send photos using Telegram Bot API
    
    :param token: Bot token
    :param chat_id: Unique identifier for target chat or username
    :param photo: Photo to send (file_id, URL, or file bytes)
    :return: API response as dictionary
    """
    
    url = f"https://api.telegram.org/bot{token}/sendPhoto"
    
    # Prepare parameters
    params = {
        'chat_id': chat_id,
    }
    
    # Add optional parameters if provided
    optional_params = {
        'business_connection_id': business_connection_id,
        'message_thread_id': message_thread_id,
        'direct_messages_topic_id': direct_messages_topic_id,
        'caption': caption,
        'parse_mode': parse_mode,
        'caption_entities': caption_entities,
        'show_caption_above_media': show_caption_above_media,
        'has_spoiler': has_spoiler,
        'disable_notification': disable_notification,
        'protect_content': protect_content,
        'allow_paid_broadcast': allow_paid_broadcast,
        'message_effect_id': message_effect_id,
        'suggested_post_parameters': suggested_post_parameters,
        'reply_parameters': reply_parameters,
        'reply_markup': reply_markup
    }
    
    for key, value in optional_params.items():
        if value is not None:
            params[key] = value
    
    # Handle photo input
    files = None
    if isinstance(photo, bytes):
        # Upload file as multipart/form-data
        files = {'photo': ('photo.jpg', photo)}
        # Remove photo from params when sending as file
        params.pop('photo', None)
    elif isinstance(photo, str) and photo.startswith(('http://', 'https://')):
        # HTTP URL
        params['photo'] = photo
    else:
        # file_id
        params['photo'] = photo
    
    # Make request
    if files:
        response = requests.post(url, params=params, files=files)
    else:
        response = requests.post(url, params=params)
    
    return response.json()

# Example usage:
if __name__ == "__main__":
    BOT_TOKEN = "YOUR_BOT_TOKEN"
    
    # Example 1: Send photo by file_id
    result1 = send_photo(
        token=BOT_TOKEN,
        chat_id=123456789,
        photo="AgACAgQAAxkDAAIB",  # file_id from Telegram
        caption="This is a photo caption",
        parse_mode="HTML",
        has_spoiler=True
    )
    print(result1)
    
    # Example 2: Send photo by URL
    result2 = send_photo(
        token=BOT_TOKEN,
        chat_id="@channelusername",
        photo="https://example.com/image.jpg",
        caption="Photo from URL",
        disable_notification=True,
        reply_markup={
            "inline_keyboard": [[
                {"text": "Button", "url": "https://example.com"}
            ]]
        }
    )
    print(result2)
    
    # Example 3: Upload photo file
    with open("photo.jpg", "rb") as f:
        photo_bytes = f.read()
    
    result3 = send_photo(
        token=BOT_TOKEN,
        chat_id=123456789,
        photo=photo_bytes,
        caption="Uploaded photo",
        protect_content=True
    )
    print(result3)

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

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

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

  • Message - Это основной объект, представляющий сообщение в Telegram, который содержит информацию об отправителе, чате, контенте (текст, медиа, служебные данные) и различные метаданные.
  • InputFile - Объект, представляющий содержимое файла для загрузки через multipart/form-data.
  • MessageEntity - Объект MessageEntity представляет специальную форматированную сущность в тексте сообщения, такую как упоминания, хэштеги, ссылки или стилизованный текст.
  • SuggestedPostParameters - Объект содержит параметры публикации, предлагаемой ботом, включая цену и дату отправки.
  • ReplyParameters - Объект, описывающий параметры для ответа на сообщение, включая идентификатор сообщения, чат, цитирование и дополнительные настройки.
  • InlineKeyboardMarkup - Объект для создания встроенной клавиатуры, которая отображается непосредственно в сообщении.
  • ReplyKeyboardMarkup - Объект, представляющий пользовательскую клавиатуру с вариантами ответа для ботов Telegram.
  • ReplyKeyboardRemove - Объект для удаления пользовательской клавиатуры и возврата к стандартной буквенной клавиатуре в клиентах Telegram.
  • ForceReply - Объект ForceReply принудительно отображает интерфейс ответа в клиентах Telegram, упрощая создание пошаговых диалогов с ботом.
Комментарии