为什么我无法使用Curl从服务器获得正确的响应?

时间:2017-01-15 19:47:02

标签: php jquery json curl

我需要使用curl从服务器获得响应,但我不能。

网站:https://www.investing.com/holiday-calendar/

我可以使用get请求获取该日历,但我需要一个包含自定义日期的列表。这意味着我应该使用datepicker。因此,当我按下“apply”时,它会发送包含我需要的数据的发布请求。 (见截图)

DatePicker:

enter image description here

带有JSON响应的帖子请求:

enter image description here

代码:

    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步。我发送了一个获取请求,保存了Cookie。

第2步。我发送了更改$getUrl -> $postUrl的帖子请求。我总是得到主页。为什么我无法获得JSON响应?

1 个答案:

答案 0 :(得分:0)

经过一些测试后,最大的秘密就是他们拒绝没有附加X-Requested-With:XMLHttpRequest标头的请求。附加(使用CURLOPT_HTTPHEADER),你甚至不需要cookie会话。我想它是一些XSS保护方案的一部分。

使用来自https://github.com/divinity76/hhb_.inc.php/blob/master/hhb_.inc.php的hhb_curl的工作示例代码:

<?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());