Как войти с помощью Curl, SSL и куки

Я пытался зайти на мобильный сайт barnesandnoble.com с помощью curl и до сих пор не повезло. Я вернусь на страницу без ошибок и по умолчанию моя электронная почта снова вводится в поле формы ввода электронной почты на странице входа в систему (в форме, возвращенной из print $ result).

Тот же код на самом деле может позволить мне войти в Ebay правильно изменив LOGINURL, чтобы он указывал на вход в ebay

Единственная разница в том, что Barnesandnobles это https: // и Ebay логин был http: //

Кроме того, я считаю, что веб-сайт Barnes является asp / aspx, поэтому я не знаю как это будет обрабатывать куки и _state по-другому

Любая помощь будет оценена, поскольку я пытался отладить это для последние 16 часов

также мой cookie.txt доступен для записи и работает

<code><?php
    $cookie_file_path = "C:/test/cookie.txt";
    $LOGINURL = "https://cart2.barnesandnoble.com/mobileacct/op.asp?stage=signIn"; 
    $agent = "Nokia-Communicator-WWW-Browser/2.0 (Geos 3.0 Nokia-9000i)";

    $ch = curl_init(); 

    $headers[] = "Accept: */*";
    $headers[] = "Connection: Keep-Alive";
    $headers[] = "Content-type: application/x-www-form-urlencoded;charset=UTF-8";

    curl_setopt($ch, CURLOPT_HTTPHEADER,  $headers);
    curl_setopt($ch, CURLOPT_HEADER,  0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_URL, $LOGINURL);
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);

    $content = curl_exec($ch); 

    curl_close($ch); 

    unset($ch); 

    // NAME="path_state" value="6657403">

    if(stristr($content,"path_state")){
        $array1 = explode('path_state" value="',$content);
        $content1 = $array1[1];
        $array2 = explode('">',$content1);
        $content2 = $array2[0];
    }

    $LOGINURL = "https://cart2.barnesandnoble.com/mobileacct/op.asp?stage=signIn";
    $POSTFIELDS = "d_hidPageStamp=V_3_17&hidViewMode=opSignIn&stage=signIn&previousStage=mainStage&path_state=" .  $content2 . "&[email protected]&acctPassword=YOURPASSWORD";
    $reffer = "https://cart2.barnesandnoble.com/mobileacct/op.asp?stage=signIn"; 

    $ch = curl_init(); 

    $headers[] = "Accept: */*";
    $headers[] = "Connection: Keep-Alive";
    $headers[] = "Content-type: application/x-www-form-urlencoded;charset=UTF-8";

    curl_setopt($ch, CURLOPT_HTTPHEADER,  $headers);
    curl_setopt($ch, CURLOPT_HEADER,  0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   
    curl_setopt($ch, CURLOPT_URL, $LOGINURL); 
    curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt($ch, CURLOPT_REFERER, $reffer); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 

    $result = curl_exec($ch);  

    print $result; 
?>
</code>
 Bruno25 апр. 2012 г., 11:31
Я должен быть осторожен при записи в один и тот же файл cookie из нескольких одновременных запросов.

Ответы на вопрос(1)

Решение Вопроса

который я создал из вашего кода. Это использует функциюgetFormFields что я написал для аналогичного вопроса (первая ссылка внизу этого поста), который входит в рынок Android.

Я думаю, что в вашем скрипте могло быть несколько вещей, которые мешали работе входа в систему. Во-первых, вы должныUrlEncode параметры URL, такие как адрес электронной почты и пароль в строке сообщения (cURL не сделает этого за вас). Во-вторых, я думаю, чтоx Может потребоваться значение, используемое как часть URL-адреса входа

Вот решение, которое успешно входит в систему. Обратите внимание, я повторно использовал оригинальную ручку cURL. В этом нет необходимости, но если вы укажете keep-alive, он фактически будет повторно использовать одно и то же соединение, а также избавит вас от необходимости указывать одни и те же параметры снова и снова.

Когда у вас есть файлы cookie, вы можете создать новый объект cURL и указать COOKIEFILE и COOKIEJAR, и вы войдете в систему, не выполнив первые шаги.

<?php

// options
$EMAIL            = '[email protected]';
$PASSWORD         = 'yourpassword';
$cookie_file_path = "/tmp/cookies.txt";
$LOGINURL         = "https://cart2.barnesandnoble.com/mobileacct/op.asp?stage=signIn"; 
$agent            = "Nokia-Communicator-WWW-Browser/2.0 (Geos 3.0 Nokia-9000i)";


// begin script
$ch = curl_init(); 

// extra headers
$headers[] = "Accept: */*";
$headers[] = "Connection: Keep-Alive";

// basic curl options for all requests
curl_setopt($ch, CURLOPT_HTTPHEADER,  $headers);
curl_setopt($ch, CURLOPT_HEADER,  0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);         
curl_setopt($ch, CURLOPT_USERAGENT, $agent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); 
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); 

// set first URL
curl_setopt($ch, CURLOPT_URL, $LOGINURL);

// execute session to get cookies and required form inputs
$content = curl_exec($ch); 

// grab the hidden inputs from the form required to login
$fields = getFormFields($content);
$fields['emailAddress'] = $EMAIL;
$fields['acctPassword'] = $PASSWORD;

// get x value that is used in the login url
$x = '';
if (preg_match('/op\.asp\?x=(\d+)/i', $content, $match)) {
    $x = $match[1];
}

//$LOGINURL   = "https://cart2.barnesandnoble.com/mobileacct/op.asp?stage=signIn";
  $LOGINURL   = "https://cart2.barnesandnoble.com/mobileacct/op.asp?x=$x";

// set postfields using what we extracted from the form
$POSTFIELDS = http_build_query($fields); 

// change URL to login URL
curl_setopt($ch, CURLOPT_URL, $LOGINURL); 

// set post options
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $POSTFIELDS); 

// perform login
$result = curl_exec($ch);  

print $result; 


function getFormFields($data)
{
    if (preg_match('/(<form action="op.*?<\/form>)/is', $data, $matches)) {
        $inputs = getInputs($matches[1]);

        return $inputs;
    } else {
        die('didnt find login form');
    }
}

function getInputs($form)
{
    $inputs = array();

    $elements = preg_match_all('/(<input[^>]+>)/is', $form, $matches);

    if ($elements > 0) {
        for($i = 0; $i < $elements; $i++) {
            $el = preg_replace('/\s{2,}/', ' ', $matches[1][$i]);

            if (preg_match('/name=(?:["\'])?([^"\'\s]*)/i', $el, $name)) {
                $name  = $name[1];
                $value = '';

                if (preg_match('/value=(?:["\'])?([^"\'\s]*)/i', $el, $value)) {
                    $value = $value[1];
                }

                $inputs[$name] = $value;
            }
        }
    }

    return $inputs;
}

Это сработало для меня, надеюсь, это поможет вам.

Вот еще один ответ cURL, который я могу получить:

Retrieve Android Market mylibrary with curl multiple actions with curl sending xml and headers via curl Login to Google with PHP and Curl, Cookie turned off? Pinterest login with PHP and cURL not working
 25 апр. 2012 г., 04:44
Добро пожаловать, рад, что это помогло.
 17 мая 2013 г., 19:25
Дрю, этот ответ помог мне получить ответ на свой вопрос,stackoverflow.com/questions/16611362/curl-login-into-ebay-co-uk/… Надеюсь, вы не возражаете, но я использовал некоторые из вас. :)
 17 окт. 2013 г., 14:12
Перепробовал несколько других решений, ни одно не сработало. Использовал ваши и наконец получил то, что мне было нужно. Бесконечно благодарен...
 Heather McVay25 апр. 2012 г., 04:23
Спасибо, (высоко ценится), что работал.
 18 мая 2013 г., 03:31
@VitaliyIsikov Совершенно хорошо, рад, что это было полезно! Я вижу, вы даже предоставили очень хороший кредит, поэтому я не могу вас отблагодарить.

Ваш ответ на вопрос