【问题标题】:Reading Cookie when using Curl in php, how to?在php中使用Curl时读取Cookie,如何?
【发布时间】:2012-03-31 15:27:24
【问题描述】:

我正在连接一个 API 服务,该服务使用 cookie 对用户进行身份验证。 我在命令提示符下做了这两个语句,它可以工作。

curl -d "u=username&p=password" -c ~/cookiejar https://domain/login

curl -b https://domain/getData

现在我想使用 curl 制作两个等效的 php 文件 login.phpget_data.php

我正在使用

curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);

login.php

curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);

get_data.php

它不工作。正在创建 Cookie 文件,但第二个 curl 没有读取它。 这是正确的方法吗?我是否必须单独读取 cookie 文件并设置标题 Cookie ?任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 通常最好同时设置两个 cookie 选项,无论脚本只是读取还是写入 cookie。
  • get_data.php的curl请求中是否会自动添加标头值Cookie
  • 如果特定的 curl 实例可以读取其他脚本创建的 cookie 文件,那么可以。
  • 有什么方法可以查看 curl 请求标头。我可以从 curl 实例中获取它吗?或者有没有像 fiddler for Mac 之类的工具(我正在使用 Mac OS)?
  • 嗯。 curlopt_header 将包括标题,但我认为这仅用于响应。要查看传出的内容,您需要网络嗅探器或调试代理

标签: php curl


【解决方案1】:

这样就可以了。我以 Google.com 为例:

<?PHP

// open a site with cookies
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0');
curl_setopt($ch, CURLOPT_HEADER  ,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER  ,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$content = curl_exec($ch);

// get cookies
$cookies = array();
preg_match_all('/Set-Cookie:(?<cookie>\s{0,}.*)$/im', $content, $cookies);

print_r($cookies['cookie']); // show harvested cookies

// basic parsing of cookie strings (just an example)
$cookieParts = array();
preg_match_all('/Set-Cookie:\s{0,}(?P<name>[^=]*)=(?P<value>[^;]*).*?expires=(?P<expires>[^;]*).*?path=(?P<path>[^;]*).*?domain=(?P<domain>[^\s;]*).*?$/im', $content, $cookieParts);
print_r($cookieParts);

?>

查看other examples了解如何有效解析字符串等。

【讨论】:

    【解决方案2】:

    有什么方法可以查看 curl 请求标头。我可以从 curl 实例中获取它吗?或者有没有类似 fiddler for Mac 的工具(我正在使用 Mac OS)?

    是的,您可以通过以下方式获取请求标头:

    <?php
      ...
      curl_setopt($ch, CURLINFO_HEADER_OUT, true); // enable tracking
      $result = curl_exec($ch);
      var_dump(curl_getinfo($ch, CURLINFO_HEADER_OUT)); // request headers
    ?>
    

    【讨论】:

    • 正是我在使用时所需要的:curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    【解决方案3】:

    在 PHP 5.5.0 中,您现在可以在一行中获取 cookie,但在 PHP 7.1.0 中使用它只能返回一个空数组:

    CURLINFO_COOKIELIST - 获取所有已知的 cookie

    $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
    

    【讨论】:

    • 我也遇到了这些问题,您能否解决这些问题,以便 CURLINFO_COOKIELIST 输出 cookie?对我来说它正在工作,但是当我最近通过yum update -y 更新时,结果总是空的。
    • 尝试在第一个请求中设置curl_setopt($ch, CURLOPT_COOKIELIST, array(''));。这为我解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多