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

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

Решение
Используйте расширение cURL и параметр 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);

Если расширение cURL недоступно, то используйте метод 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 запроса. В расширении cURL есть специальный параметр для cookie, но применяя класс HTTP_Request, необходимо добавлять заголовок Cookie точно так же, как и другие заголовки запроса. Несколько значений cookie посылаются списком с точкой с запятой в конце. Примеры в разделе «Решение» посылают два cookies: один с именем user и значением ellen, а другой с именем activity и значением swimming.

Чтобы запросить страницу, которая устанавливает cookies, а затем посылает последующие запросы, содержащие эти только что установленные cookies, используйте возможность расширения cURL, называемую «cookie jar» (банка для cookie).


В первом запросе присваиваем параметру CURLOPT_COOKIEJAR имя файла, хранящего cookies. В последующих запросах присваиваем параметру CURLOPT_COOKIEFILE то же самое имя файла, а расширение cURL читает 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.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Анализ файла протокола веб-сервера
Выделение информации на веб-странице
Извлечение содержимого URL с помощью метода POST
Извлечение ссылок из HTML-файла
Использование шаблонов системы Smarty

Вернуться в раздел: PHP / 11. Автоматизация работы с Web