Разработчику. Сборник рецептов PHP
Задавайте вопросы

Получение содержимого URL,
если требуется отправить cookies

Вернуться назад

Задача

Необходимо получить страницу, которая требует посылки cookie вместе с запросом к ней.

Решение

Используйте расширение c URL и параметр CURLOPT_COOKIE:

$c = curl_init('http://www.example.com/needs-cookies.php');
curl_setopt($c, CURLOPT_VERBOSE, 1);
curl_setopt($c, CURLOPT_COOKIE, 'user=ellen; activity=swimming');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$page = curl_exec($c);
curl_close($c);

Если расширение c URL недоступно, то используйте метод addHeader() класса HTTP_Request из PEAR:

require 'HTTP/Request.php';

$r = new HTTP_Request('http://www.example.com/needs-cookies.php');
$r->addHeader('Cookie','user=ellen; activity=swimming');
$r->sendRequest();
$page = $r->getResponseBody();

Обсуждение

Cookies посылаются на сервер в заголовке Cookie запроса. В расширении c URL есть специальный параметр для cookie, но применяя класс HTTP_Request, необходимо добавлять заголовок Cookie точно так же, как и другие заголовки запроса. Несколько значений cookie посылаются списком с точкой с запятой в конце. Примеры в разделе «Решение» посылают два cookies: один с именем user и значением ellen, а другой с именем activity и значением swimming.

Чтобы запросить страницу, которая устанавливает cookies, а затем посылает последующие запросы, содержащие эти только что установленные cookies, используйте возможность расширения cURL, называемую «cookie jar» (банка для cookie). В первом запросе присваиваем параметру CURLOPT_COOKIEJAR имя файла, хранящего cookies. В последующих запросах присваиваем параметру CURLOPT_COOKIEFILE то же самое имя файла, а расширение c URL читает cookies из файла и посылает их вместе с запросом. Это особенно полезно, когда есть последовательность запросов, первый из которых регистрируется на сайте, устанавливающем cookies сессии или cookies аутентификации и требующем, чтобы остальные запросы содержали эти установленные cookies:

$cookie_jar = tempnam('/tmp','cookie');

// регистрируемся
$c = curl_init('https://bank.example.com/
login.php?user=donald&password=b1gmoney$');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_COOKIEJAR, $cookie_jar);
$page = curl_exec($c);
curl_close($c);

// извлекаем баланс счета
$c = curl_init('http://bank.example.com/balance.php?account=checking');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_jar);
$page = curl_exec($c);
curl_close($c);

// делаем депозит
$c = curl_init('http://bank.example.com/deposit.php');
curl_setopt($c, CURLOPT_POST, 1);
curl_setopt($c, CURLOPT_POSTFIELDS, 'account=checking&amount=122.44');
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_COOKIEFILE, $cookie_jar);
$page = curl_exec($c);
curl_close($c);

// удаляем cookie jar
unlink($cookie_jar) or die("Can't unlink $cookie_jar");

Определяя место хранения cookie jar, соблюдайте осторожность. Это должна быть область, куда веб-сервер имеет право записывать, но если другие пользователи имеют возможность читать этот файл, то они смогут незаконно получить идентификационные параметры, хранящиеся в cookies.

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования

Рейтинг Сайтов ДОСКИ.РУ