PHP cURL работает с идентификатором сеанса, но он не работает с cookiejar

#php #session #curl #cookies

#php #сессия #curl #файлы cookie

Вопрос:

Я пытался получить некоторые данные страницы с этого веб-сайта с помощью cURL. Страница находится за авторизацией, с использованием файлов cookie, без SSL.
Я просмотрел множество руководств и примеров по настройке скрипта php cURL, но, похоже, ни один из них не работал.

Каждый раз, когда я запускаю свой скрипт, файл cookie обновляется, но в результате я получаю пустую строку. Если я установлю CURLOPT_FOLLOWLOCATION равным 1, я получу страницу входа в систему в результате. Итак, я предполагаю, что оригинальный скрипт возвращает перенаправление обратно на страницу входа.
Я пытался возиться с CURLOPT_USERAGENT, CURLOPT_REFERER , но это не помогло.

Кроме того, если я вручную установлю CURLOPT_COOKIE, PHPSESSID (из реального сеанса входа в систему с использованием браузера и пользовательского ввода), он работает нормально.

Итак, вот мой код:

 <?php
set_time_limit(10);
define('USERNAME', 'username');
define('PASSWORD', 'password');
define('USER_AGENT', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36');
define('COOKIE_FILE', 'cookie.txt');
define('LOGIN_FORM_URL', 'http://website/auth');
define('LOGIN_ACTION_URL', 'http://website/distribution/index');
$postValues = array(
    'login_msisdn' => USERNAME,
    'password' => PASSWORD
);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, LOGIN_FORM_URL);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($postValues));
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_COOKIEJAR, realpath(COOKIE_FILE));
//curl_setopt($curl, CURLOPT_COOKIE, "PHPSESSID=relkdrgg94gfdgfg834g");
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_REFERER, LOGIN_FORM_URL);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
curl_exec($curl);
if(curl_errno($curl)){
    throw new Exception(curl_error($curl));
}
curl_close($curl);

$curl = curl_init()
curl_setopt($curl, CURLOPT_URL, LOGIN_ACTION_URL);
curl_setopt($curl, CURLOPT_COOKIEFILE, realpath(COOKIE_FILE));
curl_setopt($curl, CURLOPT_USERAGENT, USER_AGENT);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$html = curl_exec($curl);
echo $html;
  

Ответ №1:

Вы только сохраняете cookie (используя CURLOPT_COOKIEJAR ) из вашего первого вызова curl, но не загружаете во время вашего второго вызова curl. Вот почему cookie-файлы не используются во время второго вызова. Используйте следующее для вашего второго вызова curl.

 curl_setopt($curl, CURLOPT_COOKIEFILE, realpath(COOKIE_FILE));
  

Во-вторых, вы должны закрыть свою команду curl и инициализировать ее снова, прежде чем отправлять второй запрос curl. Опция curl CURLOPT_COOKIEJAR помогает сохранить cookie в файле, но делает это, когда дескриптор curl закрыт.

 curl_close($curl);
$curl = curl_init();
// here goes the second one
curl_setopt($curl, CURLOPT_URL, LOGIN_ACTION_URL);
  

Также, как предлагается в комментарии (который я пропустил), включите опцию CURLOPT_RETURNTRANSFER , чтобы curl возвращал выходные данные.

 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  

Еще одно замечание, пожалуйста, используйте полный путь к файлу cookie. В противном случае он может не работать при запуске из браузера (также убедитесь, что у вас есть разрешение на запись в файл cookie).

 define('COOKIE_FILE', '/some/directory/cookie.txt');
  

Комментарии:

1. Спасибо за предложения, я исправил свой код, но теперь он возвращает 1 вместо страницы. Если добавить curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); ко второму вызову, он возвращает страницу аутентификации.

2. Чтобы уточнить, это ничего не изменило в результате.

3. CURLOPT_RETURNTRANSFER не задан при втором вызове

4. Добавлен и исправлен мой пост, но он по-прежнему возвращает пустую страницу.

5. @Maksim. Пожалуйста, используйте полный путь для файла cookie. Я также обновил свой ответ. define('COOKIE_FILE', '/some/directory/cookie.txt');

Ответ №2:

Для сохранения и использования файла cookie с помощью CURL я использую этот код:

 $ckfile = tempnam('/tmp', 'CURLCOOKIE');
curl_setopt($curl, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($curl, CURLOPT_COOKIEFILE, $ckfile);
  

Ответ №3:

 /*
    1) Make first request in main page and after do the login
    2) I added some headers
    3) Check if are all parameters in post ( ex: "amp;login=Submit" )
    4) If is basic authorization use curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
    5) Debug header/ errors ...
*/

$url1 = "http://website/";
$url2 = "http://website/auth";
$url3 = "http://website/distribution/index";

$user = "username";
$pass = "password";

$post = "user=".$user."amp;pass=".$pass;


get_url($url1,'',$url1);

$login = get_url($url2,$post,$url1);

$data = get_url($url3,'',$url1);

print_r($data);



function get_url($url,$post,$refer) {
    $ssl = substr(strtolower($url),0,8)=='https://' ? true : false;
    $cookie = getcwd().DIRECTORY_SEPARATOR.'cookie.txt';
    $header[0] = "text/xml,application/xml,application/xhtml xml,";
    $header[0] .= "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
    $header[] = "Cache-Control: max-age=0";
    $header[] = "Connection: keep-alive";
    $header[] = "Keep-Alive: 300";
    $header[] = "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7";
    $header[] = "Accept-Language: en-us,en;q=0.5";
    $header[] = "Pragma: ";
    $agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36";
    $refer = !empty($refer) ? $refer : "http://www.google.com/";
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_USERAGENT, $agent);
    if( !empty($post) ) {
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
    }
    if( $ssl ) {
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    }
    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
    curl_setopt($curl, CURLOPT_REFERER, $refer);
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($curl, CURLOPT_AUTOREFERER, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_TIMEOUT,60);

    $html = curl_exec($curl);
    $info = curl_getinfo($curl);
    $error = '';
    if( $html === false ) {
        $error = 'Curl error: ' . curl_error($curl);
    }               
    curl_close($curl);
    $arr = array();
    $arr['html'] = $html;
    $arr['info'] = $info;
    $arr['error'] = $error;
    return $arr;    

}