Метод sendPoll

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

Описание

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

Параметр Тип Обязательный Описание
business_connection_id String Опционально Уникальный идентификатор бизнес-подключения, от имени которого будет отправлено сообщение
chat_id Integer or String Да Уникальный идентификатор целевого чата или username целевого канала (в формате @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 Да Список в формате JSON из 2-12 вариантов ответа
is_anonymous Boolean Опционально True, если опрос должен быть анонимным, по умолчанию True
type String Опционально Тип опроса: "quiz" или "regular", по умолчанию "regular"
allows_multiple_answers Boolean Опционально Передайте True, если опрос допускает несколько ответов, по умолчанию False
allows_revoting Boolean Опционально Передайте True, если опрос позволяет изменять выбранные варианты ответа, по умолчанию False для викторин и True для обычных опросов
shuffle_options Boolean Опционально Передайте True, если варианты опроса должны отображаться в случайном порядке
allow_adding_options Boolean Опционально Передайте True, если варианты ответа могут быть добавлены в опрос после создания; не поддерживается для анонимных опросов и викторин
hide_results_until_closes Boolean Опционально Передайте True, если результаты опроса должны показываться только после закрытия опроса
correct_option_ids Array of Integer Опционально Список в формате JSON монотонно возрастающих 0-индексированных идентификаторов правильных вариантов ответа, обязателен для опросов в режиме викторины
explanation String Опционально Текст, который показывается, когда пользователь выбирает неправильный ответ или нажимает на иконку лампочки в опросе в стиле викторины, 0-200 символов с не более чем 2 переносами строк после разбора сущностей
explanation_parse_mode String Опционально Режим разбора сущностей в пояснении. См. параметры форматирования для более подробной информации
explanation_entities Array of MessageEntity Опционально Список в формате JSON специальных сущностей, которые появляются в пояснении к опросу. Может быть указан вместо explanation_parse_mode
open_period Integer Опционально Время в секундах, в течение которого опрос будет активен после создания, 5-2628000. Не может использоваться вместе с close_date
close_date Integer Опционально Момент времени (Unix timestamp), когда опрос будет автоматически закрыт. Должен быть как минимум на 5 и не более чем на 2628000 секунд в будущем. Не может использоваться вместе с open_period
is_closed Boolean Опционально Передайте True, если опрос должен быть немедленно закрыт. Это может быть полезно для предварительного просмотра опроса
description String Опционально Описание отправляемого опроса, 0-1024 символа после разбора сущностей
description_parse_mode String Опционально Режим разбора сущностей в описании опроса. См. параметры форматирования для более подробной информации
description_entities Array of MessageEntity Опционально Список в формате JSON специальных сущностей, которые появляются в описании опроса, может быть указан вместо description_parse_mode
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 or ReplyKeyboardMarkup or ReplyKeyboardRemove or 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 в личных чатах с темами для отправки сообщения в конкретную тему.
  • API 9.6. Обновлен метод sendPoll: Заменили параметр correct_option_id на параметр correct_option_ids в методе sendPoll
  • API 9.6. Обновлен метод sendPoll: Разрешили передавать allows_multiple_answers для викторин в методе sendPoll
  • API 9.6. Обновлен метод sendPoll: Добавили параметр allows_revoting к методу sendPoll
  • API 9.6. Обновлен метод sendPoll: Добавили параметр shuffle_options к методу sendPoll
  • API 9.6. Обновлен метод sendPoll: Добавили параметр allow_adding_options к методу sendPoll
  • API 9.6. Обновлен метод sendPoll: Добавили параметр hide_results_until_closes к методу sendPoll
  • API 9.6. Обновлен метод sendPoll: Добавили параметры description, description_parse_mode и description_entities к методу sendPoll

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

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