Описание
Используйте этот метод, чтобы указать URL и получать входящие обновления через исходящий вебхук. Всякий раз, когда для бота появляется обновление, мы отправляем HTTPS POST-запрос на указанный URL, содержащий JSON-сериализованное Update. В случае неудачного запроса (запроса с ответом HTTP статус-кодом, отличным от 2XY), мы повторим запрос и сдадимся после разумного количества попыток. Возвращает True при успехе.
Если вы хотите убедиться, что вебхук был установлен вами, вы можете указать секретные данные в параметре secret_token. Если он указан, запрос будет содержать заголовок «X-Telegram-Bot-Api-Secret-Token» с секретным токеном в качестве содержимого.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| url | String | Да | HTTPS URL для отправки обновлений. Используйте пустую строку, чтобы удалить интеграцию вебхука |
| certificate | InputFile | Опционально | Загрузите ваш сертификат открытого ключа, чтобы можно было проверить используемый корневой сертификат. Подробности см. в нашем руководстве по самоподписанным сертификатам. |
| ip_address | String | Опционально | Фиксированный IP-адрес, который будет использоваться для отправки запросов вебхука вместо IP-адреса, полученного через DNS |
| max_connections | Integer | Опционально | Максимально допустимое количество одновременных HTTPS-подключений к вебхуку для доставки обновлений, 1-100. По умолчанию 40. Используйте меньшие значения, чтобы ограничить нагрузку на сервер вашего бота, и большие значения, чтобы увеличить его пропускную способность. |
| allowed_updates | Array of String | Опционально | JSON-сериализованный список типов обновлений, которые вы хотите получать вашим ботом. Например, укажите ["message", "edited_channel_post", "callback_query"], чтобы получать обновления только этих типов. Полный список доступных типов обновлений см. в Update. Укажите пустой список, чтобы получать все типы обновлений, кроме chat_member, message_reaction и message_reaction_count (по умолчанию). Если не указано, будет использоваться предыдущая настройка.Обратите внимание, что этот параметр не влияет на обновления, созданные до вызова setWebhook, поэтому в течение короткого времени могут приходить нежелательные обновления. |
| drop_pending_updates | Boolean | Опционально | Передайте True, чтобы отбросить все ожидающие обновления |
| secret_token | String | Опционально | Секретный токен, который будет отправляться в заголовке «X-Telegram-Bot-Api-Secret-Token» в каждом запросе вебхука, 1-256 символов. Разрешены только символы A-Z, a-z, 0-9, _ и -. Заголовок полезен для того, чтобы убедиться, что запрос приходит от вебхука, установленного вами. |
Примечания
1. Вы не сможете получать обновления с помощью getUpdates, пока настроен исходящий вебхук.
2. Чтобы использовать самоподписанный сертификат, вам нужно загрузить ваш сертификат открытого ключа с помощью параметра certificate. Пожалуйста, загружайте как InputFile, отправка строки не сработает.
3. В настоящее время поддерживаемые порты для вебхуков: 443, 80, 88, 8443.Если у вас возникли проблемы с настройкой вебхуков, ознакомьтесь с этим замечательным руководством по вебхукам.
Примеры
php
<?php
$botToken = 'YOUR_BOT_TOKEN';
$apiUrl = "https://api.telegram.org/bot{$botToken}/setWebhook";
// Вариант 1: Простая установка вебхука
$webhookUrl = 'https://yourdomain.com/webhook.php';
$data = [
'url' => $webhookUrl
];
// Вариант 2: Расширенная настройка с дополнительными параметрами
$data = [
'url' => $webhookUrl,
'max_connections' => 50,
'allowed_updates' => json_encode(['message', 'callback_query', 'inline_query']),
'drop_pending_updates' => true,
'secret_token' => 'your_secret_token_123',
'ip_address' => '192.168.1.100' // Пример IP адреса
];
// Вариант 3: С использованием self-signed сертификата
$certificatePath = '/path/to/your/certificate.pem';
if (file_exists($certificatePath)) {
$data['certificate'] = new CURLFile($certificatePath);
}
// Отправка запроса через cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Только для тестирования!
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
echo 'cURL Error: ' . curl_error($ch);
} else {
$result = json_decode($response, true);
if ($result['ok']) {
echo "Webhook успешно установлен!\n";
echo "URL: " . $data['url'] . "\n";
} else {
echo "Ошибка: " . $result['description'] . "\n";
}
}
curl_close($ch);
// Пример обработчика вебхука (webhook.php)
/*
<?php
$secretToken = 'your_secret_token_123';
// Проверка секретного токена
if (isset($_SERVER['HTTP_X_TELEGRAM_BOT_API_SECRET_TOKEN'])) {
if ($_SERVER['HTTP_X_TELEGRAM_BOT_API_SECRET_TOKEN'] !== $secretToken) {
http_response_code(403);
exit('Invalid secret token');
}
}
// Получение обновления
$update = json_decode(file_get_contents('php://input'), true);
if ($update) {
// Обработка обновления
$chatId = $update['message']['chat']['id'] ?? null;
$text = $update['message']['text'] ?? '';
if ($chatId && $text) {
// Ответ на сообщение
$response = [
'chat_id' => $chatId,
'text' => "Вы сказали: " . $text
];
// Отправка ответа (можно использовать отдельный запрос к API)
file_put_contents('log.txt', json_encode($response, JSON_PRETTY_PRINT));
}
http_response_code(200);
echo 'OK';
} else {
http_response_code(400);
echo 'Bad Request';
}
*/
?>
python
import requests
# Токен вашего бота
BOT_TOKEN = "YOUR_BOT_TOKEN_HERE"
# URL вебхука (должен быть HTTPS)
WEBHOOK_URL = "https://yourdomain.com/webhook/path"
# Установка вебхука с дополнительными параметрами
def set_webhook():
url = f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook"
# Параметры запроса
params = {
"url": WEBHOOK_URL,
"max_connections": 40,
"allowed_updates": ["message", "callback_query"],
"drop_pending_updates": True,
"secret_token": "your_secret_token_123",
"ip_address": "192.168.1.1" # опционально, если нужен фиксированный IP
}
# Если нужно загрузить сертификат
files = None
if "certificate_path" in locals():
files = {
"certificate": open("path/to/certificate.pem", "rb")
}
response = requests.post(url, data=params, files=files)
return response.json()
# Удаление вебхука
def delete_webhook():
url = f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook"
params = {"url": ""}
response = requests.post(url, data=params)
return response.json()
# Пример использования
if __name__ == "__main__":
# Установка вебхука
result = set_webhook()
print("Webhook установлен:", result)
# Удаление вебхука
# result = delete_webhook()
# print("Webhook удален:", result)
История изменений
- API 2.3.1. Обновлен метод setWebhook: Добавлено поле max_connections и поле allowed_updates
- API 5.0. Обновлен метод setWebhook: Добавлен параметр ip_address и параметр drop_pending_updates
- API 6.1. Обновлен метод setWebhook: Добавлен параметр secret_token
Дополнительно
- Update - Объект Update представляет входящее событие в Telegram Bot API, содержащее информацию о сообщениях, запросах, изменениях статуса участников и других действиях, связанных с ботом.
- InputFile - Объект, представляющий содержимое файла для загрузки через multipart/form-data.
- getUpdates - Метод для получения обновлений через длинный опрос с возможностью настройки параметров выборки.