Curl https login

2019-09-18 09:47发布

I'm trying to login to https://www.reporo.com/login.php using Curl. Here is code I'm using:

  <?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)


?>

After using script it redirects me to http://best-payroll-services.info/adder/login.php . Where is the problem ?

After var_dump(curl_getinfo($c)) I've got:

'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)

Greetings.

标签: php curl
3条回答
可以哭但决不认输i
2楼-- · 2019-09-18 10:15

There are a couple of things that are wrong with this script.

  • You need to change the relative path of cookies:

    if ( file_exists( 'cookies.txt' ) )
    

    to an absolute

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

    so that you're sure it's checking the right file.

  • Also str_replace( '/', '', $_SERVER[ "PHP_SELF" ] ); is a return function. That means you need to store the returned value:

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

I've slightly modified your code to this:

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 );

}
查看更多
3楼-- · 2019-09-18 10:16

Here's a script I wrote to login to the Reporo site and download the overall advertiser stats for a particular date (specified in the url). I'm pretty sure this is what you're looking for.

// 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);
查看更多
太酷不给撩
4楼-- · 2019-09-18 10:20

I'm assuming that the website it redirects to belongs to you, because the only thing in that code that redirects is the following line:

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

I'm guessing the problem is with:

if ( file_exists( 'cookies.txt' ) )

That file doesn't appear to exist, which is why it's running:

connect( 'https://www.reporo.com/login.php', $post_string );
str_replace( '/', '', $_SERVER[ "PHP_SELF" ] );
header( 'Location: '.$_SERVER[ "PHP_SELF" ] );
查看更多
登录 后发表回答