Webhook Telegram отправляет несколько обновлений подряд

При подключении webhook повесил на него логирование входящих обновлений. Заметил что когда пишу телеграм-боту 1 сообщение, он присылает в вебхук сразу несколько одинаковых обновлений. И присылает их в течении длительного времени. Как это поправить?

Пример вебхука взял с официального сайта. Написав одно сообщение боту, он меня спамит ответами. Может нужно как-то явно вернуть какой-то ответ?

Просто мне интересно, всем приходит один экземпляр обновлений на вебхук? Только у меня эта проблема? Или нужно правильно отдавать ответ от вебхука чтоб отправка обновления засчитывалось? Как боту отвечать на конкретное обновление 1 раз?

При вызове метода getWebhookInfo выводит следующее:

"last_error_message":"Bad Request: zlib error -5"

Возможно причина в этом. Но я не понимаю что это значит, и как это связано с ответами вебхука


Ответы (1 шт):

Автор решения: Rebellion

Проблема была в заголовке Content-Encoding, а точнее в способе сжатия. Сервер автоматически сжимал ответ по алгоритму Brotli и возвращал заголовок Content-Encoding: br.

Пришел к выводу что Телеграмм-сервер ожидает ответ с сжатием gzip. У меня не было возможности настроить алгоритм сжатия на сервере, потому пришлось сжимать ответ вручную:

function compress($data) {

    $supportsGzip = strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) !== false;

    if ( $supportsGzip ) {
        $content = gzencode( trim( preg_replace( '/\s+/', ' ', $data ) ), 9);
        header('Content-Encoding: gzip');
    } else {
        $content = $data;
    }

    $offset = 60 * 60;
    $expire = "expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";

    header("content-type: text/html; charset: UTF-8");
    header("cache-control: must-revalidate");
    header( $expire );
    header( 'Content-Length: ' . strlen( $content ) );
    header('Vary: Accept-Encoding');

    echo $content;
}

compress(""); //Сжимаем пустой ответ в gzip

После этого обновления начали приходить в единственном экземпляре.

P.S. Это относиться к формату text/html. Если вебхук должен вернуть application/json, то всё работает и без сжатия.

→ Ссылка