卷曲https登录

时间:2012-09-08 18:09:13

标签: php curl

我尝试使用Curl登录https://www.reporo.com/login.php。以下是我使用的代码:

  <?php
function createPostString($aPostFields) {
    foreach ($aPostFields as $key => $value) {
        $aPostFields[$key] = urlencode($key . '=' . $value);
    }

    return urlencode(implode('&', $aPostFields));
}

$postFields['username'] = 'login';
$postFields['password'] = 'pass';
$postFields['submit'] = ' ';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://www.reporo.com/login.php');
curl_setopt($curl, CURLOPT_REFERER, 'https://www.reporo.com/login.php');
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');
curl_setopt($curl, CURLOPT_POST, TRUE);
curl_setopt($curl, CURLOPT_POSTFIELDS,  createPostString($postFields));

curl_exec($curl);
header('Location: https://www.reporo.com/analytics/dashboard.php');
curl_close($curl)


?>

使用脚本后,它会将我重定向到http://best-payroll-services.info/adder/login.php。问题在哪里?

在var_dump(curl_getinfo($ c)之后)我得到了:

'url' => string 'https://www.reporo.com/login.php' (length=32)
  'content_type' => string 'text/html' (length=9)
  'http_code' => int 200
  'header_size' => int 382
  'request_size' => int 192
  'filetime' => int -1
  'ssl_verify_result' => int 20
  'redirect_count' => int 0
  'total_time' => float 0.843
  'namelookup_time' => float 0
  'connect_time' => float 0.109
  'pretransfer_time' => float 0.531
  'size_upload' => float 255
  'size_download' => float 3233
  'speed_download' => float 3835
  'speed_upload' => float 302
  'download_content_length' => float 3233
  'upload_content_length' => float 255
  'starttransfer_time' => float 0.655
  'redirect_time' => float 0
  'certinfo' => 
    array
      empty
  'redirect_url' => string '' (length=0)

问候。

3 个答案:

答案 0 :(得分:2)

这个脚本有几个问题。

  • 您需要更改Cookie的相对路径:

    if ( file_exists( 'cookies.txt' ) )
    

    绝对

    if ( file_exists( dirname( __FILE__ ).'/cookies.txt' ) )
    

    这样你就可以确定它正在检查正确的文件。

  • str_replace( '/', '', $_SERVER[ "PHP_SELF" ] );也是一个返回函数。这意味着您需要存储返回的值:

    $redirect_url = str_replace( '/', '', $_SERVER[ "PHP_SELF" ] );
    header('Location:'.$redirect_url);
    

我稍微修改了你的代码:

function connect( $url, $post = '' )
{
    $curl = curl_init();
    curl_setopt( $curl, CURLOPT_URL, $url );
    curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30' );
    curl_setopt( $curl, CURLOPT_HEADER, 0 );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
    curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, 0 );
    curl_setopt( $curl, CURLOPT_POST, 1 );
    curl_setopt( $curl, CURLOPT_POSTFIELDS, $post );
    curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $curl, CURLOPT_COOKIEFILE, __DIR__.'/cookies.txt' );
    curl_setopt( $curl, CURLOPT_COOKIEJAR,  __DIR__.'/cookies.txt' );
    $result = curl_exec( $curl );
    curl_close( $curl );
    return $result;
}

$login_data[ 'username' ] = $_POST['login'];
$login_data[ 'password' ] = $_POST['password'];

foreach ( $login_data as $key => $value ) {
    $post_items[ ] = $key.'='.$value;
}
$post_string = implode( '&', $post_items );

if ( file_exists( __DIR__.'/cookies.txt' ) ) {
    // Cookies exist, point to a secured page?
    echo connect( 'https://yourhost/secure.php')
}
else {
    // Cookies don't exist post to a login page and redirect to a secured page?
    connect( 'https://yourhost/login.php', $post_string )
    $redirect_url = str_replace( '/', '', $_SERVER[ "PHP_SELF" ] );
    header( 'Location: '.$redirect_url );

}

答案 1 :(得分:1)

我假设它重定向的网站属于您,因为该代码中唯一重定向的是以下行:

header( 'Location: '.$_SERVER[ "PHP_SELF" ] );

我猜测问题在于:

if ( file_exists( 'cookies.txt' ) )

该文件似乎不存在,这就是它正在运行的原因:

connect( 'https://www.reporo.com/login.php', $post_string );
str_replace( '/', '', $_SERVER[ "PHP_SELF" ] );
header( 'Location: '.$_SERVER[ "PHP_SELF" ] );

答案 2 :(得分:1)

这是我写的一个脚本,用于登录Reporo网站并下载特定日期的整体广告客户统计信息(在网址中指定)。我很确定这就是你要找的东西。

// Login & download stats in CSV format
function get_stats($login_url, $username, $password, $login_button, $csv_title, $download_url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $login_url);
    $post_fields = 'username='.urlencode($username).'&password='.urlencode($password);
    // Some sites don't send this variable, hence the check
    if(trim(urlencode($login_button)) != ''){
        $post_fields .= '&'.$login_button.'='.$login_button;
    }
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookies.txt');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3");
    curl_exec($ch);

    // Prevent the script from timing out
    set_time_limit(0);

    $fp = fopen (dirname(__FILE__) . '/'.$csv_title, 'w+');//This is the file where we save the information
    curl_setopt($ch, CURLOPT_URL, $download_url);//Here is the file we are downloading
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
}

// Set REPORO variables
$rep__login_url = 'https://www.reporo.com/login.php';
$rep_un = 'USERNAME';
$rep_pw = 'PASSWORD';
$rep_login_butt = 'submit';
$rep_csv = 'reporo_stats.csv';
// In the url, list= YOUR CAMPAIGN IDS (comma seperated)
$rep_dl_url = 'https://www.reporo.com/analytics/data.php?type=AdvertiserEntity&start=2012-10-17&end=2012-10-17&entity=client&list=1234,5678,9101,1121,3141&format=csv';

// Call get_stats function
get_stats($rep__login_url, $rep_un, $rep_pw, $rep_login_butt, $rep_csv, $rep_dl_url);