My name is Vasyl Khrystiuk‎ > ‎process‎ > ‎main‎ > ‎

curl + cookie in php for windows

Tags: php_tag, curl_tag, ssl_tag

Да, это будет еще одна статья об cURL. 
curl - это консольная утилита которая построенная на основе библиотеки libcurl и предоставляет консольный доступ к всем возможностям этой библиотеки.
Задача curl - быть клиентом при работе с сетевыми сервисами. Она умеет работать с очень многими сетевыми протоколами:  FTP, FTPS, Gopher, HTTP, HTTPS, SCP, SFTP, TFTP, Telnet, DICT, URI scheme, LDAP, LDAPS, IMAP, POP3, SMTP, RTSP.(вики). Эта библиотека используется в многих языках программирования в качестве сетевого клиента(php,perl,python,…) и не смотря на наличие встроенных библиотек для работы с сетью все равно очень популярна(например в php наверняка далеко не все знают об других библиотеках, да и зачем, если эта работает как надо).

В данной статье будет рассматриваться работа с библиотекой cURL в php. 
Официальный учебник здесь: http://www.php.net/manual/ru/book.curl.php. Здесь всего лишь мелкие примерчики. 



Проверка и установка расширения curl в php

Для того, чтоб проверить, установлен ли в системе curl достаточно выполнить такой код:
<?php
echo "cURL is".(function_exists("curl_init") ?"" : " not")." installed\n";
?>
Если cURL не установлен, то его нужно установить. Для начала нужно проверить наличие файла "php_curl.dll" в папке ext в php. Если его нет - скачать (вообще то эта библиотека должна быть в php изначально и если ее нет, то лучшее решение - скачать новый пакет с php, в нем точно есть эта библиотека) Можно скачать прямо с моего сайта. Для работы расширения необходимы библиотеки "libeay32.dll" и "ssleay32.dll". Они тоже должны быть в комплекте с php.
Дальше нужно подключить это расширение в php.ini - нужно раскомментировать эту строку:
extension=ext/php_curl.dll
Все. Перезапускаем апач и проверяем снова. Я работаю с версией 2.2 и в этой версии можно перезапустить апач так, чтоб увидеть все ошибки, если возникнут такие:
С:\path\to\apache2.2\bin\httpd.exe -k -restart
Должно все работать.


Простой запрос(simple curl request)

Тут все просто - указываем адрес, устанавливаем основные опции запроса, выполняем запрос, в случае ошибки выводим описание ошибки, в случае удачного запроса выводим ответ.
<?php
header('Content-Type: text/html; charset=windows-1251'); // это  для нормального вывода
$url = "http://vk.com/sinistersky";

  $ch = curl_init(); // создаем объект запроса
  curl_setopt($ch, CURLOPT_URL,$url); // устанавливаем адресс, по которому будем стучаться
  curl_setopt($ch, CURLOPT_HEADER, false); // убираем с вывода хеадер ответа, а другой опцией можно выключить получение тела ответа
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // говорим, что результат работы должен писаться в переменную вместо вывода на экран
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // ну тут все ясно
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22'); // юзерагент, опционально
  $data = NULL;
  $data = curl_exec($ch); // собственно выполнение запроса
  if(!curl_errno($ch)){ // если нет ошибки(код ошыбки: 0)
    $info = curl_getinfo($ch); // получаем всю мета инфу по запросу - скорость, время, размер и т.д.
  } else {
    echo ('Curl error: ' . curl_error($ch)); // иначе получаем текстовое описание ошибки
  }
  curl_close($ch); // закрываем объект запроса
  

    
  if ($data!==NULL){// в случае ошибки выполнения в этой переменной будет содержаться NULL
        // print_r($info); // можно посмотреть инфу по запросу
    echo $data; // выводим ответ
  }
  
  

?>

Работа с http сессией(curl + cookie)

Этот пример отличается от предыдущего тем, что здесь работа с cURL вынесена в функцию, а так же добавлена робота с http сессией. Вообще - как работает сессия? Алгоритм простой: 
1) Клиент отсылает на серсер запрос без указания кукисов(cookies, печеньки) или с не валидными/устаревшими кукисами
2) Сервер разбирает запрос и дальше решает, нужно ли создавать сессию. Если он хочет создать сессию, то в ответе клиенту он отправляет дополнительный заголовок типа: "Set-Cookie:gauthed=; expires=Sun, 24-Feb-2013 01:20:19 GMT; path=/", который устанавливает на клиенте куки, указывая время их жизни и область действия.
3) Клиент получает ответ, и помимо обработки тела ответа еще должен считать заголовок и запомнить куки.
4) Для того, чтоб идентифицироваться на сервере, все последующие разы клиент должен будет с каждым запросом передавать эти куки.
При работе с cURL есть есть несколько способов обрабатывать сценарий выше. Рассмотрим их.
  • Вручную парсить заголовок ответа и вытаскивать оттуда куки, потом с каждым запросом передавать их с помощью опции CURLOPT_COOKIE. Для примера разберем авторизацию на сайте http://codepad.org/login и создание там записи: http://pastebin.com/2ehHxFr7
  • Использовать специальные опции библиотеки CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR. Тот же сайт, те же действия, только немного код: http://pastebin.com/xzM1K2aG


Работа с прокси(curl proxy)и несколькими сетевыми интерфейсами.

Очень часто при работе с cURL необходимо сменить свой IP-адрес, чтоб сервис к которому вы подключались думал, что вы заходите с другого места/что вы другой человек. cURL позволяет установить такую опцию:
curl_setopt($ch, CURLOPT_PROXY, "прокси:порт"); 
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "пользователь:пароль");// если необходимо
Так же, если у вас на компьютере несколько подключений к интернету/несколько сетевых интерфейсов, то можно сказать - какой из них использовать, указав его адрес:
curl_setopt($ch, CURLOPT_INTERFACE, $RandIP);


HTTPS запрос(curl and https, ssl)

При работе с зашифрованным соединением веб-клиенты обязательно проверяют - принадлежит ли текущий сертификат этому
сайту или нет. Это сделано для того, чтоб исключить возможность доверия поддельному сайту. За подробностями можно сходить на википедию:

 http://ru.wikipedia.org/wiki/HTTPS
Что касается нашей библиотеки cURL, то при работе по защищенному соединению она ведет себя так же. Проблема однако в том, что изначальная установка cURL не имеет никаких сертификатов, и соответственно не может проверить ни одного сайта и поэтому не хочет работать по защищенному соединению. Решения проблемы есть два:
  • быстрое
  • правильное

Суть быстрого решения состоит в отключении проверки сертификатов. Все что надо сделать, это добавить две дополнительных опции в cURL:
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

Суть правильного решения состоит в том, чтоб добавить сертификат сайта, с которым работаешь, в локальное хранилище сертификатов и указать cURLу путь к нему. И тут опять же есть два решения. Можно просто скачать все известные на сайте cURL корневые сертификаты: 
http://curl.haxx.se/ca/cacert.pem
Или зайти на нужный нам сайт через браузер firefox, и через меню на замочке возле адресной строки скачать цепочку сертификатов X.509. Файл будет в формате .crt , но его структура точно такая же как и в предыдущего файла с сайта cURL.
Итак, у нас есть файл с сертификатами.
Дальше нужно настроить cURL:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, getcwd() ."/ffchainvk.crt"); //  ok, абсолютный путь
где ffchainvk.crt - наш файл с сертификатами

В качестве тестового адреса возьмем адрес АПИ Вконтакте, например этот: https://api.vk.com/method/getProfiles?uids=5216087
И вот код, который работает с этим сайтом:
http://pastebin.com/w8WnkDDh
Инструкция в картинках, как получить цепочку сертификатов: http://unitstep.net/blog/2009/05/05/using-curl-in-php-to-access-https-ssltls-protected-sites/
А вот файл с цепочкой сертификатов от вконтакте(если вы не смогли получить его сами):
https://sites.google.com/site/modernskyangel/some-solutions/php/curl-cookie/ffchainvk.crt?attredirects=0&d=1

Описание опций cURL(curl options)

cURL позволяет делать очень много чего. Все настраивается через опции. Посмотреть полный список опций можно например на официальном сайте:
http://php.net/manual/ru/function.curl-setopt.php




ċ
ffchainvk.crt
(5k)
Vasyl Khrystiuk,
25 Feb 2013, 21:06
ċ
for_curl.7z
(606k)
Vasyl Khrystiuk,
24 Feb 2013, 12:22
Comments