Я пытаюсь вызвать функцию __doPostback
javascript на странице asp.net из php с помощью curl.
Я узнал, что это можно сделать, отправив запрос на страницу asp.net с соответствующими параметрами.
Так что в кудрях
- Я делаю запрос на получение / просто использую
file_get_contents
для получения начальной страницы.
- Из этого я извлекаю значения для
__VIEWSTATE
и __EVENTVALIDATION
.
Пока все вроде нормально.
Теперь я понимаю, что нам нужно отправить запрос с использованием cURL с __VIEWSTATE
и другими необходимыми параметрами. (значения для полей, представленных в форме asp.net)
Я не могу правильно построить 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
в качестве первого параметра, отображается страница результатов, но другие значения параметров не учитываются.
Я думаю, что есть проблема с тем, как я кодирую параметры.
Подскажите, пожалуйста, как построить параметры для запроса на пост на странице asp.net.
Спасибо.
- Под редакцией -
Вот полный код:
$ 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);<br>
$viewState=getVStateContent($response1);<br>
$eventValidation =getEventValidationContent($response1);<br>
$simpleParams = '&__VIEWSTATE='.$viewState.'&ctl00$ContentPlaceHolder1$ddlManuf=&ctl00$ContentPlaceHolder1$ddlCrossType=&ctl00$ContentPlaceHolder1$ddlPageSize='.$resultsPerPage.'&ctl00$ContentPlaceHolder1$btnSearch=Search&ctl00_ToolkitScriptManager1_HiddenField=&__EVENTTARGET=&__EVENTARGUMENT=';<br>
// Second post - for submitting the search form<br>
$response2= sendCurl($curl_connection,$url,$simpleParams,true);
---- **