@fakin_kiska
Telegram Bots

Как установить статус кода 200 после ошибки от Telegram?

У меня есть бот, который работает на вебхуке и отправляет некоторые запросы, они долго обрабатываются и бот получает ошибки по типу Wrong response from the webhook: 523 или Read timeout expired, затем телеграм пытается несколько раз заново обработать запросы, из-за чего они копятся и лишний раз срабатывают

Я хочу после получения таких ошибок вернуть 200 код, чтобы Телеграм не пытался заново отправить запрос:

// Здесь создается первоначальный запрос
$curl = curl_init($settings->url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($curl);

// Здесь отлавливаются ошибки с вебхука
$webhook_url = 'https://api.telegram.org/bot' . BOT_TOKEN . '/getWebhookInfo';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $webhook_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$json_result = json_decode($result, JSON_OBJECT_AS_ARRAY);
switch ($json_result['result']['last_error_message']) {
    case 'Wrong response from the webhook: 523 ':
        send_message($chat_id, 'Бот поймал 523 ошибку');
        http_response_code(200);
    break;
    case 'Read timeout expired':
        send_message($chat_id, 'Время ожидания истекло');
        http_response_code(200);
    break;
}
curl_close($ch);
curl_close($curl);


Я попытался с помощью http_response_code(200) вернуть 200 код, бот заходил в нужные case при ошибках и выводил информацию о них, но ошибки не перестали приходить
  • Вопрос задан
  • 68 просмотров
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Ответ надо посылать со скрипта который обрабатывает запросы от бота
Можно быстро отправить код 200, закрыть соединение для бота и продолжить выполнение тяжёлой задачи в фоне

в nginx (php-fpm)
<?php

//отправляем ответ 200 и закрываем соединение
http_response_code(200);
fastcgi_finish_request();

//тут долгая задача


Apache (mod_php)
<?php
ob_start();
http_response_code(200);

header("Connection: close\r\n"); 
header("Content-Encoding: none\r\n");

$size = ob_get_length();
header("Content-Length: ". $size . "\r\n"); 
ob_end_flush();
flush();

//тут долгая задача в фоне
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы