Отправить Multipart/formdata с помощью CURL/php

Я пытаюсь получить результаты веб-страницы, созданной после отправки формы. В форме есть 2 входа: 1- Название города 2- Дата. Когда я проверяю страницу в Chrome на предмет того, какие заголовки отправляются, я получаю следующее:

    ------WebKitFormBoundarymHxte4apsmNuBb5n
    Content-Disposition: form-data; name="town"

    CENTER
    ------WebKitFormBoundarymHxte4apsmNuBb5n
    Content-Disposition: form-data; name="Date_Start"

    17-05-2020
    ------WebKitFormBoundarymHxte4apsmNuBb5n--

Граница, которая в данном случае «mHxte4apsmNuBb5n», меняется при каждой подаче.

Я пробовал этот код безрезультатно:

    function curl($url) {

    //POST string
    $postfields['town'] = 'CENTER';
    $postfields['Date_Start'] = '17-05-2020';
    $headers = array("Content-Type:multipart/form-data; boundary=gc0p4Jq0M2Yt08jU534c0p");

    $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 => $postfields,
            CURLOPT_HTTPHEADER => $headers,

        );

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

$scraped_page = curl("http://...");    
echo $scraped_page;

Любая помощь будет оценена.


person Mertem    schedule 17.05.2020    source источник


Ответы (1)


Я не уверен, почему у вас есть все CURLOPT_*, но они не являются строго обязательными для того, что вы хотите.

Если я создаю файл на своем локальном хосте с приведенным ниже кодом, он работает:

<?php

$data = filter_input_array( INPUT_POST );

if ( $data ) {
    print_r( $data );
    exit;
}

$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
$data = [
    'town'       => 'CENTER',
    'Date_Start' => '17-05-2020',
];

$ch = curl_init( $url );
curl_setopt_array( $ch, [
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_RESOLVE => [ $_SERVER['HTTP_HOST'] . ':80:127.0.0.1' ], // Only required on localhost
] );    

$response = curl_exec( $ch );

echo false !== $response
    ? 'result: ' . $response
    : curl_error( $ch );

Кроме того, я использую curl_error, что может помочь вам узнать, что происходит, когда curl_exec терпит неудачу.

person David    schedule 17.05.2020