Почему я не могу получить правильный ответ от сервера с помощью Curl?

Мне нужно получить ответ от сервера с помощью curl, но я не могу.

Сайт: https://www.investing.com/holiday-calendar/

Я могу получить этот календарь с помощью get request, но мне нужен список с пользовательскими датами. Это означает, что я должен использовать это datepicker. Поэтому, когда я нажимаю»apply«, он отправил запрос с данными, которые мне нужно было получить. (смотрите скриншоты)

Датепикер:

Введите описание изображения здесь

Запрос post с ответом JSON:

Введите описание изображения здесь

Код:

    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    define('DIR', __DIR__);

    $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Traider';
    $cookie = dirname(__FILE__).DIRECTORY_SEPARATOR.'init_cookie.txt';
    $f = fopen('init_deb.txt', 'w');
    $ch = curl_init();

    $getUrl = 'https://www.investing.com/holiday-calendar/';
    $postUrl = 'https://www.investing.com/holiday-calendar/Service/getCalendarFilteredData';

    $dateFrom='2017-01-14';
    $dateTo='2017-12-31';
    $limit_from = 0;
    $params = [
        'dateFrom' => $dateFrom,
        'dateTo' => $dateTo,
        'county' => '',
        'limit_from' => $limit_from
    ];

    curl_setopt($ch, CURLOPT_URL, $postUrl);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_STDERR, $f);

    $response = curl_exec($ch);
    fclose($f);
    curl_close($ch);

    echo $response;

Шаг 1. Я отправил запрос get, сохранить cookies.

Шаг 2. Я отправил сообщение запрос изменения $getUrl -> $postUrl. Я всегда получаю главную страницу. Почему я не могу получить ответ JSON?

1 ответ

  1. после небольшого тестирования большой секрет заключается в том, что они отказываются от запросов, к которым не X-Requested-With:XMLHttpRequestприкреплен заголовок. прикрепите это (с помощью CURLOPT_HTTPHEADER), и вам даже не нужен сеанс cookie. я думаю, это часть какой-то схемы защиты XSS.

    рабочий пример кода с использованием hhb_curl из https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php :

    <?php
    declare(strict_types=1);
    require_once('hhb_.inc.php');
    $hc=new hhb_curl();
    $hc->_setComfortableOptions();
    $hc->setopt_array(array(
            CURLOPT_POST=>true,
            CURLOPT_POSTFIELDS=>http_build_query(array(
                    'dateFrom'=>'2017-01-28',
                    'dateTo'=>'2017-01-28',
                    'country'=>'',
                    'limit_from'=>'0'
            )),
            CURLOPT_HTTPHEADER=>array(
                    'X-Requested-With:XMLHttpRequest'
            )
    ));
    $hc->exec('https://www.investing.com/holiday-calendar/Service/getCalendarFilteredData');
    hhb_var_dump($hc->getResponseBody());