【问题标题】:php cURL Imitating Ajax Callsphp cURL 模仿 Ajax 调用
【发布时间】:2016-06-08 20:30:12
【问题描述】:

我试图从中检索数据的网页正在使用对特定页面的 ajax 调用填充其内容。相关调用是这样的:

$.ajax({        
    type: 'POST',
    dataType: "json",
    data: Data,
    url: '/example-ajax.aspx',
    timeout: _defaultTimeOut,
...

这是 HTTP 请求(post 数据除外):

POST /example-ajax.aspx HTTP/1.1
Host: *website*
Connection: keep-alive
Content-Length: 83
Accept: application/json, text/javascript, */*; q=0.01
Origin: *http://website*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,      like Gecko) Chrome/51.0.2704.79 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer:  *referrer*
Accept-Encoding: gzip, deflate
Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: *very long cokie*

我还可以使用 Postman 工具获取相关内容,只需设置帖子值以及引用者、来源和主机标头。

我使用 libcurl 所做的是首先使用登录信息连接到登录页面并将 cookie 保存在 cookiejar 中。比我向上述 ajax 页面发送请求,但它返回带有 {Error: Unauthorized} 参数的 json 数据。本地或网络存储中没有令牌或任何东西,只有 cookie。那么服务器如何区分浏览器和cURL请求呢?

这是我检索 cookie 的代码:

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
//set the cookie the site has for certain features, this is optional
curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
//curl_setopt($ch, CURLOPT_COOKIESESSION, true);  
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, "http://example.com");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host: example.com',
    'Origin: http://example.com'
    ));

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo)

这是我的要求:

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_URL, $url;

curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiejar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, "http://example.com");
curl_setopt($ch, CURLOPT_USERAGENT,
    "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host: example.com',
    'Origin: http://example.com',
    'X-Requested-With:XMLHttpRequest',
    'Accept:application/json, text/javascript, */*; q=0.01',
    'Accept-Language:tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4',
    'Cache-Control:max-age=0',
    'Connection:keep-alive',
    'Content-Length:83',
    'Content-Type:application/x-www-form-urlencoded; charset=UTF-8',
    ));

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
$result = curl_exec($ch);
curl_close($ch);

【问题讨论】:

    标签: php ajax curl cookies libcurl


    【解决方案1】:

    在我发布问题后,我发现只需发送 GET 请求而不是 POST 即可解决问题。但由于某种原因,邮递员和浏览器都发送 POST 请求来获取内容,我想我也应该使用 cURL。我错了。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 2012-10-26
      相关资源
      最近更新 更多