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