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