通过 CURL 发送 ajax 请求

2022-08-31 01:05:14

需要发送 API 请求。由于某种原因,服务器阻止了 CURL 请求,但它批准了 XHR ajax 请求。我可以发送一个ajax请求,但出现了另一个问题 - 混合内容我的网站通过HTTPS提供,但需要发送的请求是通过HTTP发送的,所以我不能使用ajax。

我正在寻找一种通过CURL模拟ajax请求的方法,以某种方式欺骗服务器相信CURL请求确实是ajax请求。

这是我尝试过的。

这是我的 CURL 请求。

    $ch = curl_init();
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64)');
        curl_setopt($ch, CURLOPT_REFERER, 'server's 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;

此 curl 请求被阻止

但是,这个ajax请求通过我的本地主机,但是由于我的实时网站使用HTTPS,我无法真正使用它。

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

答案 1

在 chrome 中,您可以从开发者工具栏复制一个有效的 curl 表达式。尝试使用来自 cli 的那一个。如果这有效,您可以确定哪些部件是必需的,哪些部件不是必需的。然后你可以把它转录成php。

developer toolbar -> network -> select a file -> right click - copy -> copy as curl

如果您怀疑php是否比curl发生同样的事情,请尝试使用requestbin


答案 2

我认为令牌的标题可能不是您认为的那样,因为给定$a==1,“$a”转换为$a,但“$a”转换为“1”(请注意单引号与双引号)。

在您的示例中,尝试替换:

'__RequestVerificationToken: $token'

跟:

"__RequestVerificationToken: $token"

并让我们知道这是否解决了问题。

考虑使用 passthru(“curl 命令 here...”);使用林塔巴的建议


推荐