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