Я пытался войти в мобильный сайт barnesandnoble.com с завитом и до сих пор не повезло. Я возвращаю страницу без ошибок, и по умолчанию моя электронная почта в поле формы ввода электронной почты страницы входа снова (в форме, возвращенной из результата print $).
Тот же код может позволить мне правильно войти в ebay, изменив LOGINURL, чтобы указать на вход ebay
Единственная разница в том, что barnesandnobles – это https: // и ebay login был http: //
Кроме того, я считаю, что сайт barnes – asp / aspx, поэтому я не знаю, как это будет обрабатывать файлы cookie и _state по-разному
Любая помощь будет оценена по мере того, как я пытался отлаживать это в течение прошлых 16 часов
также, мой файл cookie.txt доступен для записи и работы
<?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 . "&emailAddress=YOUREMAILHERE@gmail.com&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; ?>
Вот рабочий пример, который я создал из вашего кода. Это использует функцию getFormFields
которую я написал для аналогичного вопроса (первая ссылка внизу этого сообщения), которая входит в рынок Android.
Я думаю, что в вашем скрипте, возможно, было несколько вещей, которые мешали работе входа. Во-первых, вы должны urlencode URL-параметры, такие как электронная почта и пароль в строке сообщения (cURL не сделает этого для вас). Во-вторых, я думаю, что значение x
используемое как часть URL-адреса входа, может потребоваться.
Вот решение, которое успешно входит в систему. Заметьте, я снова использовал оригинальную ручку cURL. Это необязательно, но если вы укажете keep-alive, он фактически повторно использует одно и то же соединение, и это также избавит вас от необходимости указывать одни и те же параметры снова и снова.
После того, как у вас есть файлы cookie, вы можете создать новый объект cURL и указать COOKIEFILE и COOKIEJAR, и вы войдете в систему без выполнения первых шагов.
<?php // options $EMAIL = 'you@yoursite.com'; $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, который может помочь узнать: