【问题标题】:Laravel cURL won't write cookie fileLaravel cURL 不会写入 cookie 文件
【发布时间】:2017-12-21 06:35:11
【问题描述】:

我发现了很多像我这样的问题,很遗憾没有适合我的解决方案。我已经创建了一个用于抓取网站的功能,但是对于某些网站我需要设置一些 cookie 来获取相关内容。 我的网站使用的是 Laravel 5.2 框架,问题是它没有将 cookie 文件保存到存储路径(或者也没有保存到公共)。

几年前在非 Laravel 网站上,我使用相同的功能,创建 cookie 文件没有问题。

函数如下:

function getFileContentByCurl($strURL, $objPost = "", $strReferrer = "", $objHeaders = "", $strCookie = "") {

        $ch = curl_init(); 
        curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0");
        curl_setopt($ch, CURLOPT_URL, $strURL);
        curl_setopt($ch, CURLOPT_VERBOSE, 1);
        curl_setopt($ch, CURLOPT_COOKIESESSION, true);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // curl_setopt($ch, CURLOPT_HEADER, true);

        $cookie_file = storage_path('app/cookies.txt');

        if($strCookie) {
            curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); 
            curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
        }   
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
        curl_setopt($ch, CURLOPT_BUFFERSIZE, 65536);
        curl_setopt($ch, CURLOPT_ENCODING, "");

        if($strCookie != "") {curl_setopt($ch, CURLOPT_COOKIE, $strCookie);}
        if($strReferrer != "") {curl_setopt($ch, CURLOPT_REFERER, $strReferrer);}
        if($objHeaders != "") {curl_setopt($ch, CURLOPT_HTTPHEADER, $objHeaders);}
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        if($objPost != ""){curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $objPost);}
        $returned = curl_exec($ch);

        curl_close($ch);
        sleep(5);
        return $returned;

}

我试图在存储目录中放置一个空文件,但它没有写入。已检查文件是否可写。

【问题讨论】:

  • 我可以建议您在使用CURLOPT_COOKIEFILE+CURLOPT_COOKIEJAR 时不要使用CURLOPT_COOKIE。该文件应该自动保留 cookie。
  • @Scuzzy 我已经删除了它,但它仍然没有写入 cookie 文件
  • is_writeable() 对该文件夹/路径有何看法?
  • @Scuzzy 如果我把一个空文件放在那里,它说这是可写的,但它没有写任何东西。或者如果没有文件,它不会自己创建
  • 你的代码肯定会激活那些 cookie 文件/jar 选项(即 if($strCookie) { 周围的逻辑是否正常?)

标签: php curl cookies laravel-5.2


【解决方案1】:

我所能建议的就是将代码减少到 cookie 文件/jar 可以工作的最小可能解决方案,然后从那里构建备份。

curl.php

<?php

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://localhost/cookie.php');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
echo curl_exec($ch);

cookie.php

<?php
if( !isset($_COOKIE['testcookie']))
{
  setcookie('testcookie',date('r'),time()+10);
}
print_r($_COOKIE);

【讨论】:

  • 那东西正在工作。但是,如果我将 url 从 localhost/cookie.php 更改为我想要抓取的网站,它就不起作用。为什么会这样?
  • 那么这意味着 curl 没有收到第一个请求的 cookie,因为这就是我的测试脚本正在做的所有事情,设置 cookie 标头。
  • 但是网站有相应的 cookie Firebug 吗?
  • 所以这肯定是在清除 cookie 或使用私人窗口并查看第一个 http 请求之后?在不知道您要抓取的网站的情况下,我不确定是否有任何进一步的建议。
  • 这是网站:betexplorer.com/results/soccer/… 不幸的是,当设置日期时,我得到完全不同的结果。感谢您的帮助!
猜你喜欢
  • 2014-05-27
  • 2015-09-10
  • 2015-08-05
  • 2016-11-03
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2013-10-18
相关资源
最近更新 更多