2

我正在尝试学习使用 PHP curl,在我尝试向 changeip.com 进行身份验证之前,它似乎进展顺利。这是我用来进行 Curl 调用的函数:

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 检索有效的 cookie,即不会进行身份验证。我试图将 Curl 发送的标头与 HTTPLiveHeaders 进行比较,希望能发现任何差异,但最后我什么也没找到。谁能建议我做这项工作缺少什么?

常见问题:cookie.txt 是 0777 吗?是的,脚本确实创建了某种 cookie: www.changeip.com FALSE / FALSE 0 ACloginAddrs 6 www.changeip.com FALSE / FALSE 0 ASPSESSIONIDCCSSCQRA DNHKGDICMKHFIJADMAPPMHHC

但它不是有效的 cookie。

4

1 回答 1

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

修复了问题。

于 2010-10-26T01:09:15.870 回答