cURL опубликовать данные на странице asp.net - PullRequest
4 голосов
/ 22 марта 2011

Я пытаюсь вызвать функцию __doPostback javascript на странице asp.net из php с помощью curl.

Я узнал, что это можно сделать, отправив запрос на страницу asp.net с соответствующими параметрами.

Так что в кудрях

  1. Я делаю запрос на получение / просто использую file_get_contents для получения начальной страницы.
  2. Из этого я извлекаю значения для __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); ---- **

Ответы [ 2 ]

1 голос
/ 22 марта 2011

То, что вы хотите, это 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 должно быть?

0 голосов
/ 22 марта 2011

Не используйте urlencode () для амперсандов (&), связывающих параметры, только ключи и значения (материал по обе стороны от амперсандов).

...