2010-10-26 108 views
2

我正在嘗試學習使用PHP curl,它似乎進展良好,直到我嘗試對changeip.com進行身份驗證爲止。下面是我使用,使捲曲呼叫功能:使用Cookie進行PHP Curl 302身份驗證

function request($ch, $url, $params = array()) 
{ 
    $options   = array 
    (
     CURLOPT_URL     => $url, 
     CURLOPT_USERAGENT   => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8', 
     //CURLOPT_COOKIESESSION  => TRUE, 
     CURLOPT_FOLLOWLOCATION  => TRUE, 
     CURLOPT_HEADER    => TRUE, 
     CURLOPT_RETURNTRANSFER  => TRUE, 
     CURLOPT_SSL_VERIFYPEER  => FALSE, 
     CURLOPT_SSL_VERIFYPEER  => FALSE, 
     CURLINFO_HEADER_OUT   => TRUE, 
     CURLOPT_CONNECTTIMEOUT  => 30, 
     CURLOPT_TIMEOUT    => 30, 
     CURLOPT_MAXREDIRS   => 30, 
     CURLOPT_VERBOSE    => TRUE, 
     CURLOPT_COOKIEJAR   => __DIR__ . DIRECTORY_SEPARATOR . 'cookies.txt', 
     CURLOPT_COOKIEFILE   => __DIR__ . DIRECTORY_SEPARATOR . 'cookies.txt', 
     CURLOPT_HTTPHEADER   => array 
     (
      'Host: www.changeip.com', 
      'Pragma:', 
      'Expect:', 
      'Keep-alive: 115', 
      'Connection: keep-alive', 
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
      'Accept-Language: en-us,en;q=0.5', 
      //'Accept-Encoding: gzip,deflate', 
      'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7', 
      'Content-Type: application/x-www-form-urlencoded', 
     ), 
    ); 

    if(!empty($params['referrer'])) 
    { 
     $options[CURLOPT_REFERER]  = $params['referrer']; 
    } 

    if(!empty($params['post'])) 
    { 
     $options[CURLOPT_POST]   = TRUE; 
     $options[CURLOPT_POSTFIELDS] = $params['post']; 
    } 

    curl_setopt_array($ch, $options); 

    $return    = array(); 
    $return['body']  = curl_exec($ch); 
    $info    = curl_getinfo($ch); 
    //die(var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT))); 
    $return['header'] = http_parse_headers(substr($return['body'], 0, $info['header_size'])); 
    $return['body']  = substr($return['body'], $info['header_size']); 

    /*if(!empty($return['header']['Location'])) 
    { 
     $params['referrer'] = $url; 
     return request($ch, substr($url, 0, strrpos($url, '/')+1) . $return['header']['Location'], $params); 
    }*/ 

    return $return; 
} 

,這裏是實際的呼叫:

// chaneip 
$ch     = curl_init(); 

// login 
$params    = array(); 
$params['post']  = array 
(
    'p' => 'aaaaaa2', 
    'u' => 'aaaaaa2', 
); 

$params['referrer'] = 'https://www.changeip.com/login.asp'; 

$return    = request($ch, 'https://www.changeip.com/loginverify.asp?', $params); 

然而,這個腳本不檢索從changeip.com,即有效的餅乾,並不認證。我試圖比較Curl發送的頭文件與HTTPLiveHeaders希望找到任何區別,但最終我沒有找到任何東西。任何人都可以告訴我什麼是缺少使這項工作?

常見問題: 是cookie.txt 0777?是的,而且腳本實際上建立某種形式的cookie: www.changeip.com FALSE/FALSE 0 ACloginAddrs 6 www.changeip.com FALSE/FALSE 0 ASPSESSIONIDCCSSCQRA DNHKGDICMKHFIJADMAPPMHHC

但它不是一個有效的cookie。

回答

1
$options[CURLOPT_POSTFIELDS] = http_build_query($params['post']); 

修復了這個問題。