cURL – работает в браузере, а не в cURL

Я уже почти три дня борюсь с этой задачей, и, по-моему, мне не хватает некоторых базовых навыков CURL.

Я начинаю с:

В F12 IE я вижу 2 POST на первой странице: (я замечаю, что первый получает 302, который должен быть перенаправлен, а cURL я получаю только 200)

Заполнение captcha:

на второй странице (после переписки):

трафик:

Это мой код (и я не могу двигаться дальше, потому что он не работает на ранних этапах):

Я создал специальную форму, которая отправляется на мою собственную страницу с GET (с cURL), которая, в свою очередь, обращается к веб-сайту:

 $id=$_GET['id']; // getting the biznumber $humanCode=$_GET['nobot']; $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, "https://www.*******.******.***"); // setting some https to be able to access the website from my local computer. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($curl, CURLOPT_CAINFO, "c:/xampp/htdocs/CAcerts/curl-ca-bundle.crt"); // I know the values for the ASPX vars like __EVENTTARGET, __EVENTARGUMENT, __VIEWSTATE are arbitrary now. I need to take care of that but I don't yet know how. $postarr= array ( "__EVENTTARGET"=>"", "__VIEWSTATE=" =>"%2FwEPDwULLTEzMzI2OTg4NDYPZBYCZg9kFgQCBA8PZBYCHgdvbmNsaWNrBQxnb1RvTWl2emFrKClkAgYPD2QWAh8ABQxnb1RvTWl2emFrKClkZM6iZZ0Qaf2CpfXoJJdZ0IqaWsDO", "__EVENTARGUMENT=" =>"", "__EVENTVALIDATION" =>"%2FwEWBQKgysLGCwL2r7SGDQLh4ri%2BAwLWws7NDwLWwpLPD%2F1HuCAFYzs2seaziWbYEXjDfigP", "hidUrlFileIshurim"=>"https%3A%2F, "cod"=>"3322" ); $fields_string=''; foreach($postarr as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string,'&'); curl_setopt($curl, CURLOPT_POST ,1); curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string); curl_setopt($curl, CURLOPT_TIMEOUT, 10); curl_setopt ($curl, CURLOPT_USERAGENT, "User-Agent Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; MAAU)"); // I made a cookie file and it seems to work $cookiefile = "d:/cookie.txt"; curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiefile); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiefile); curl_setopt($curl, CURLOPT_FRESH_CONNECT , 1); curl_setopt($curl, CURLOPT_FOLLOWLOCATION ,1); curl_setopt($curl, CURLOPT_HEADER ,1); // DO NOT RETURN HTTP HEADERS curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $temp=curl_exec($curl); $info = curl_getinfo($curl); $html = mb_convert_encoding($temp, 'HTML-ENTITIES', 'utf-8'); echo "ERRCODE: ".curl_error($curl); echo '<br /><br />'; echo "INFO : "; print_r($info); echo '<br /><br />'; $httpcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); echo "CODE: ".$httpcode; echo '<br /><br />'; echo "CODE: ".$httpcode; echo '<br /><br />'; echo "VARS: ".$vars; echo '<br /><br />'; //echo $html; curl_setopt ($curl, CURLOPT_URL, "https://www.*******.******.***"); curl_setopt($curl, CURLOPT_FRESH_CONNECT , 0); echo "<br /><br /><b>2nd</b><br /><br />"; $temp=curl_exec($curl); $info = curl_getinfo($curl); $html = mb_convert_encoding($temp, 'HTML-ENTITIES', 'utf-8'); echo "ERRCODE: ".curl_error($curl); echo '<br /><br />'; echo "INFO : "; print_r($info); echo '<br /><br />'; echo $html; 

Не получается, чтобы даже начать работать. Он начинается с возвращения мне 200 OK, вместо 302, а иногда и 500.

Я знаю, что ASPX-вары могут иметь решающее значение, но если мой браузер может сделать эти вары и отправить их на сервер, не может ли cURL сделать то же самое?

Спасибо за любую помощь!

Задача решена.
Это вопрос использования правильных заголовков. Следуя отчетам из браузера, я прошел все шаги, и результат появился.

Я прошел каждый шаг, используя:

 curl_init curl_setopt() .. curl_setopt() curl_exec() curl_close() 

Таким образом, мне пришлось вручную установить каждый запрос и пройти настройки. Это сделало код длиннее, но гораздо легче понять.

У меня были мысли о сайте, используя специальный код javascript, чтобы заставить сайт работать, поэтому меня сильно беспокоил весь лишний код javascript, который оказался ненужным.

Все дело в том, чтобы быть более организованным и следовать правильному настройкам заголовка.

Более того, поскольку это был сайт ASPX , мне приходилось читать и запоминать VIEWSTATE и VIEWSTATE последней страницы на каждой итерации. Это первая и очень важная причина для сообщения о внутреннем сервере 500, которое я использовал для получения все время.

Я использовал Firebug и LiveHttpHeaders, чтобы придумать каждый шаг.

«Не могу заставить это даже начать работать. Это начинается с возвращения мне 200 OK, а не 302, а иногда я также получаю 500».

 curl_setopt($curl, CURLOPT_FOLLOWLOCATION ,1); 

У вас есть Curl, чтобы следовать любым перенаправлениям 302. Они будут выполняться внутри внутри Curl и не будут видны PHP.

Также:

 curl_setopt($curl, CURLOPT_HEADER ,1); // DO NOT RETURN HTTP HEADERS 

Комментарий делает точно противоположное тому, что делает код …. что кажется неправильным.

до того, как вы сделали cURL, вам нужно просмотреть поле запроса. обычно HTTP 500 из aspx не найден, поле отправляется ..

 foreach($postarr as $key=>$value) { $fields_string .= $key.'='.$value.'&'; echo" $fields_string <br> "; } 

убедитесь, что это поле не является динамическим, когда ур отправляет запрос .. Надеюсь, что это полезно ..

Я использовал это:

 curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER["HTTP_USER_AGENT"]); 

Он вроде имитирует завиток, так как имеет имя и версию браузера.