Делаем следующие действия. Заходим на страницу, парсим все необходимое для POST запроса. Во время передачи запроса возвращает ту же самую страницу, ни ошибок нифига вообще. непонятно как-то. может дело в том что нужно сохранить сертификат, а потом его подставить. Но в нете нашел только как сUrlом подставлять. Да и вообще может быть дело именно в этом. Может ли вообще при отправке запроса пост сайт проверять собственный сертификат. Или ошибка скорее в другом. Выкладую код полностью. Использовал дополнительно библиотеку для парсинга phpQuery.php. Думаю есть у каждого. Код (PHP): <?php require 'simple_html_dom.php'; require ('phpQuery/phpQuery.php'); $url='https://petitions.whitehouse.gov/register?destination=user/register'; $agent = 'Opera/9.62 (Windows NT 6.0; U; ru) Presto/2.1.1'; $ch = curl_init(); //инициализация библиотеки // не проверять SSL сертификат curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // не проверять Host SSL сертификата curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_URL,$url); //указываем заголовок User-Agent curl_setopt($ch, CURLOPT_USERAGENT, $agent); //т.е. нужно указать адрес страницы на которой находится форма curl_setopt($ch, CURLOPT_REFERER, $url); //указываем, что полученная страница должна быть сохранена в переменную curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //указываем, что cURL должен переходить по редиректам curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0); //создаем файл для cookies $cook = tempnam('cook', 'cookie_'); curl_setopt($ch, CURLOPT_COOKIEFILE, $cook); curl_setopt($ch, CURLOPT_COOKIEJAR, $cook); //выполняем запрос $page = curl_exec($ch); curl_errno($ch)==0 or die("Error:".curl_errno($ch)." ".curl_error($ch)); curl_close($ch); $x=array(); /////////////php Qurey////////////////Parser $html = str_get_html($page); $document=phpQuery::newDocument($html); $label=$document->find('label[for=edit-captcha-response]'); $end=strpos($label,'<span'); echo $captcha = substr($label, 35,$end-35); $x['form_build_id']=$document->find('input[name=form_build_id]')->attr('value'); $x['captcha_sid']=$document->find('input[name=captcha_sid]')->attr('value'); $x['captcha_token']=$document->find('input[name=captcha_token]')->attr('value'); /////////////// $x['mail']='sience2013@gmail.com'; $x['profile_main[field_first_name][und][0][value]']='Roma'; $x['profile_main[field_last_name][und][0][value]']='Rom'; $x['profile_main[field_city]']=''; $x['profile_main[field_state]']=''; $x['profile_main[field_zip][und][0][value]']=''; $x['field_origin[und][0][value]']='user/register'; $x['op']='Create new account'; $x['captcha_response']='Finger'; $ch = curl_init(); //инициализация библиотеки //указываем адрес страницы // получать заголовки // curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_URL,$url); //указываем заголовок User-Agent curl_setopt($ch, CURLOPT_USERAGENT, $agent); //referer - адрес страницы с которой вы пришли, //т.е. нужно указать адрес страницы на которой находится форма curl_setopt($ch, CURLOPT_REFERER, $url); //указываем, что мы отправляем данные методом post curl_setopt($ch, CURLOPT_POST, 1); //добавляем строку с post данными curl_setopt($ch, CURLOPT_POSTFIELDS, $x); //указываем, что полученная страница должна быть сохранена в переменную curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // не проверять SSL сертификат curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); // не проверять Host SSL сертификата curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); //указываем куки curl_setopt($ch, CURLOPT_COOKIEFILE, $cook); curl_setopt($ch, CURLOPT_COOKIEJAR, $cook); //выполняем запрос $page = curl_exec($ch); echo $page; ?>
Re: не пашет POST в сURL на https странице[10$ за подсказку] Посмотрел содержимое массива и посмотрел что отправляется браузер. Код (Text): array(12) { ["form_build_id"]=> string(0) "" ["captcha_sid"]=> string(0) "" ["captcha_token"]=> string(0) "" ["mail"]=> string(20) "sience2013@gmail.com" ["profile_main[field_first_name][und][0][value]"]=> string(4) "Roma" ["profile_main[field_last_name][und][0][value]"]=> string(3) "Rom" ["profile_main[field_city]"]=> string(0) "" ["profile_main[field_state]"]=> string(0) "" ["profile_main[field_zip][und][0][value]"]=> string(0) "" ["field_origin[und][0][value]"]=> string(13) "user/register" ["op"]=> string(18) "Create new account" ["captcha_response"]=> string(6) "Finger" } Код (Text): name="captcha_sid" 74534761 name="captcha_token" 31e81b21512d44b68dfc8a15c9dfde89 name="form_id" user_register_form name="form_build_id" form-IVO5aPRp-Pust8RzBRBt3zmHwU0sKCg0pqJgQTb61RI name="email_updates" 1 У Вас эти параметры не заполняются.
проблему убрал (curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1) но дело не в этом в масив уже передается все нормально, вот вывод $x: Код (PHP): Array ( [captcha_sid] => 74556716 [captcha_token] => 3c35d5717875bf98bd7c0b5005883429 [mail] => sience2013@gmail.com [profile_main[field_first_name][und][0][value]] => Roma [profile_main[field_last_name][und][0][value]] => Rom [profile_main[field_city]] => [profile_main[field_state]] => [profile_main[field_zip][und][0][value]] => [field_origin[und][0][value]] => user/register [op] => Create new account [captcha_response] => Finger )
Re: не пашет POST в сURL на https странице[10$ за подсказку] я сначала не обратил внимание, а теперь заметил - запросы отправляются не через POST (Form Data), а через Request Payload . Вот отыскал пример, которые должен решать проблему(сам не проверял пока что). Суть нужно послать нужные заголовки + преобразовать данные. Ниже указал ссылки, которые, возможно, помогут решить проблему.. данные пример не учитывает параметр boundary, которые есть в запросе. Код (Text): $data = array("name" => "Hagrid", "age" => "36"); $data_string = json_encode($data); $ch = curl_init('http://api.local/rest/users'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data_string)) ); $result = curl_exec($ch); _toster.ru/q/57628 _habrahabr.ru/post/143168/ Добавлено спустя 5 минут 57 секунд: Ах да в примере отправляется заголовок Content-Type: application/json а браузер отправляет Content-Length:1706 Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryADGPsaJo1qUYSVtd Код (Text): curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: multipart/form-data; boundary='.$boundary, 'Content-Length: ' . strlen($data_string)) ); тут вероятно нужна правка. и вот сами отправляемые данные Request Payload Код (Text): ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="mail" 111 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="profile_main[field_first_name][und][0][value]" 222 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="profile_main[field_last_name][und][0][value]" 333 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="profile_main[field_city]" ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="profile_main[field_state]" ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="profile_main[field_zip][und][0][value]" 444 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="profile_main[field_country]" ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="form_build_id" form-Ef5jvua7J10rLt93dewfIp8hhnxwUmoxeJsXdJ7tAQk ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="form_id" user_register_form ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="field_origin[und][0][value]" petitions ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="captcha_sid" 74548806 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="captcha_token" db423cf4e35ad4a355dea87b611686e7 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="captcha_response" 555 ------WebKitFormBoundaryADGPsaJo1qUYSVtd Content-Disposition: form-data; name="op" Create new account ------WebKitFormBoundaryADGPsaJo1qUYSVtd-- Добавлено спустя 16 минут 4 секунды: Нашел вот какой пример, который должен работать. Суть такова, что при передаче данных нужно повторить структуру данных выше - все новые строки, разделители и прочее. В данном случае разделитель на сайте ------WebKitFormBoundaryADGPsaJo1qUYSVtd Сам пример: _scraperblog.blogspot.ru/2013/07/php-curl-multipart-form-posting.html _vedovini.net/2009/08/posting-multipart-form-data-using-php/
Re: не пашет POST в сURL на https странице[10$ за подсказку] CURLOPT_POSTFIELDS Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1¶2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @, value должен быть массивом. Cудя с мануала в зголовок у меня и так добавляется такой как и вы сказали.