尝试使用PHP的CURL获取cookies

3

我只是想使用curl从网站获取一些cookie,我已经阅读了数千个与此相关的主题,问题几乎每次都与文件路径相关(必须是绝对路径)。

我尝试了几件事情,但我找不到我的cookie没有被写入的原因。以下是代码:

$cookieDir = 'tmp/cookies.txt';

$options = Array(
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => $url,
    CURLOPT_COOKIEJAR => realpath($cookieDir),
    CURLOPT_COOKIEFILE => realpath($cookieDir)
);

$ch = curl_init();
curl_setopt_array($ch, $options);
ob_start();
$data = curl_exec($ch);
ob_end_clean();
curl_close($ch);

一些注解:

  1. 文件存在
  2. realpath($cookieDir) 可写
  3. 我可以毫无问题地获取 $data 中的网站

谢谢大家


1
你可以使用 CURLOPT_HEADER 选项,然后使用类似以下内容的代码检查结果中的 cookies: preg_match('/^Set-Cookie:\s*([^\r\n]*)/mi', $data, $cookies); - Cyclonecode
你的cookieDir变量不是绝对路径。它不以“/”或Windows的“C:\”开头。 - sridesmet
我甚至不知道cookie是如何发送的,这是一个进步。现在我发现了一些罕见的东西可能导致整个事情出错。我使用CURLOPT_HEADER = true获取头部信息,但它并不包含cookie。它们应该在那里,我可以在Firebug的头部中看到它们。 - Adria Torres
2个回答

0

我认为您必须将CURLOPT_POST选项设置为true才能获取cookies,以下方法适用于我:

$cookieDir = '<ABSOLUTE_PATH>/cookie.txt';

$options = array ( 
   CURLOPT_RETURNTRANSFER => TRUE,
   CURLOPT_URL => '<URL>',
   CURLOPT_COOKIEJAR => $cookieDir,
   CURLOPT_COOKIEFILE => $cookieDir,
   CURLOPT_POST => TRUE,
   CURLOPT_FOLLOWLOCATION => TRUE,
);

$ch = curl_init();
curl_setopt_array($ch, $options);
$data = curl_exec($ch);

你还应该能够通过在请求中设置CURLOPT_HEADER来从头部获取所有的cookie:

$cookieDir = '<ABSOLUTE_PATH>/cookie.txt';

$options = array (
   CURLOPT_RETURNTRANSFER => TRUE,
   CURLOPT_URL => '<URL>',
   CURLOPT_POST => TRUE,
   CURLOPT_HEADER => TRUE,
   CURLOPT_FOLLOWLOCATION => TRUE
);

$ch = curl_init();
curl_setopt_array($ch, $options);
$data = curl_exec($ch);  
// check the return value for `Set-Cookie` header
$cookies = array();
preg_match('/^Set-Cookie:\s*([^\r\n]*)/mi', $data, $cookies); 
// $cookies[0] now contains any `Set-Cookie:` header

看起来罪魁祸首是目标网站,我尝试了另一个网站并正确接收到了cookies,我可以确认POST参数不是必需的。你有任何想法为什么会发生这种情况吗?我尝试将CURLOPT_USERAGENT设置为“Mozilla/5.0(Windows NT 6.1; WOW64; rv:33.0)Gecko/20100101 Firefox/33.0”,但它仍然没有发送任何内容:( - Adria Torres
我做到了:_) 我马上会发布答案。谢谢,如果不知道如何发送 cookie,我就无法完成。 - Adria Torres
我尝试过启用和禁用post请求,只有在post设置为true时才可以使其工作,但我认为这可能取决于网站。 - Cyclonecode

0

是这个网站不允许我获取他们的cookies,为了获取它们,我必须使用这个额外参数让它认为我是一个普通浏览器。

$header = array (
    'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3',
    'Connection: keep-alive'
);

然后在$options中

$options = array (
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => $url,
    CURLOPT_COOKIEJAR => realpath($cookieDir),
    CURLOPT_COOKIEFILE => realpath($cookieDir),
    CURLOPT_HTTPHEADER => $header
);

虽然这是一个奇怪的案例,但我希望它能帮助其他人 =)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接