Метод sendPoll

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

Описание

Используйте этот метод для отправки нативного опроса. В случае успеха возвращается отправленное Message.

Параметр Тип Обязательный Описание
business_connection_id String Опционально Уникальный идентификатор бизнес-подключения, от имени которого будет отправлено сообщение
chat_id Integer или String Да Уникальный идентификатор целевого чата или имя пользователя целевого канала (в формате @channelusername). Опросы нельзя отправлять в личные сообщения каналов.
message_thread_id Integer Опционально Уникальный идентификатор целевой ветки сообщений (темы) форума; только для супергрупп-форумов
question String Да Вопрос опроса, 1-300 символов
question_parse_mode String Опционально Режим парсинга сущностей в вопросе. Подробнее см. параметры форматирования. В настоящее время разрешены только пользовательские эмодзи-сущности
question_entities Array of MessageEntity Опционально Список специальных сущностей в вопросе опроса в формате JSON. Может быть указан вместо question_parse_mode
options Array of InputPollOption Да Список из 2-12 вариантов ответов в формате JSON
is_anonymous Boolean Опционально True, если опрос должен быть анонимным, по умолчанию True
type String Опционально Тип опроса, «quiz» или «regular», по умолчанию «regular»
allows_multiple_answers Boolean Опционально True, если опрос позволяет несколько ответов, игнорируется для опросов в режиме викторины, по умолчанию False
correct_option_id Integer Опционально Идентификатор правильного варианта ответа (начиная с 0), обязателен для опросов в режиме викторины
explanation String Опционально Текст, который показывается, когда пользователь выбирает неправильный ответ или нажимает на значок лампы в опросе-викторине, 0-200 символов с максимум 2 переносами строк после парсинга сущностей
explanation_parse_mode String Опционально Режим парсинга сущностей в пояснении. Подробнее см. параметры форматирования.
explanation_entities Array of MessageEntity Опционально Список специальных сущностей в пояснении опроса в формате JSON. Может быть указан вместо explanation_parse_mode
open_period Integer Опционально Время активности опроса в секундах после создания, 5-600. Нельзя использовать вместе с close_date.
close_date Integer Опционально Момент времени (Unix timestamp), когда опрос будет автоматически закрыт. Должен быть минимум на 5 и не более чем на 600 секунд в будущем. Нельзя использовать вместе с open_period.
is_closed Boolean Опционально Передайте True, если опрос нужно немедленно закрыть. Это может быть полезно для предпросмотра опроса.
disable_notification Boolean Опционально Отправляет сообщение бесшумно. Пользователи получат уведомление без звука.
protect_content Boolean Опционально Защищает содержимое отправленного сообщения от пересылки и сохранения
allow_paid_broadcast Boolean Опционально Передайте True, чтобы разрешить до 1000 сообщений в секунду, игнорируя ограничения рассылки за плату 0.1 Telegram Stars за сообщение. Соответствующие Stars будут списаны с баланса бота
message_effect_id String Опционально Уникальный идентификатор эффекта сообщения, который будет добавлен к сообщению; только для личных чатов
reply_parameters ReplyParameters Опционально Описание сообщения, на которое нужно ответить
reply_markup InlineKeyboardMarkup или ReplyKeyboardMarkup или ReplyKeyboardRemove или ForceReply Опционально Дополнительные параметры интерфейса. Объект в формате JSON для встроенной клавиатуры, пользовательской клавиатуры ответа, инструкций по удалению клавиатуры ответа или принудительному ответу от пользователя

Примеры

php

<?php

$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/sendPoll";

// Данные для отправки опроса
$pollData = [
    'chat_id' => 123456789, // ID чата или @username канала
    'question' => 'Какой ваш любимый язык программирования?',
    'options' => json_encode([
        ['text' => 'PHP'],
        ['text' => 'Python'],
        ['text' => 'JavaScript'],
        ['text' => 'Java']
    ]),
    'is_anonymous' => true,
    'type' => 'regular',
    'allows_multiple_answers' => false,
    'disable_notification' => false,
    'protect_content' => false
];

// Отправка запроса через cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pollData);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
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)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
} else {
    if ($httpCode == 200) {
        $responseData = json_decode($response, true);
        if ($responseData['ok']) {
            echo 'Опрос успешно отправлен! ID сообщения: ' . $responseData['result']['message_id'];
        } else {
            echo 'Ошибка API: ' . $responseData['description'];
        }
    } else {
        echo 'HTTP ошибка: ' . $httpCode;
    }
}

curl_close($ch);

// Альтернативный вариант с использованием file_get_contents
/*
$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded',
        'content' => http_build_query($pollData)
    ]
]);

$response = file_get_contents($apiUrl, false, $context);
if ($response === FALSE) {
    echo 'Ошибка отправки запроса';
} else {
    $responseData = json_decode($response, true);
    if ($responseData['ok']) {
        echo 'Опрос успешно отправлен!';
    } else {
        echo 'Ошибка: ' . $responseData['description'];
    }
}
*/

// Пример с викториной (quiz)
$quizData = [
    'chat_id' => 123456789,
    'question' => 'Столица Франции?',
    'options' => json_encode([
        ['text' => 'Лондон'],
        ['text' => 'Берлин'],
        ['text' => 'Париж'],
        ['text' => 'Мадрид']
    ]),
    'type' => 'quiz',
    'correct_option_id' => 2, // Париж (0-based индекс)
    'explanation' => 'Париж является столицей Франции с 508 года',
    'explanation_parse_mode' => 'HTML',
    'open_period' => 60 // Опрос будет активен 60 секунд
];

// Пример с кастомной клавиатурой
$pollWithKeyboard = [
    'chat_id' => 123456789,
    'question' => 'Нравится ли вам Telegram Bot API?',
    'options' => json_encode([
        ['text' => 'Да'],
        ['text' => 'Нет'],
        ['text' => 'Затрудняюсь ответить']
    ]),
    'reply_markup' => json_encode([
        'inline_keyboard' => [
            [
                ['text' => 'Просмотреть результаты', 'callback_data' => 'view_results']
            ]
        ]
    ])
];

?>

python

import asyncio
from telegram import Bot, InputPollOption
from telegram.constants import ParseMode

async def send_poll_example():
    bot = Bot(token="YOUR_BOT_TOKEN")
    
    # Создаем опции для опроса
    options = [
        InputPollOption(text="Вариант 1"),
        InputPollOption(text="Вариант 2"),
        InputPollOption(text="Вариант 3"),
        InputPollOption(text="Вариант 4")
    ]
    
    # Отправляем обычный опрос
    message = await bot.send_poll(
        chat_id=123456789,  # ID чата или @username
        question="Какой ваш любимый язык программирования?",
        options=options,
        is_anonymous=False,
        type="regular",
        allows_multiple_answers=True,
        disable_notification=False,
        protect_content=False
    )
    
    print(f"Опрос отправлен с ID: {message.poll.id}")
    
    # Отправляем викторину (quiz)
    quiz_message = await bot.send_poll(
        chat_id=123456789,
        question="Столица Франции?",
        options=[
            InputPollOption(text="Лондон"),
            InputPollOption(text="Берлин"),
            InputPollOption(text="Париж"),
            InputPollOption(text="Мадрид")
        ],
        type="quiz",
        correct_option_id=2,  # Париж (0-based индекс)
        explanation="Париж является столицей Франции с 508 года",
        explanation_parse_mode=ParseMode.HTML,
        open_period=60  # Опрос будет активен 60 секунд
    )
    
    print(f"Викторина отправлена с ID: {quiz_message.poll.id}")

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

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

  • API 4.2. Добавлен метод sendPoll
  • API 4.6. Обновлен метод sendPoll: Добавлены параметры is_anonymous, type, allows_multiple_answers, correct_option_id, is_closed
  • API 4.8. Обновлен метод sendPoll: Добавлены параметры explanation, explanation_parse_mode, open_period, close_date
  • API 5.0. Обновлен метод sendPoll: Добавлена возможность ручного указания текстовых сущностей и поле allow_sending_without_reply
  • API 5.6. Обновлен метод sendPoll: Добавлено поле protect_content
  • API 6.3. Обновлен метод sendPoll: Добавлен параметр message_thread_id
  • API 7.0. Обновлен метод sendPoll: Заменены параметры reply_to_message_id и allow_sending_without_reply на reply_parameters
  • API 7.3. Обновлен метод sendPoll: Добавлены параметры question_parse_mode и question_entities, изменён тип параметра options на массив InputPollOption
  • API 7.4. Обновлен метод sendPoll: Добавлен параметр message_effect_id
  • API 7.11. Обновлен метод sendPoll: Добавлен параметр allow_paid_broadcast
  • API 9.3. Обновлен метод sendPoll: Поддержан параметр message_thread_id в личных чатах с темами для отправки сообщения в конкретную тему.

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

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