2014-11-14 3 views
0

Я бил головой об этом. Я пытаюсь войти на страницу и использовать php и curl, но имею две проблемы, и я подозреваю, что они связаны.php curl: вернуться на страницу входа

  1. файлы Cookie остаются пустыми

  2. После попытки войти в страницу возвращается на страницу входа в систему с ошибкой (вероятно, из-за неудачного входа в систему?): Войти превышено время.

Сначала я перейти на страницу, чтобы извлечь время чувствительную переменную:

// $ urlString = "https://domain.com/portal/gas.nsf/Tool

OpenAgent&action=TNQuery&ordernumber=".$order."&tn=".$tn."&User=".$username."&lang=en_US"; 
    $loginUrl = 'https://domain.com/login'; 
    $randnum = rand(5, 15); 
    $ckfile = tempnam ($cwd, "cookie.txt"); 



$ch = curl_init($loginUrl); 

curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); //write 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); 

$result = curl_exec ($ch); 
curl_close($ch); 
//var_dump($result); 

$dom = new DOMDocument(); 
@$dom->loadHTML($result); 
$xml = simplexml_import_dom($dom); 

// extract time sensitive variable from the login page 
$genData = $xml->xpath("//input[@name='pageGenTime']"); 
$epoch = $genData[0][value]; 

данных к сообщению:

$postdata = array(
    'HiddenURI' => 'https://domain.com/loadPortal.htm', 
    'AUTHMETHOD' => 'UserPassword', 
    'pageGenTime' => $epoch, 
    'LOCALE' => "en_US", 
    'usr_name' => $username, 
    'usr_password' => $password 
); 

cURL-обработчики:

$ch = curl_init(); 
// Now login to the portal 
curl_setopt_array($ch, array(
    CURLOPT_URL => $loginUrl, 
    CURLOPT_USERAGENT => $agent, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => $postdata, 
    CURLOPT_FOLLOWLOCATION => true, 
    CURLOPT_COOKIESESSION => true, 
    CURLOPT_COOKIEFILE => 'cookie.txt', 
    CURLOPT_COOKIEJAR => 'cookie.txt' 
)); 
curl_exec($ch); 

$exec = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close ($ch); 

print_r возвращается:

Array 
(
    [url] => https://domain.com/login 
    [content_type] => text/html;charset=iso-8859-1 
    [http_code] => 200 
    [header_size] => 253 
    [request_size] => 304 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 0.08823 
    [namelookup_time] => 2.7E-5 
    [connect_time] => 3.1E-5 
    [pretransfer_time] => 8.0E-5 
    [size_upload] => 744 
    [size_download] => 9992 
    [speed_download] => 113249 
    [speed_upload] => 8432 
    [download_content_length] => 9992 
    [upload_content_length] => 744 
    [starttransfer_time] => 0.026516 
    [redirect_time] => 0 
    [certinfo] => Array 
     (
     ) 

    [primary_ip] => 206.47.249.9 
    [primary_port] => 443 
    [local_ip] => [concealed] 
    [local_port] => 41349 
    [redirect_url] => 
) 

Великий, код 200 HTTP .. но это на самом деле не авторизованы Что я делаю не так.? данные POST верны.

Благодарим вас за ценное время!

+0

Трудно сказать, не зная, какой полный ответ API. Просто потому, что вы получаете 200, это не означает, что вызов API преуспел (если это плохо разработанный API, который не модифицирует коды ответов). –

+0

Как получить полный ответ? Приведенный выше код возвращает страницу входа в html. Есть ли способ получить информацию, которую мы ищем @MikeBrant? – Shampie

+0

Я имею в виду, например, что вы получаете от 'var_dump ($ exec)'? Что говорит вам сам API-ответ? –

ответ

0

Выяснено, что это были файлы cookie, которые ему не понравились: CURLOPT_COOKIEFILE => 'cookie.txt', CURLOPT_COOKIEJAR => 'cookie.txt' изменен на CURLOPT_COOKIEJAR => $randnum.'cookie.txt', CURLOPT_COOKIEFILE => $randnum.'cookie.txt'.

Теперь файлы cookie записываются и вход в систему завершен. var_dump ($ exec) действительно обеспечивал дополнительную отладку, в которой я нуждался. Спасибо @ mike-brant!

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