Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

/* 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.

Ответ 2

Там есть волшебная переменная, называемая $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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

ПРИМЕЧАНИЯ:

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

Ответ 6

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

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

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