Webhook Telegram отправляет несколько обновлений подряд - PullRequest
0 голосов
/ 15 марта 2020

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

Пожалуйста, объясните, как это работает. Может быть, мне нужно явно что-то вернуть, чтобы избежать этого? Теперь, когда вы go подключены непосредственно к веб-хуку, возвращается пустая страница со статусом 200.

1 Ответ

0 голосов
/ 26 марта 2020

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

Я пришел к выводу, что сервер Telegram ожидает ответа со сжатием 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(""); //Compress an empty answer in gzip

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

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

...