За последние 24 часа нас посетили 63315 программистов и 1740 роботов. Сейчас ищут 872 программиста ...

[тема закрыта] не пашет POST в сURL на https странице

Тема в разделе "Прочие вопросы по PHP", создана пользователем Devxypro, 6 янв 2014.

  1. Devxypro

    Devxypro Новичок

    С нами с:
    6 янв 2014
    Сообщения:
    5
    Симпатии:
    0
    Делаем следующие действия. Заходим на страницу, парсим все необходимое для POST запроса.
    Во время передачи запроса возвращает ту же самую страницу, ни ошибок нифига вообще.
    непонятно как-то. может дело в том что нужно сохранить сертификат, а потом его подставить.
    Но в нете нашел только как сUrlом подставлять.
    Да и вообще может быть дело именно в этом. Может ли вообще при отправке запроса пост сайт проверять собственный сертификат. Или ошибка скорее в другом.
    Выкладую код полностью. Использовал дополнительно библиотеку для парсинга phpQuery.php. Думаю есть у каждого.
    Код (PHP):
    1.         <?php
    2.         require 'simple_html_dom.php';
    3.         require ('phpQuery/phpQuery.php');
    4.             $url='https://petitions.whitehouse.gov/register?destination=user/register';
    5.             $agent = 'Opera/9.62 (Windows NT 6.0; U; ru) Presto/2.1.1';
    6.             $ch = curl_init(); //инициализация библиотеки
    7.           // не проверять SSL сертификат
    8.             curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    9.             // не проверять Host SSL сертификата
    10.             curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    11.             curl_setopt($ch, CURLOPT_URL,$url);
    12.             //указываем заголовок User-Agent
    13.                curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    14.             //т.е. нужно указать адрес страницы на которой находится форма
    15.                curl_setopt($ch, CURLOPT_REFERER, $url);
    16.             //указываем, что полученная страница должна быть сохранена в переменную
    17.                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    18.             //указываем, что cURL должен переходить по редиректам
    19.             curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
    20.             //создаем файл для cookies
    21.             $cook = tempnam('cook', 'cookie_');
    22.             curl_setopt($ch, CURLOPT_COOKIEFILE, $cook);
    23.             curl_setopt($ch, CURLOPT_COOKIEJAR, $cook);            
    24.             //выполняем запрос
    25.            $page = curl_exec($ch);
    26.           curl_errno($ch)==0 or die("Error:".curl_errno($ch)." ".curl_error($ch));
    27.            curl_close($ch);         
    28.        
    29.            $x=array(); 
    30.            /////////////php Qurey////////////////Parser
    31.           $html = str_get_html($page);
    32.           $document=phpQuery::newDocument($html);
    33.           $label=$document->find('label[for=edit-captcha-response]');
    34.           $end=strpos($label,'<span');
    35.           echo $captcha = substr($label, 35,$end-35);
    36.           $x['form_build_id']=$document->find('input[name=form_build_id]')->attr('value');
    37.           $x['captcha_sid']=$document->find('input[name=captcha_sid]')->attr('value');  
    38.           $x['captcha_token']=$document->find('input[name=captcha_token]')->attr('value');  
    39.           
    40.           ///////////////
    41.           $x['mail']='sience2013@gmail.com';
    42.           $x['profile_main[field_first_name][und][0][value]']='Roma';
    43.           $x['profile_main[field_last_name][und][0][value]']='Rom';
    44.           $x['profile_main[field_city]']='';
    45.           $x['profile_main[field_state]']='';
    46.           $x['profile_main[field_zip][und][0][value]']='';
    47.           $x['field_origin[und][0][value]']='user/register';
    48.           $x['op']='Create new account';
    49.           $x['captcha_response']='Finger';
    50.           
    51.            $ch = curl_init(); //инициализация библиотеки
    52.             //указываем адрес страницы
    53.            // получать заголовки
    54.            // curl_setopt ($ch, CURLOPT_HEADER, 1); 
    55.             curl_setopt($ch, CURLOPT_URL,$url);
    56.             //указываем заголовок User-Agent
    57.                curl_setopt($ch, CURLOPT_USERAGENT, $agent);             
    58.             //referer - адрес страницы с которой вы пришли,
    59.             //т.е. нужно указать адрес страницы на которой находится форма
    60.             curl_setopt($ch, CURLOPT_REFERER, $url);
    61.             //указываем, что мы отправляем данные методом post
    62.             curl_setopt($ch, CURLOPT_POST, 1);
    63.             //добавляем строку с post данными
    64.             curl_setopt($ch, CURLOPT_POSTFIELDS, $x);
    65.             //указываем, что полученная страница должна быть сохранена в переменную
    66.                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    67.             // не проверять SSL сертификат
    68.             curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    69.             // не проверять Host SSL сертификата
    70.             curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
    71.             //указываем куки
    72.             curl_setopt($ch, CURLOPT_COOKIEFILE, $cook);
    73.             curl_setopt($ch, CURLOPT_COOKIEJAR, $cook);           
    74.             //выполняем запрос
    75.             $page = curl_exec($ch);
    76.            echo $page;
    77.         ?>
     
  2. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    Re: не пашет POST в сURL на https странице[10$ за подсказку]

    Посмотрел содержимое массива и посмотрел что отправляется браузер.
    Код (Text):
    1. array(12) {
    2.   ["form_build_id"]=>
    3.   string(0) ""
    4.   ["captcha_sid"]=>
    5.   string(0) ""
    6.   ["captcha_token"]=>
    7.   string(0) ""
    8.   ["mail"]=>
    9.   string(20) "sience2013@gmail.com"
    10.   ["profile_main[field_first_name][und][0][value]"]=>
    11.   string(4) "Roma"
    12.   ["profile_main[field_last_name][und][0][value]"]=>
    13.   string(3) "Rom"
    14.   ["profile_main[field_city]"]=>
    15.   string(0) ""
    16.   ["profile_main[field_state]"]=>
    17.   string(0) ""
    18.   ["profile_main[field_zip][und][0][value]"]=>
    19.   string(0) ""
    20.   ["field_origin[und][0][value]"]=>
    21.   string(13) "user/register"
    22.   ["op"]=>
    23.   string(18) "Create new account"
    24.   ["captcha_response"]=>
    25.   string(6) "Finger"
    26. }
    Код (Text):
    1.  name="captcha_sid" 74534761
    2.  name="captcha_token" 31e81b21512d44b68dfc8a15c9dfde89
    3.  name="form_id" user_register_form
    4. name="form_build_id" form-IVO5aPRp-Pust8RzBRBt3zmHwU0sKCg0pqJgQTb61RI
    5. name="email_updates" 1
    У Вас эти параметры не заполняются.
     
  3. Devxypro

    Devxypro Новичок

    С нами с:
    6 янв 2014
    Сообщения:
    5
    Симпатии:
    0
    проблему убрал (curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);)
    но дело не в этом
    в масив уже передается все нормально, вот вывод $x:
    Код (PHP):
    1. [captcha_sid] => 74556716 
    2. [captcha_token] => 3c35d5717875bf98bd7c0b5005883429
    3. [mail] => sience2013@gmail.com 
    4. [profile_main[field_first_name][und][0][value]] => Roma 
    5. [profile_main[field_last_name][und][0][value]] => Rom 
    6. [profile_main[field_city]] => 
    7. [profile_main[field_state]] => 
    8. [profile_main[field_zip][und][0][value]] =>
    9. [field_origin[und][0][value]] => user/register
    10. [op] => Create new account [captcha_response] => Finger )
    11.  
     
  4. Avivar

    Avivar Новичок

    С нами с:
    6 авг 2013
    Сообщения:
    15
    Симпатии:
    0
    Re: не пашет POST в сURL на https странице[10$ за подсказку]

    я сначала не обратил внимание, а теперь заметил - запросы отправляются не через POST (Form Data), а через Request Payload .
    Вот отыскал пример, которые должен решать проблему(сам не проверял пока что).
    Суть нужно послать нужные заголовки + преобразовать данные. Ниже указал ссылки, которые, возможно, помогут решить проблему..

    данные пример не учитывает параметр boundary, которые есть в запросе.
    Код (Text):
    1. $data = array("name" => "Hagrid", "age" => "36");                                                                    
    2. $data_string = json_encode($data);                                                                                  
    3.  
    4. $ch = curl_init('http://api.local/rest/users');                                                                      
    5. curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                    
    6. curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
    7. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
    8. curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    9.     'Content-Type: application/json',                                                                                
    10.     'Content-Length: ' . strlen($data_string))                                                                      
    11. );                                                                                                                  
    12.  
    13. $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):
    1.  
    2. curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
    3.     'Content-Type: multipart/form-data; boundary='.$boundary,                                                                                
    4.     'Content-Length: ' . strlen($data_string))                                                                      
    5. );
    тут вероятно нужна правка.
    и вот сами отправляемые данные
    Request Payload
    Код (Text):
    1.  
    2. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    3. Content-Disposition: form-data; name="mail"
    4.  
    5. 111
    6. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    7. Content-Disposition: form-data; name="profile_main[field_first_name][und][0][value]"
    8.  
    9. 222
    10. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    11. Content-Disposition: form-data; name="profile_main[field_last_name][und][0][value]"
    12.  
    13. 333
    14. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    15. Content-Disposition: form-data; name="profile_main[field_city]"
    16.  
    17.  
    18. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    19. Content-Disposition: form-data; name="profile_main[field_state]"
    20.  
    21.  
    22. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    23. Content-Disposition: form-data; name="profile_main[field_zip][und][0][value]"
    24.  
    25. 444
    26. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    27. Content-Disposition: form-data; name="profile_main[field_country]"
    28.  
    29.  
    30. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    31. Content-Disposition: form-data; name="form_build_id"
    32.  
    33. form-Ef5jvua7J10rLt93dewfIp8hhnxwUmoxeJsXdJ7tAQk
    34. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    35. Content-Disposition: form-data; name="form_id"
    36.  
    37. user_register_form
    38. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    39. Content-Disposition: form-data; name="field_origin[und][0][value]"
    40.  
    41. petitions
    42. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    43. Content-Disposition: form-data; name="captcha_sid"
    44.  
    45. 74548806
    46. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    47. Content-Disposition: form-data; name="captcha_token"
    48.  
    49. db423cf4e35ad4a355dea87b611686e7
    50. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    51. Content-Disposition: form-data; name="captcha_response"
    52.  
    53. 555
    54. ------WebKitFormBoundaryADGPsaJo1qUYSVtd
    55. Content-Disposition: form-data; name="op"
    56.  
    57. Create new account
    58. ------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/
     
  5. Devxypro

    Devxypro Новичок

    С нами с:
    6 янв 2014
    Сообщения:
    5
    Симпатии:
    0
    Re: не пашет POST в сURL на https странице[10$ за подсказку]

    CURLOPT_POSTFIELDS
    Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @, а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ';type=mimetype', следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие 'para1=val1&para2=val2&...', так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data. Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @, value должен быть массивом.

    Cудя с мануала в зголовок у меня и так добавляется такой как и вы сказали.