2014-01-23 2 views
2

Я пытаюсь войти через curl, и после входа в систему сделайте второй запрос с сгенерированным файлом cookie. Но это не работает, я не вошел. Как я могу сохранить cookie и повторно использовать его?Логин через curl и повторное использование cookie для второго запроса

Вот мой код:

<?php 

// Define the URL and the data you want to send 
$loginUrl = 'https://domain.tld/login.php'; 
$parseUrl = 'https://domain.tld/start.php?page=user'; 
$loginVars = array(
    'username' => 'user', 
    'password' => 'pass' 
); 

// Now we try to login at the page 
$login = curl_init(); 

curl_setopt($login, CURLOPT_URL, $loginUrl); 
curl_setopt($login, CURLOPT_POST, 1); 
curl_setopt($login, CURLOPT_POSTFIELDS, $loginVars); 
curl_setopt($login, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($login, CURLOPT_HEADER, 1); 
curl_setopt($login, CURLOPT_RETURNTRANSFER, 1); 

$loginResponse = curl_exec($login); 

preg_match_all('|Set-Cookie: (.*);|U', $loginResponse, $matches); 
$cookies = implode('; ', $matches[1]); 

// No we download another page while reusing the cookie 

$parse = curl_init(); 

curl_setopt($parse, CURLOPT_URL, $parseUrl); 
curl_setopt($parse, CURLOPT_FOLLOWLOCATION, 0); 
curl_setopt($parse, CURLOPT_HEADER, 1); 
curl_setopt($parse, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($parse, CURLOPT_COOKIE, $cookies); 

$parseResponse = curl_exec($parse); 

// Create a DOMDocument for parsing the HTML 
$dom = new DOMDocument(); 
libxml_use_internal_errors(true); 
$dom->loadHTML($parseResponse); 

// Find the element with an ID of 'username' 
$data = $dom->getElementById("username"); 
echo $data->nodeValue; 

curl_close($login); 
curl_close($parse); 

?> 

Как я могу получить эту работу?

ответ

1

Для обоих ваших запросов на завивки ($parse и $login) используйте следующий параметр curl для установки и получения файла cookie из txt-файла.

$__COOKIE = "c:/var/temp/cookie.txt"; 
curl_setopt($ch, CURLOPT_COOKIEJAR, $__COOKIE); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $__COOKIE); 

Кстати, я принимаю ваш логин правильно.

+0

Я бы предложил использовать [tempnam] (http://us1.php.net/tempnam), чтобы получить новый файл tmp для сеанса. – Xeoncross

4

Это должно сделать работу:

<?php 

//define the cookie file location, make sure cookie.txt has write permissions 
$cookiefile = "/your/path/to/cookie.txt"; 


// Define the URL and the data you want to send 
$loginUrl = 'https://domain.tld/login.php'; 
$parseUrl = 'https://domain.tld/start.php?page=user'; 
$loginVars = array(
    'username' => 'user', 
    'password' => 'pass' 
); 

// Now we try to login at the page 
$login = curl_init(); 

curl_setopt($login, CURLOPT_URL, $loginUrl); 
curl_setopt($login, CURLOPT_POST, 1); 
curl_setopt($login, CURLOPT_POSTFIELDS, http_build_query($loginVars)); 
curl_setopt($login, CURLOPT_COOKIEJAR, $cookiefile); 
curl_setopt($login, CURLOPT_COOKIEFILE, $cookiefile); 
curl_setopt($login, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($login, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($login, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($login, CURLOPT_HEADER, 1); 
curl_setopt($login, CURLOPT_RETURNTRANSFER, 1); 
curl_exec($login); 
curl_close($login); 

// No we download another page while reusing the cookie 

$parse = curl_init(); 

curl_setopt($parse, CURLOPT_URL, $parseUrl); 
curl_setopt($parse, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($parse, CURLOPT_HEADER, 1); 
curl_setopt($parse, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($parse, CURLOPT_COOKIEJAR, $cookiefile); 
curl_setopt($parse, CURLOPT_COOKIEFILE, $cookiefile); 
curl_setopt($parse, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($parse, CURLOPT_SSL_VERIFYHOST, false); 
$parseResponse = curl_exec($parse); 
curl_close($parse); 

// Create a DOMDocument for parsing the HTML 
$dom = new DOMDocument(); 
libxml_use_internal_errors(true); 
$dom->loadHTML($parseResponse); 

// Find the element with an ID of 'username' 
$data = $dom->getElementById("username"); 
echo $data->nodeValue; 

?> 

Примечания:

CURLOPT_COOKIEFILE Имя файла, содержащего данные печенья. Файл cookie может быть в формате Netscape или просто в заголовках HTTP-стиля, сбрасываемых в файл. Если имя является пустой строкой, cookie не загружается, но обработка файлов cookie по-прежнему включена.

CURLOPT_COOKIEJAR Имя файла для сохранения всех внутренних файлов cookie, если ручка закрыта, например. после вызова curl_close.

CURLOPT_SSL_VERIFYPEER FALSE, чтобы остановить cURL от проверки сертификата партнера. Альтернативные сертификаты для проверки могут быть указаны с помощью опции CURLOPT_CAINFO, или каталог сертификата может быть указан с помощью опции CURLOPT_CAPATH.

CURLOPT_SSL_VERIFYHOST 1 проверить наличие общего имени в сертификате SSL-партнера. 2, чтобы проверить наличие общего имени, а также убедиться, что он соответствует указанному имени хоста. В производственных средах значение этой опции должно быть равно 2 (значение по умолчанию).

+0

Привет, Tuga, большое вам спасибо за ваше решение. Я думаю, что у вас есть ошибка в строках 41 и 42. Он должен быть $ parse вместо $ login, верно? Но скрипт не работает. : -/Он говорит: « Примечание: попытка получить свойство не-объекта в /Applications/MAMP/htdocs/scripts/test.php в строке 53« Что означает, что завиток не находится в URL-адресе анализа, потому что этот div является только на этой странице. Есть ли способ отладить его, чтобы узнать, что происходит и какой url curl пытается разобрать? Форма POST использует логику POST/REDIRECT/GET. Это может быть проблема? – emjay

+0

@emjay Да, это была ошибка, я обновил ответ, и теперь он должен работать плавно, попробуйте сейчас. –

+0

Нет, это не работает -.- В нем говорится: «Обратите внимание: попытка получить свойство не-объекта в /Applications/MAMP/htdocs/scripts/test.php в строке 53« Что означает, что завиток не находится в URL-адресе анализа , потому что этот div находится только на этой странице. Есть ли способ отладить его, чтобы узнать, что происходит и какой url curl пытается разобрать? Форма POST использует логику POST/REDIRECT/GET. Это может быть проблема? – emjay

Смежные вопросы