Мне нужно создать инструмент, который будет публиковать форму входа в ASP.NET с помощью PHP, чтобы я мог собирать детали с общей страницы пользователя, отображаемой после входа в систему.
Поскольку сайт использует ASP.NET, и у формы есть скрытые поля __VIEWSTATE и __EVENTVALIDATION, как я понимаю, я должен сначала получить эти значения, а затем отправить их в POST в форму для входа, чтобы это работало.
Я новичок в PHP. Созданный мной скрипт должен сделать следующее:
1) Получите регистрационную форму и возьмите __VIEWSTATE и __EVENTVALIDATION
2) POST в форму для входа с соответствующими данными сообщения.
3) Получите страницу summary.htm, которая должна быть доступна теперь, когда я аутентифицирован.
То, что на самом деле происходит, для меня непонятно. После POSTing в форму входа я получаю файл cookie, но не могу определить, подтвердил ли этот файл cookie, что я аутентифицирован. Когда я пытаюсь получить страницу summary.htm, я перенаправляюсь обратно на страницу входа, как будто я не аутентифицирован.
Я новичок в PHP, и я надеюсь, что кто-то из тех, кто с ним связан, может увидеть что-то очевидное, что мне не хватает.
Вот код:
<?php require_once ("Includes/simple_html_dom.php"); ini_set('display_errors', 'On'); error_reporting(E_ALL); // Create curl connection $url = 'https://www.mysite.com/account/login.htm'; $cookieFile = 'cookie.txt'; $ch = curl_init(); // We must request the login page and get the ViewState and EventValidation hidden values // and pass those along in the post request. curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setOpt($ch, CURLOPT_REFERER, 'https://www.mysite.com/account/login.htm'); curl_setopt($ch, CURLOPT_HTTPHEADER,array('Origin: https://www.mysite.com', 'Host: www.mysite.com')); $curl_scraped_page = curl_exec($ch); // Grab ViewState and EventValidation data $html = str_get_html($curl_scraped_page); $viewState = $html->find("#__VIEWSTATE", 0); $eventValidation = $html->find("#__EVENTVALIDATION", 0); $previousPage = $html->find("#__PREVIOUSPAGE", 0); //create array of data to be posted // This matches exactly what I am seeing being posted when looking at Fiddler $post_data['__EVENTTARGET'] = ''; $post_data['__EVENTARGUMENT'] = ''; $post_data['__VIEWSTATE'] = $viewState->value; $post_data['__EVENTVALIDATION'] = $eventValidation->value; $post_data['__PREVIOUSPAGE'] = $previousPage->value; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$LoginFields$txtUsername'] = 'bsmith'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$LoginFields$txtPassword'] = 'Weez442'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$LoginFields$chkLoginPersist'] = 'on'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$btnLogin'] = 'Login >'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateTopHeader$IncludeHeader$LoginModal$LoginFields$txtModalUsername'] = ''; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateTopHeader$IncludeHeader$LoginModal$LoginFields$txtModalPassword'] = ''; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateTopHeader$IncludeHeader$SearchForm$inputText'] = ''; //traverse array and prepare data for posting (key1=value1) foreach ( $post_data as $key => $value) { $post_items[] = rawurlencode($key) . '=' . rawurlencode($value); } //create the final string to be posted using implode() $post_string = implode ('&', $post_items); //Set options for post curl_setOpt($ch, CURLOPT_POST, TRUE); curl_setopt($ch,CURLOPT_HTTPHEADER,array('Origin: https://www.mysite.com', 'Host: www.mysite.com', 'Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setOpt($ch, CURLOPT_REFERER, 'https://www.mysite.com/account/login.htm'); // Perform our post request $curl_scraped_page = curl_exec($ch); echo $curl_scraped_page; // Now get our account summary page $urlAcctSummary = "https://www.mysite.com/my-account/summary.htm"; //Set options curl_setOpt($ch, CURLOPT_HTTPGET, TRUE); curl_setOpt($ch, CURLOPT_POST, FALSE); curl_setopt($ch, CURLOPT_URL, $urlAcctSummary); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); $curl_scraped_page = curl_exec($ch); echo $curl_scraped_page; curl_close($ch); ?>
Я понял. Я изменил код несколькими способами, но я считаю, что корень моей проблемы состоял в том, что ASP.NET хочет установить cookie сеанса с самого первого запроса GET, и я только указал CURLOPT_COOKIEJAR на запрос POST и CURLOPT_COOKIEFILE в окончательном запросе GET ,
Как только я положил CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE в самом первом запросе GET, он работал как запроектированный.
Вот как выглядит мой код после перемещения вокруг:
<?php require_once ("Includes/simple_html_dom.php"); ini_set('display_errors', 'On'); error_reporting(E_ALL); // Create curl connection $url = 'https://www.mysite.com/account/login.htm'; $cookieFile = 'cookie.txt'; $ch = curl_init(); // We must request the login page and get the ViewState and EventValidation hidden values // and pass those along in the post request. curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setOpt($ch, CURLOPT_REFERER, 'https://www.mysite.com/account/login.htm'); curl_setopt($ch, CURLOPT_HTTPHEADER,array('Origin: https://www.mysite.com', 'Host: www.mysite.com')); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); $curl_scraped_page = curl_exec($ch); // Grab ViewState and EventValidation data $html = str_get_html($curl_scraped_page); $viewState = $html->find("#__VIEWSTATE", 0); $eventValidation = $html->find("#__EVENTVALIDATION", 0); $previousPage = $html->find("#__PREVIOUSPAGE", 0); //create array of data to be posted // This matches exactly what I am seeing being posted when looking at Fiddler $post_data['__EVENTTARGET'] = ''; $post_data['__EVENTARGUMENT'] = ''; $post_data['__VIEWSTATE'] = $viewState->value; $post_data['__EVENTVALIDATION'] = $eventValidation->value; $post_data['__PREVIOUSPAGE'] = $previousPage->value; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$LoginFields$txtUsername'] = 'bsmith'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$LoginFields$txtPassword'] = 'Weez442'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$LoginFields$chkLoginPersist'] = 'on'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateContent$MyAccountLogin967$btnLogin'] = 'Login >'; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateTopHeader$IncludeHeader$LoginModal$LoginFields$txtModalUsername'] = ''; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateTopHeader$IncludeHeader$LoginModal$LoginFields$txtModalPassword'] = ''; $post_data['ctl00$ctl00$cphMasterBody$cphPageTemplateTopHeader$IncludeHeader$SearchForm$inputText'] = ''; //traverse array and prepare data for posting (key1=value1) foreach ( $post_data as $key => $value) { $post_items[] = rawurlencode($key) . '=' . rawurlencode($value); } //create the final string to be posted using implode() $post_string = implode ('&', $post_items); //Set options for post curl_setOpt($ch, CURLOPT_POST, TRUE); curl_setopt($ch,CURLOPT_HTTPHEADER,array('Origin: https://www.mysite.com', 'Host: www.mysite.com', 'Content-Type: application/x-www-form-urlencoded')); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string); curl_setopt($ch, CURLOPT_URL, $url); curl_setOpt($ch, CURLOPT_REFERER, 'https://www.mysite.com/account/login.htm'); // Perform our post request $curl_scraped_page = curl_exec($ch); echo $curl_scraped_page; // Now get our account summary page $urlAcctSummary = "https://www.mysite.com/my-account/summary.htm"; //Set options curl_setOpt($ch, CURLOPT_HTTPGET, TRUE); curl_setOpt($ch, CURLOPT_POST, FALSE); curl_setopt($ch, CURLOPT_URL, $urlAcctSummary); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); $curl_scraped_page = curl_exec($ch); echo $curl_scraped_page; curl_close($ch); ?>