Итак, какой-то парень из другой компании подумал, что было бы здорово, если бы вместо использования мыла, xml-rpc, rest или любого другого разумного протокола связи он просто встроил весь свой ответ в виде файлов cookie в заголовок.
Мне нужно вытащить эти файлы cookie как, надеюсь, массив из этого ответа curl. Если мне придется потратить кучу своей жизни на написание парсера для этого, я буду очень недоволен.
Кто-нибудь знает, как это просто сделать, желательно ничего не записывая в файл?
Буду очень признателен, если кто-нибудь сможет мне с этим помочь.
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'callback_SaveHeaders');
parse_str($m[1], $cookies)
, что файлы cookie будут$cookies
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches); $cookies = array(); foreach($matches[1] as $item) { parse_str($item, $cookie); $cookies = array_merge($cookies, $cookie); }
Хотя этот вопрос довольно старый, и принятый ответ действителен, я нахожу его немного неудобным, потому что содержимое HTTP-ответа (HTML, XML, JSON, двоичный или что-то еще) смешивается с заголовками.
Я нашел другую альтернативу. CURL предоставляет возможность (
CURLOPT_HEADERFUNCTION
) для установки обратного вызова, который будет вызываться для каждой строки заголовка ответа. Функция получит объект curl и строку со строкой заголовка.Вы можете использовать такой код (адаптированный из ответа TML):
Недостатком этого решения является использование глобальной переменной, но я думаю, это не проблема для коротких скриптов. И вы всегда можете использовать статические методы и атрибуты, если curl переносится в класс.
источник
$cookies
.$curlResponseHeaderCallback = function ($ch, $headerLine) use (&$cookies) {
тогдаcurl_setopt($ch, CURLOPT_HEADERFUNCTION, $curlResponseHeaderCallback);
.$class->curlResponseHeaderCallback()
? Или у вас простоcurlResponseHeaderCallback
вне класса?Это делает это без регулярных выражений, но требует расширения HTTP PECL .
источник
pecl install
действительно работало. Хмм.Если вы используете CURLOPT_COOKIE_FILE и CURLOPT_COOKIE_JAR, curl будет читать / записывать файлы cookie из / в файл. Вы можете, после того, как curl будет с ним, читать и / или изменять его, как хотите.
источник
libcurl также предоставляет CURLOPT_COOKIELIST, который извлекает все известные файлы cookie. Все, что вам нужно, это убедиться, что привязка PHP / CURL может его использовать.
источник
кто-то здесь может найти это полезным. hhb_curl_exec2 работает почти так же, как curl_exec, но arg3 - это массив, который будет заполнен возвращенными заголовками http (числовой индекс), а arg4 - это массив, который будет заполнен возвращенными куки ($ cookies ["expires"] => " Fri, 06-May-2016 05:58:51 GMT "), а arg5 будет заполнен ... информацией о необработанном запросе, сделанном curl.
Обратной стороной является то, что для этого требуется, чтобы CURLOPT_RETURNTRANSFER был включен, иначе он выйдет из строя и что он перезапишет CURLOPT_STDERR и CURLOPT_VERBOSE, если вы уже использовали их для чего-то другого ... (я могу исправить это позже)
пример того, как его использовать:
и сама функция ..
источник
Принятый ответ выглядит так, как будто он будет перебирать все ответное сообщение. Это может дать вам ложные совпадения для заголовков файлов cookie, если слово «Set-Cookie» находится в начале строки. Хотя в большинстве случаев это должно быть нормально. Более безопасный способ - прочитать сообщение от начала до первой пустой строки, которая указывает конец заголовков сообщения. Это просто альтернативное решение, которое должно искать первую пустую строку, а затем использовать preg_grep в этих строках только для поиска «Set-Cookie».
источник
Насколько я понимаю, файлы cookie из
curl
должны быть записаны в файл (curl -c cookie_file
). Если вы используетеcurl
PHPexec
илиsystem
функции (или что-либо в этом семействе), вы сможете сохранить файлы cookie в файл, затем открыть файл и прочитать их.источник