Я пытаюсь вызвать __doPostback
javascript __doPostback
на странице asp.net с php, используя curl.
Я узнал, что это можно сделать, отправив запрос на страницу asp.net с соответствующими параметрами.
Таким образом,
file_get_contents
для извлечения начальной страницы. __VIEWSTATE
и __EVENTVALIDATION
. Пока все выглядит нормально.
Теперь я понимаю, что нам нужно сделать почтовый запрос с использованием cURL с __VIEWSTATE
и другими необходимыми параметрами. (значения для полей, присутствующих в форме asp.net)
Я не CURLOPT_POSTFIELDS
правильно построить CURLOPT_POSTFIELDS
.
Например, я пробую это,
$postoptions1='__EVENTTARGET='.('ctl00$ContentPlaceHolder1$gRef').'&__EVENTARGUMENT='.('$2'); $postoptions2 = '&__VIEWSTATE='.urlencode($viewState) ; $otherparams = '&ctl00$ContentPlaceHolder1$ddlName=Abc';
И перед использованием setopt для CURLOPT_POSTFIELDS
, я делаю,
urlencode ($postoptions1.$postoptions2.$otherparams)
Это не работает. Представленные результаты не отображаются, что означает, что требуемый параметр __VIEWSTATE
не найден в моем почтовом запросе.
Если я изменил порядок параметров и __VIEWSTATE
в качестве первого параметра, __VIEWSTATE
страница результатов, но другие значения параметров не будут соблюдены.
Я думаю, что есть некоторые проблемы с тем, как я кодирую параметры.
Скажите, пожалуйста, как создать параметры для почтового запроса на странице asp.net.
Благодарю.
–Edited–
Вот полный код: $ resultsPerPage = '10 '; $ url = "www.example.com"; // URL изменен
$ curl_connection = curl_init ($ url); функция sendCurl ($ curl_connection, $ url, $ params, $ isPost = false) {
//$post_string = $params; $post_string = http_build_query($params); //$post_string = build_query_string($params); //$post_string = urlencode($params); echo 'After Encode'.$post_string; $cookie="/cookie.txt"; //set options curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 300); curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl_connection, CURLOPT_HEADER, 0); // don't return headers curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl_connection,CURLOPT_REFERER, $url); if($isPost) { curl_setopt ($curl_connection, CURLOPT_POST, true); //set data to be posted curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); curl_setopt($curl_connection,CURLOPT_COOKIEJAR,$cookie); } else { curl_setopt($curl_connection,CURLOPT_COOKIEFILE,$cookie); } $response1 = curl_exec($curl_connection); if($response1 === false) { echo 'Curl error: ' . curl_error($curl_connection); } else { echo 'Operation completed without any errors'; } return $response1; } **// First time, get request to asp.net page
$response1 = sendCurl($curl_connection,$url,'',false);
—- **
$viewState=getVStateContent($response1);
$eventValidation =getEventValidationContent($response1);
$simpleParams = '&__VIEWSTATE='.$viewState.'&ctl00$ContentPlaceHolder1$ddlManuf=&ctl00$ContentPlaceHolder1$ddlCrossType=&ctl00$ContentPlaceHolder1$ddlPageSize='.$resultsPerPage.'&ctl00$ContentPlaceHolder1$btnSearch=Search&ctl00_ToolkitScriptManager1_HiddenField=&__EVENTTARGET=&__EVENTARGUMENT=';
// Second post - for submitting the search form
$response2= sendCurl($curl_connection,$url,$simpleParams,true);
Вы хотите http_build_query , который будет форматировать массив как надлежащие параметры HTTP.
Изменить : Чтобы выяснить, как это должно выглядеть:
$params = array( '__EVENTTARGET' => 'ctl00$ContentPlaceHolder1$gRef', '__EVENTARGUMENT' => '$2', '__VIEWSTATE' => $viewState, 'ctl00$ContentPlaceHolder1$ddlName' => 'Abc' ); curl_setopt($curlHandler, CURLOPT_POSTFIELDS, http_build_query($params));
Кроме того, что такое ctl00$ContentPlaceHolder1$ddlName
?
Не используйте urlencode () амперсанды (&), связывающие параметры вместе, только клавиши и значения (материал по обе стороны от амперсандов).