Метод setWebhook

Метод для установки URL-адреса вебхука, на который Telegram будет отправлять HTTPS POST-запросы с обновлениями для вашего бота.

Описание

Используйте этот метод, чтобы указать 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 - Метод для получения обновлений через длинный опрос с возможностью настройки параметров выборки.
Комментарии