【问题标题】:PHP: Simulate XHR using cURLPHP:使用 cURL 模拟 XHR
【发布时间】:2011-08-23 18:24:27
【问题描述】:

今天我正在尝试为某些论坛登录做一个 cron 作业以检查在线统计信息。 login.php 脚本接受带有表单提交值的 ajax 请求:用户、密码、服务器和哈希 ID(在隐藏字段中)。我已经可以将值提交到登录脚本,也可以使用 cookie jar 保留会话,但是当我尝试传递所需的参数(来自 sendlogin.php)时,它似乎拒绝了不带有正确请求标头的请求.所以我需要知道如何使用 cURL 进行模拟:

GET login.php?user=foo&password=bar&server=1&id=7131c359e534e3790eaefa495d621b2a HTTP/1.1

Host: someloginserver.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: http://someloginserver.com/sendlogin.php
Cookie: __cfduid=de2fe207593d1135fc2426fb06e3270741303115848; hellobar_current=1300711502; hellobar_1300711502_variation=11462; PHPSESSID=cc621c6f57c43130d51d3147e319d8c2

希望你能帮助我。

【问题讨论】:

  • 将相关标题传递给curl_setopt($curlHandle, 'CURLOPT_HTTPHEADER', $headersArray);。打开详细的 curl 日志记录。修改直到头文件 cURL 输出符合您的预期。

标签: php curl xmlhttprequest


【解决方案1】:

在 PHP api to curl 你可以使用:

curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    "Host" => "someloginserver.com",
    "User-Agent" => "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
    "Accept" => "application/json, text/javascript, */*; q=0.01",
    "Accept-Language" => "en-us,en;q=0.5",
    "Accept-Encoding" => "gzip, deflate",
    "Accept-Charset" => "ISO-8859-1,utf-8;q=0.7,*;q=0.7",
    "Keep-Alive" => "115",
    "Connection" => "keep-alive",
    "X-Requested-With" => "XMLHttpRequest",
    "Referer" => "http://someloginserver.com/sendlogin.php"
));

但您的实际问题可能是我在上面排除的 Cookie:。使用 COOKIEJAR 设置您的 cURL 请求。发出一个虚假请求以获取当前会话值,然后才发送您的实际 XHR 请求。

【讨论】:

  • 好吧,看来你对我的看法是对的,我的 cookie 会有问题。我发现在 sendlogin.php 中,有一个 javascript 文件添加了 2 个新的 cookie 变量:hellobar_current 和 hellobar_1300711502_variation 所以现在的问题是,我如何将这些 javascript 添加的 cookie 值包含到 cookie jar 中?
  • 您可以重复使用 Firefox 的预置 cookie 文件,也可以使用 CURLOPT_COOKIE 手动注入另外两个。但是,我怀疑这两个 cookie 是否与自动化相关。
  • 好的,现在我可以注入额外的 cookie,但它们似乎没有保存在 cookiejar 中。这是我的代码 sn-p:pastebin.com/FZb9mfKZ
  • CURLOPT_COOKIE 的 curl_setopt() 应该在设置我假设的 _COOKIEJAR 之后发生。
  • 好的,现在我找到了罪魁祸首:当与关联数组一起传递时,标题似乎不起作用。它应该类似于:array('Accept-Language: en-us,en;q=0.5', 'etc', etc');
【解决方案2】:

这种数组格式不起作用。 Curl 不接受关联数组。每个元素必须是以下格式的字符串:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        "Host: www.somehost.com",
        "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
        "Accept: application/json, text/javascript, */*; q=0.01",
        "Accept-Language: en-us,en;q=0.5",
        "Accept-Encoding: gzip, deflate",
        "Connection: keep-alive",
        "X-Requested-With: XMLHttpRequest",
        "Referer: http://www.somehost.com/"
    ));

【讨论】:

    猜你喜欢
    • 2011-03-18
    • 2023-03-31
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多