2012-03-15 92 views
5

我正在连接到使用cookie验证用户的API服务。 我从命令提示符下使这两个语句,它的工作原理。在Cookie中使用Curl时读取Cookie,如何?

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

curl -b https://domain/getData 

现在我想用卷曲,使两个等价的PHP文件的login.phpget_data.php

我在get_data.php

它不能正常工作使用

curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile); 

login.php

curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile); 

。 Cookie文件正在创建,但第二次卷曲不会读取它。 这是正确的做法吗?我是否必须单独阅读cookie文件并设置标题Cookie?任何帮助将不胜感激。谢谢。

+0

无论脚本是只读还是写cookie,通常都最好设置两个cookie选项。 – 2012-03-15 05:22:57

+0

会在'get_data.php'中自动添加标头值'Cookie'来卷曲请求吗? – Diode 2012-03-15 05:25:14

+0

如果该特定的curl实例可以读取由另一个脚本创建的cookie文件,那么是的。 – 2012-03-15 05:35:53

回答

14

这将做到这一点。我跑这对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对于如何有效地解析比如字符串。

1

是否有任何方法来查看curl请求标头。我可以从curl实例中获得它吗?或者是否有任何工具像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 
?> 
0

在PHP 5.5.0,它看起来像你现在可以得到饼干在同一行,但我只拿回一个空数组使用此用PHP 7.1.0:

CURLINFO_COOKIELIST - 让所有已知的饼干

$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST); 
+0

我也有这些问题,你是否能够解决它们,让CURLINFO_COOKIELIST输出cookie?对我来说,它正在工作,但当我最近通过'yum update -y'更新时,结果总是空的。 – maddo7 2017-02-20 16:08:38

+0

尝试使用第一个请求设置'curl_setopt($ ch,CURLOPT_COOKIELIST,array(''));'。这为我解决了它。 – maddo7 2017-02-20 19:52:27