Метод sendSticker

Метод для отправки статических, анимированных или видео-стикеров в чат Telegram.

Описание

Используйте этот метод для отправки статических .WEBP, анимированных .TGS или видео .WEBM стикеров. При успешном выполнении возвращается отправленное Message.

Параметр Тип Обязательный Описание
business_connection_id String Опционально Уникальный идентификатор бизнес-подключения, от имени которого будет отправлено сообщение
chat_id Integer или String Да Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername)
message_thread_id Integer Опционально Уникальный идентификатор целевой ветки сообщений (темы) форума; только для супергрупп-форумов
direct_messages_topic_id Integer Опционально Идентификатор темы прямых сообщений, в которую будет отправлено сообщение; требуется, если сообщение отправляется в чат прямых сообщений
sticker InputFile или String Да Стикер для отправки. Передайте file_id в виде String для отправки файла, существующего на серверах Telegram (рекомендуется), передайте HTTP-URL в виде String, чтобы Telegram получил .WEBP стикер из интернета, или загрузите новый .WEBP, .TGS или .WEBM стикер, используя multipart/form-data. Подробнее об отправке файлов ». Видео и анимированные стикеры не могут быть отправлены через HTTP-URL.
emoji String Опционально Эмодзи, связанное со стикером; только для только что загруженных стикеров
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';

// ID чата или username канала
$chatId = '123456789'; // или '@channelusername'

// Стикер для отправки (file_id, URL или путь к файлу)
$sticker = 'CAACAgIAAxkBAAIB...'; // Пример file_id
// $sticker = 'https://example.com/sticker.webp'; // URL для .WEBP
// $sticker = '/path/to/sticker.webp'; // Локальный файл

// Формируем URL API
$apiUrl = "https://api.telegram.org/bot{$botToken}/sendSticker";

// Подготавливаем данные
$postData = [
    'chat_id' => $chatId,
    'sticker' => $sticker,
    // Опциональные параметры (раскомментировать при необходимости):
    // 'message_thread_id' => 123, // Для тем форума
    // 'emoji' => '😀', // Эмодзи для загруженного стикера
    // 'disable_notification' => true, // Без звука
    // 'protect_content' => true, // Защита от пересылки
    // 'allow_paid_broadcast' => true, // Платный широковещательный режим
    // 'message_effect_id' => 'effect_id', // Эффект сообщения
    // 'reply_parameters' => json_encode(['message_id' => 456]), // Ответ на сообщение
    // 'reply_markup' => json_encode(['inline_keyboard' => [[['text' => 'Кнопка', 'url' => 'https://example.com']]]]), // Клавиатура
];

// Определяем, отправляем ли мы файл
$isLocalFile = !filter_var($sticker, FILTER_VALIDATE_URL) && !preg_match('/^[\w\-]+$/i', $sticker);

if ($isLocalFile && file_exists($sticker)) {
    // Отправка локального файла через multipart/form-data
    $postData['sticker'] = new CURLFile(realpath($sticker));
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: multipart/form-data']);
} else {
    // Отправка file_id или URL через обычный POST
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
}

// Выполняем запрос
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

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

?>

python

import requests
from typing import Optional, Union

def send_sticker(
    bot_token: str,
    chat_id: Union[int, str],
    sticker: Union[str, bytes],
    business_connection_id: Optional[str] = None,
    message_thread_id: Optional[int] = None,
    direct_messages_topic_id: Optional[int] = None,
    emoji: Optional[str] = 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 static .WEBP, animated .TGS, or video .WEBM stickers.
    
    Args:
        bot_token: Your bot's token
        chat_id: Unique identifier for target chat or @channelusername
        sticker: file_id as string, HTTP URL, or file bytes for upload
        business_connection_id: Business connection ID
        message_thread_id: Forum topic ID
        direct_messages_topic_id: Direct messages topic ID
        emoji: Emoji for uploaded stickers
        disable_notification: Send silently
        protect_content: Protect from forwarding
        allow_paid_broadcast: Allow paid broadcasting
        message_effect_id: Message effect for private chats
        suggested_post_parameters: Suggested post params for DM
        reply_parameters: Reply parameters
        reply_markup: Keyboard markup
    
    Returns:
        Dictionary with sent Message object
    """
    
    url = f"https://api.telegram.org/bot{bot_token}/sendSticker"
    
    # Prepare data
    data = {
        '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,
        'emoji': emoji,
        '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:
            data[key] = value
    
    # Handle sticker input
    files = None
    if isinstance(sticker, bytes):
        # Upload new sticker file
        files = {'sticker': ('sticker.webp', sticker, 'image/webp')}
    elif sticker.startswith(('http://', 'https://')):
        # HTTP URL
        data['sticker'] = sticker
    else:
        # file_id
        data['sticker'] = sticker
    
    # Send request
    if files:
        response = requests.post(url, data=data, files=files)
    else:
        response = requests.post(url, json=data)
    
    return response.json()

# Example 1: Send sticker using file_id
def example_send_by_file_id():
    bot_token = "YOUR_BOT_TOKEN"
    chat_id = 123456789
    file_id = "CAACAgIAAxkBAAIB..."  # Existing sticker file_id
    
    result = send_sticker(
        bot_token=bot_token,
        chat_id=chat_id,
        sticker=file_id,
        disable_notification=True,
        protect_content=True
    )
    print(result)

# Example 2: Send sticker from URL
def example_send_by_url():
    bot_token = "YOUR_BOT_TOKEN"
    chat_id = "@my_channel"
    sticker_url = "https://example.com/sticker.webp"
    
    result = send_sticker(
        bot_token=bot_token,
        chat_id=chat_id,
        sticker=sticker_url,
        reply_markup={
            'inline_keyboard': [[
                {'text': 'Like', 'callback_data': 'like_sticker'},
                {'text': 'Share', 'callback_data': 'share_sticker'}
            ]]
        }
    )
    print(result)

# Example 3: Upload new sticker file
def example_upload_sticker():
    bot_token = "YOUR_BOT_TOKEN"
    chat_id = 123456789
    
    # Read sticker file
    with open('sticker.webp', 'rb') as f:
        sticker_data = f.read()
    
    result = send_sticker(
        bot_token=bot_token,
        chat_id=chat_id,
        sticker=sticker_data,
        emoji="😀",
        message_thread_id=123,  # Forum topic
        reply_parameters={
            'message_id': 456,
            'chat_id': chat_id
        }
    )
    print(result)

# Example 4: With business connection
def example_with_business():
    bot_token = "YOUR_BOT_TOKEN"
    chat_id = 123456789
    
    result = send_sticker(
        bot_token=bot_token,
        chat_id=chat_id,
        sticker="FILE_ID_HERE",
        business_connection_id="business_123",
        allow_paid_broadcast=True
    )
    print(result)

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

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

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

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