CURL + POST + multipart / form-data

Я пытаюсь очистить веб-сайт с помощью методов PHP, CURL и POST, чтобы отправить форму перед очисткой страницы в Интернете. Проблема, с которой я столкнулся, связана с методом POST: данные не отправляются на сервер, поэтому очищенная веб-страница не содержит того, что я ищу.

Я уволился, уверенный, что проблема связана с типом формы: enctype = "multipart / form-data". Как я могу управлять этим запросом POST, учитывая, что форма является multipart / form-data? Должен ли я кодировать post_string особым образом?

Вот код, который я использую:

 function curl($url) {

//POST string
$post_string="XXXX";

$options = Array(
        CURLOPT_RETURNTRANSFER => TRUE,  
        CURLOPT_FOLLOWLOCATION => TRUE, 
        CURLOPT_AUTOREFERER => TRUE, 
        CURLOPT_CONNECTTIMEOUT => 120,  
        CURLOPT_TIMEOUT => 120, 
        CURLOPT_MAXREDIRS => 10, 
        CURLOPT_USERAGENT => "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/2008073000 Shredder/3.0a2pre ThunderBrowse/3.2.1.8",  
        CURLOPT_URL => $url, 
        CURLOPT_CAINFO => dirname(__FILE__)."/cacert.pem",

        CURLOPT_POSTFIELDS => $post_string,

    );

    $ch = curl_init(); 
    curl_setopt_array($ch, $options);   
    $data = curl_exec($ch); 
    curl_error($ch);
    curl_close($ch);       
    return $data;   
}

$scraped_page = curl("XXXURLXXX");    
echo $scraped_page; 

Спасибо!


person user3352382    schedule 26.02.2014    source источник


Ответы (2)


Установите для CURLOPT_POST значение true:

CURLOPT_POST = true

Затем заполните поля своего сообщения, например, "настройка":

$postfields = array();
$postfields['field1'] = 'value1';
$postfields['field2'] = 'value2';
CURLOPT_POSTFIELDS => $postfields

Если значение является массивом, заголовок Content-Type будет установлен на multipart / form-data.

Руководство по PHP

person KoalaBear    schedule 26.02.2014
comment
Что ж, я добавил эти строки: CURLOPT_POST = ›TRUE, CURLOPT_POSTFIELDS =› http_build_query ($ postfields) и заполнил поля сообщения вашей настройкой, но это все еще не работает: Firebug подтверждает, что POST не выполняется ... - person user3352382; 26.02.2014
comment
Firebug не будет показывать настоящий POST, поскольку это происходит «внутри» выполнения PHP, а не внутри «вывода» страницы. Добавьте в свой PHP следующее после $ data = curl_exec ($ ch); == ›var_dump (curl_getinfo ($ ch)); И посмотрите, что это покажет. - person KoalaBear; 26.02.2014
comment
Ах, хорошо, спасибо, но страница, которая отображается эхом, все еще показывает пустую форму и никаких результатов .. - person user3352382; 26.02.2014
comment
Хм. Некоторые рекомендуют просто сделать это без функции http_build_query: CURLOPT_POSTFIELDS = ›$ postfields И я выяснил почему: nl1. php.net/curl_setopt Если значение является массивом, заголовок Content-Type будет установлен в multipart / form-data. - person KoalaBear; 26.02.2014
comment
Я только говорю, что будет делать PHP, если это не сработает, и если мы не сможем протестировать этот код локально, это лучшее, что мы можем сделать :): | - person KoalaBear; 26.02.2014
comment
Я отредактировал код, как вы предлагаете: теперь, если я поставлю CURLOPT_POST = true ПОСЛЕ CURLOPT_POSTFIELDS = ›$ postfields, я получу неверный запрос (недопустимый номер) ... а если я поставлю CURLOPT_POST = true BEFORE CURLOPT_POSTFIELDS =› $ postfields , ничего особенного не происходит (отображается страница формы) ... - person user3352382; 26.02.2014
comment
Похоже, разница действительно есть. Может быть, попробовать НЕ указывать CURLOPT_POST, а устанавливать только CURLOPT_POSTFIELDS? Стоит попробовать. stackoverflow.com/questions/7979854/ - person KoalaBear; 26.02.2014
comment
Без CURLOPT_POST сообщений об ошибках нет, но очищенная веб-страница содержит только форму и никаких результатов. Могу я показать вам код, чтобы вы могли протестировать его локально? Вот он (пожалуйста, не вставляйте скопированный URL, это совершенно конфиденциально): pastebin.com/p4CeZVuQ - person user3352382; 26.02.2014
comment
В ПОРЯДКЕ. Я вижу этот пример перенаправления (HTTP CODE 302), потому что это URL-адрес HTTP, а не HTTPS. Поэтому я использовал HTTPS и «обошел» проверки SSL, чтобы он заработал. Проверьте это, с этим я получаю результаты обратно: pastebin.com/64NV22fV (срок действия pastbin истечет через 2 недель) Вы можете удалить CURLOPT_HEADER, я использовал его для отладки, также var_dump (curl_getinfo ($ ch)); - person KoalaBear; 26.02.2014

Да, $ post_string должен быть массивом.

Также установите для CURLOPT_POST значение true.

person Alix Axel    schedule 26.02.2014