Как передать куки вторым запросом в cUrl?

Добрый день!

Задача: через php скрипт получить страницу с удаленного сервера. Для входа на удаленный сервер требуется регистрация.

Решаю задачу с помощью curl

1. выполняю первый запрос, чтобы залогиниться
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,  $q);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $p);

curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"]."/cookies1.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"]."/cookies1.txt");


 $content = curl_exec ($ch);


Запрос выполняется верно, в $content находится нужная мне страница после входа на удаленный сервер

Проблема в следующем: мне нужно выполнить следующий post запрос, но в этой же сессии (т.к. я уже залогинился). Т.е. мне нужно передать куки в следующий запрос.

В первом запросе, файл cookies1.txt сформировался, и там находится значение сессии.
Мне нужно добавить к этому значению еще 3 параметра, и затем их передать в новый запрос. Для начала хочу передать хотя бы то значение сессии, которое получил из первого запроса.

Выполняю точно такой же запрос, но с другим значением полей post запроса
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,  $q);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, true);
 curl_setopt($ch, CURLOPT_POSTFIELDS, $p);

curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER["DOCUMENT_ROOT"]."/cookies1.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, $_SERVER["DOCUMENT_ROOT"]."/cookies1.txt");


 $content = curl_exec ($ch);


Смотрю в firebug, что передается, и вижу, что никаких кук не передавалось во второй запрос.

если пользуюсь оператором setcookie - то все работает.

Вопрос:
1. Почему не передаются куки во второй запрос?
2. Есть ли какая-то функция, чтобы прочитать значения кук из файла, и затем их установить (не хочется изобретать велосипед, я понимаю, что могу прочитать cookies1.txt распарсить его и установить через setcookie)?
  • Вопрос задан
  • 15359 просмотров
Пригласить эксперта
Ответы на вопрос 1
OAPrilepa
@OAPrilepa
Frontend developer
Старый код, логинимся и получаем куки в строку:
// Отправка POST запроса с получением печенек:
function send_post_get_cookie($URL='', $PostData=Array(), $cookie='')
{
    // Отсекаем пустые вызовы:
    if (strlen($URL)<=0) return false;
    // Скопировал строку из FireBug:
    $ua = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 MRA 5.7 (build 03796) Firefox/3.6.13';
    // Инициализация объекта:
    $ch = curl_init($URL);
    // показывать заголовки (в них куки):
    curl_setopt($ch, CURLOPT_HEADER, 1); 
    // не показывать тело страницы (для экономии траффика):
    curl_setopt($ch, CURLOPT_NOBODY, 1); 
    // это чтобы прикинуться браузером:
    curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    // можно ставить еще вот это, если удаленный сервер проверяет:
    // curl_setopt($ch, CURLOPT_REFERER, $URL);
    curl_setopt($ch, CURLOPT_POST, 1);
    // включение полей POST в запрос:
    curl_setopt($ch, CURLOPT_POSTFIELDS, $PostData);
    // если нужны печеньки, установим:
    if (strlen($cookie)>0)
        curl_setopt($ch, CURLOPT_COOKIE, $cookie);
    // тормозим стандартный вывод:
    ob_start();
    // запускаем запрос:
        curl_exec ($ch);
        curl_close ($ch);
        // получаем заголовки в массив:
        $headers = explode("\n", ob_get_contents());
    ob_end_clean();
    // выдираем строку печенек:
    for ($i=0, $cnt=count($headers); $i<$cnt; $i++) 
        if (strpos($headers[$i], 'Set-Cookie:') !== FALSE)
            $cookie .= substr($headers[$i], strpos($headers[$i], 'Set-Cookie:')+strlen('Set-Cookie:')); 
    // и возвращаем результат:
    return $cookie;
}


А потом используем ее в других запросах, к примеру загружаем файл после авторизации:
// Сохранение файла с удаленного хостинга:
function save_get_file($URL='', $cookie='')
{
    if (strlen($URL)<=0) return false;
    $filename = $_SERVER['DOCUMENT_ROOT'].'/upload/tmp/'.date('YmdHis_').rand(99,9999999).'.tmp'; 
    $fp = fopen($filename, 'w');
    if (!$fp)
        return false;
    else
    {
        $ua = 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 MRA 5.7 (build 03796) Firefox/3.6.13';
        $ch = curl_init($URL);
        curl_setopt($ch, CURLOPT_USERAGENT, $ua);
        curl_setopt($ch, CURLOPT_FILE, $fp); // чтобы выгрузить в файл;
        if (strlen($cookie)>0)
            curl_setopt($ch, CURLOPT_COOKIE, $cookie);
        curl_exec ($ch);
        curl_close ($ch);
        return $filename;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы