Отправить запрос ajax через CURL

Необходимо отправить запрос API. По какой-то причине сервер блокирует запрос CURL, но он одобряет запрос ajax XHR. Я мог бы отправить запрос ajax, но возникает другая проблема. - Смешанный контент, который мой сайт обслуживает через HTTPS, но запрос, который нужно отправить, - через HTTP, поэтому я не могу использовать ajax.

Я ищу способ имитации запроса ajax через CURL, каким-то образом, обмануть сервер, чтобы полагать, что запрос CURL действительно является ajax-запросом.

Вот что я пробовал.

Это мой запрос CURL.

$ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64)');
    curl_setopt($ch, CURLOPT_REFERER, 'server url');
    curl_setopt($ch, CURLOPT_AUTOREFERER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept:application/json, text/javascript, */*; q=0.01',
    'Accept-Encoding:gzip, deflate',
    'Accept-Language:en-US,en;q=0.9',
    'Connection:keep-alive',
    'Content-Type: application/json; charset=utf-8',
    'X-Requested-With: XMLHttpRequest',
    '__RequestVerificationToken: $token'
    ));
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_COOKIEJAR, base_path().'/cookies.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, base_path().'/cookies.txt');
    $buffer = curl_exec($ch);
    if(curl_error($ch))
    {
    $buffer =   curl_error($ch);
    }
    curl_close($ch);

return $buffer; Этот запрос на завивание заблокирован

Но этот запрос ajax проходит через мой локальный хост, но поскольку мой веб-сайт использует HTTPS, я не могу его использовать.

 $.ajax({
      type: "get",
      xhrFields: { withCredentials:true },
      url: http://apiendpoint.com,
      success: function(data)
      {
       // console.log(data);
      }
})

Ответ 1

в chrome, вы можете скопировать рабочее выражение curl из панели инструментов разработчика. Попробуйте с кем-то из cli. Если это сработает, вы можете выяснить, какие части требуются, а какие - нет. Затем вы можете записать его на php.

панель инструментов разработчика - > network - > выбрать файл - > правый щелчок - копировать - > копировать как curl

Если у вас есть сомнения, что то же самое происходит с php, чем с curl, просто попробуйте с requestbin.

Ответ 2

Я думаю, что заголовок для токена может быть не таким, как вы думаете, потому что данный $a == 1, '$ a' преобразуется в $a, но "$ a" преобразуется в "1" (уведомление одиночные кавычки и двойные кавычки).

в вашем примере, попробуйте заменить:

'__RequestVerificationToken: $token'

с:

"__RequestVerificationToken: $token"

и сообщите нам, если это решает проблему.

Рассмотрим использование passthru ( "команда curl here..." ); используя предложение lintabá

Ответ 3

Вы можете использовать двухэтапный запрос

1 curl .... -c ${cookie_file}

2 curl .... -b ${cookie_file} -c ${cookie_file}

Это должно сработать. сначала, в основном, получает файл cookie с идентификатором сеанса 2. сделайте реальный запрос