file_get_contents получать файлы cookie

Возможно ли получить файлы cookie, установленные на удаленном сервере при выполнении запроса file_get_contents ?

Мне нужно, чтобы php выполнил http-запрос, сохранил файлы cookie, а затем сделал второй HTTP-запрос, используя сохраненные файлы cookie.

вы должны использовать cURL для этой цели, cURL реализует функцию, называемую куклой cookie, которая позволяет сохранять файлы cookie в файле и повторно использовать их для последующего запроса (запросов).

Вот быстрый скрипт кода, как это сделать:

 /* STEP 1. let's create a cookie file */ $ckfile = tempnam ("/tmp", "CURLCOOKIE"); /* STEP 2. visit the homepage to set the cookie properly */ $ch = curl_init ("http://somedomain.com/"); curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec ($ch); /* STEP 3. visit cookiepage.php */ $ch = curl_init ("http://somedomain.com/cookiepage.php"); curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); $output = curl_exec ($ch); 

note : необходимо отметить, что вы должны иметь расширение pecl (или скомпилировано на PHP), либо у вас не будет доступа к API cURL.

Для этого есть волшебная переменная, называемая $http_response_header ; это массив, содержащий все заголовки, которые были получены. Чтобы извлечь файлы cookie, вы должны отфильтровать заголовки, которые начинаются с Set-Cookie:

 file_get_contents('http://example.org'); $cookies = array(); foreach ($http_response_header as $hdr) { if (preg_match('/^Set-Cookie:\s*([^;]+)/', $hdr, $matches)) { parse_str($matches[1], $tmp); $cookies += $tmp; } } print_r($cookies); 

Эквивалентным, но менее магическим подходом было бы использование stream_get_meta_data() :

 if (false !== ($f = fopen('http://www.example.org', 'r'))) { $meta = stream_get_meta_data($f); $headers = $meta['wrapper_data']; $contents = stream_get_contents($f); fclose($f); } // $headers now contains the same array as $http_response_header 

Я понимаю, что это поздно, но на самом деле есть способ, по крайней мере, получить отдельные файлы cookie, отправленные сервером.

Я предполагаю, что вы знаете, как сделать весь бизнес stream_create_context, чтобы получить ваш HTTP-запрос file_get_contents, и вам просто нужна помощь, фактически устанавливающая файлы cookie.

После запуска file_get_contents на URL-адресе установлен (к сожалению, неассоциативный) массив $ http_response_header.

Если сервер отправляет файл cookie, один из них будет начинаться с «Set-Cookie:», который вы можете извлечь с помощью substr.

Однако на данный момент мне кажется, что через эту переменную можно получить доступ только -one-Set-Cookie, что является ограничением, с которым я в настоящее время пытаюсь найти способ обойти.

Следуя от ответа Laereom, вот как получить несколько файлов cookie:

 $cookies=array(); foreach($http_response_header as $s){ if(preg_match('|^Set-Cookie:\s*([^=]+)=([^;]+);(.+)$|',$s,$parts)) $cookies[$parts[1]]=$parts[2]; } 

ЗАМЕТКИ:

  1. Я либеральный с регулярным выражением; изучите RFC, если вы хотите быть более точными (т. е. отказаться от плохо сформированных данных cookie)
  2. Вы найдете путь =, expires = и т. Д. В $ parts [3]. Я бы предложил explode(';',$parts[3]) затем еще один цикл для его обработки (потому что я не уверен, есть ли фиксированный порядок для этих атрибутов.
  3. Если два куки имеют одно и то же имя, осталось только последнее, что кажется правильным. (У меня такая ситуация в моем текущем проекте, я предполагаю, что это ошибка на веб-сайте, который я скрипит на экране).

Вы можете установить и использовать расширение PECL для HTTP или убедиться, что ваша установка php была скомпилирована с дополнительной библиотекой curl .

Я считаю, что вы довольно легко справляетесь с объектом Zend_Http. Вот документация о добавлении файлов cookie в запрос.

Чтобы получить куки-файлы из запроса (автоматически getCookieJar() я полагаю), просто используйте getCookieJar() для объекта Zend_Http.

Это должно быть легко реализовать; однако в руководстве php есть комментарий пользователя о том, как обрабатывать файлы cookie с использованием потока http .