Совместное использование PHP, cURL, протокола HTTPS и Cookie

Данная заметка не претендует на исчерпывающее руководство по PHP, cURL, протоколу HTTPS и Cookie. Если ыы ищете подобного рода информацию, то заходите на официальные сайты или ищите в Google 😉

Просто хотелось показать один из возможных вариантов решения поставленной задачи: необходимо заходить роботом использующим cURL по протоколу HTTPS методом POST, выполнять действия в системе и выходить из системы. Данные о сессии пользователя хранятся в Cookie.

Я не буду вдаваться в подробности и публиковать полное решение, но выложу пример связки PHP + cURL + работа по протоколу HTTPS методом POST, а так же работа с данными Cookie.

Приведу часть примера, которая может решить подобную задачу:

<?php

// вход в систему
// имя хоста, куда будем заходить
$hostname = 'your.seruce.host.com';
// инициализация cURL
$ch = curl_init('https://'.$hostname.'/index.php');
// получать заголовки
curl_setopt($ch, CURLOPT_HEADER, 1);
// если ведется проверка HTTP User-agent, то передаем один из возможных допустимых вариантов:
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3');
// елси проверятся откуда пришел пользователь, то указываем допустимый заголовок HTTP Referer:
curl_setopt($ch, CURLOPT_REFERER, 'https://'.$hostname.'/index.php');
// использовать метод POST
curl_setopt($ch, CURLOPT_POST, 1);
// сохранять информацию Cookie в файл, чтобы потом можно было ее использовать curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
// передаем поля формы curl_setopt($ch, CURLOPT_POSTFIELDS, 'user=your_robot&amp;pass=Your_R0b0t!PassWd1&amp;mod=Login');
// возвращать результат работы
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// не проверять SSL сертификат
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// не проверять Host SSL сертификата
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
// это необходимо, чтобы cURL не высылал заголовок на ожидание
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
// выполнить запрос
curl_exec($ch);
// получить результат работы
$result = curl_multi_getcontent ($ch);
// вывести результат
echo "\n".'Login OK'."\n".'[result ===8&lt;===&gt;'."\n".$result."\n".'&lt;===&gt;8=== result]'."\n";
// закрыть сессию работы с cURL
curl_close($ch);

Вот мы и вошли в систему. ID сессии, которая передается в Cookie храним в файле, который мы передали в параметре CURLOPT_COOKIEJAR. Результат работы: заголовки + тело страницы получаем и выводим из переменной $result. Пока сессия не закончится можем выполнять необходимые действия в системе.

Если вывод будет идти в командную строку Windows, а кодировка системы с которой идет работа: cp1251, то можно воспользоваться спобом описанным в заметке «chcp — изменение кодовой страницы cmd.exe», чтобы видеть вывод в нормальной кодовой странице, а не древнечукотские манскрипты cp866 установленной по-умолчанию в командном интепретаторе.

Для начала хватит. Может быть напишу как-нибудь продолжение (если кому-то это будет интересно). В этом примере отсутсвует обработка возможных ошибок. Ее необходимо добавить в реальный пример. Код примера тупо без разбора не рекомендую использовать. Но если почитать документацию, то можно на основе этого примера решать задачи подобные той, что была описана выше.