#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;
}