php curl response показывает gzip или закодированные данные - PullRequest
0 голосов
/ 26 августа 2018

Я использую приведенный ниже скрипт для получения данных с сайта. данные возвращаются, но они находятся в формате gzip или в другом закодированном формате. Я пытался использовать gzdecode, но он не работает на нем. Есть ли способ увидеть чистые данные из этого запроса.

Я использую

                curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
                curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
                curl_setopt($ch, CURLOPT_ENCODING , 'br');

но ни один из них не работает. ниже запрос скручивания

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_URL, 'https://www.example.com');
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
            curl_setopt($ch, CURLOPT_TIMEOUT, 20);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
            $response = curl_exec($ch);

            $d = curl_getinfo( $ch );

curl_getinfo показывается ниже

Я вижу, что сайт использует кодировку "br", т.е. кодировку содержимого: br

Ответы [ 3 ]

0 голосов
/ 27 августа 2018

В заголовке я разрешил только gzip и deflate и удалил br, и это сработало для меня.Поэтому вместо этого $header[] = 'Accept-Encoding: gzip, deflate, br'; я использовал $header[] = 'Accept-Encoding: gzip, deflate';

Спасибо всем за помощь.

0 голосов
/ 27 августа 2018
            curl_setopt($ch, CURLOPT_ENCODING , 'deflate');
            curl_setopt($ch, CURLOPT_ENCODING , 'gzip');
            curl_setopt($ch, CURLOPT_ENCODING , 'br');

последующие вызовы перезаписывают предыдущее значение, оно не добавляет к предыдущему значению. если вы хотите поддерживать deflate, gzip и br, разделите их запятыми, например

            curl_setopt($ch, CURLOPT_ENCODING , 'gzip,deflate,br');

однако br является недавним дополнением к curl, поддержка br была впервые добавлена ​​в curl в версии 7.57.0, выпущенной в November 29 2017, поэтому вы можете добавить

if(!definied("CURL_VERSION_BROTLI")){
// https://github.com/curl/curl/blob/f762fec323f36fd7da7ad6eddfbbae940ec3229e/include/curl/curl.h#L2720
    define("CURL_VERSION_BROTLI",(1<<23));
}
if(!(curl_version()["features"] & CURL_VERSION_BROTLI)){
    throw new \RuntimeException("this script requires brotli support added to libcurl (added in libcurl version 7.57.0, released November 29 2017), please update your libcurl installation.");
}

чтобы убедиться, что br действительно поддерживается libcurl вашего php, если вам это нужно.

0 голосов
/ 26 августа 2018

br кодировка Brotli кодировка. Вы можете передать его в заголовок Accept-Encoding с помощью curl_setopt($ch, CURLOPT_ENCODING , 'br'), но он не будет обработан curl, т. Е. Вам придется явно декодировать вывод.

Возможно, вы можете использовать это расширение PHP: https://github.com/kjdev/php-ext-brotli

Вы также можете попытаться использовать curl_setopt($ch, CURLOPT_ENCODING , 'identity'), и, если сервер, к которому вы обращаетесь, работает должным образом, распаковать данные.

Полагаю, вы уже пытались полностью исключить заголовок Accept-Encoding. К сожалению, согласно спецификации , это не мешает кодированию вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...