【问题标题】:CURL Doesn't Save Cookies (PHP)CURL 不保存 Cookie (PHP)
【发布时间】:2011-10-09 06:09:46
【问题描述】:

一段时间以来,我一直在努力使用 CURL (PHP) 登录 Wordpress。我想我已经尝试了一切,但似乎我错过了一些东西。我登录时无法让 CURL 保存我的 Cookie。 奇怪的是,即使我无法将 cookie 保存到文件中,除了升级 Worpdress 插件(这就是我目前正在做的事情)之外,一切仍然或多或少地工作。我可以登录到 wordpress,我什至可以设置自动 ugprade preg_matching 链接并在其上卷曲 - Wordpress 核心升级没有问题,但由于某些原因,当涉及到插件时 - 我就是做不到。昨晚我有很多猜测问题出在哪里,但什么也没做。现在,当我决定比较从 CURL 和 FireFox 获得的 cookie 时,结果发现 CURL 没有 cookie。

好的,所以我在这里设置选项(不要介意评论的东西,我一直在检查所有评论的东西并将它们放入......)。

$cookieFile = 'cookies.txt'; 
$channel = curl_init();

curl_setopt_array($channel, array (
    CURLOPT_SSL_VERIFYPEER => FALSE,
    CURLOPT_TIMEOUT =>  60,
    CURLOPT_FOLLOWLOCATION =>  1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_COOKIEFILE => $cookieFile,
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_AUTOREFERER =>  true,
    CURLOPT_POSTFIELDS =>   $loginPostData,
    CURLOPT_POST =>  1,
    #CURLOPT_FRESH_CONNECT => 1
    #CURLOPT_FAILONERROR => 1
));
   # curl_setopt ($channel, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
#
# Shorten curl_exec for our $channel
#
function copen($openUrl, $custom = FALSE) {
global $channel;global $siteUrl;
if($custom) {$siteUrl = "";}
curl_setopt ($channel, CURLOPT_URL, $siteUrl.$openUrl);
$result = curl_exec ($channel) or die(curl_error($channel));
echo "<h3> Opening: $openUrl </h3>";
return $result;
}

所以我进行了搜索,并尝试获取 cookie,但失败了:

     preg_match('/^Set-Cookie: (.*?);/mi', $result, $m);
     echo(parse_url($m[1]));

我还尝试使用 file_get_contents() 回显 $cookieFile - 为空。我现在检查了大约 15 次文件 - 这是一个 777 可写文件。我尝试使用 file_put_contents() 写入它并成功,因此文件位置和/或权限存在错误。我显然错过了一些东西,我只是看不到它。

最好的问候:)

【问题讨论】:

    标签: php cookies curl


    【解决方案1】:

    嗯,我去年做了一个网络机器人,这就是我使用的代码: 我清楚地记得该脚本 100% 有效。当然,我有一个功能可以检查我是否已登录,如果未登录,则 login();

    function init($username,$password,$mainurl){
        global $curl;
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($curl, CURLOPT_COOKIEFILE, "$username");
        curl_setopt($curl, CURLOPT_COOKIEJAR, "$username"); 
    
        login($curl,$username,$password,$mainurl);
    }
    function login($curl,$username,$password,$mainurl){
        $logindata="some_login_data";
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_URL, "SITE LOGIN PAGE URL");
        curl_setopt($curl, CURLOPT_POSTFIELDS, $logindata);
        return curl_exec($curl);
    }
    

    【讨论】:

    • 在使用此登录后,您是否能够保持 cookie/会话处于活动状态?这意味着 - 您可以在登录后抓取页面而不重新登录吗?
    • 是的,cookie 保存在浏览器中。而且您不需要再次登录(仅当您关闭浏览器或 cookie 过期时)
    • 好的,那我想我知道我遇到了什么问题! - 我正在尝试的是让 PHP 本身 CURL 页面,而不是在我的浏览器中打开它!我仍然不知道如何解决这个问题......
    • 那么尝试使用我的代码并告诉我它是否有效。为什么你不想从浏览器打开 PHP?那你是怎么执行代码的?
    • 我正在编写的脚本是每周使用 CRON 运行一次,所以我会自动更新我的 Wordpress 网站。
    【解决方案2】:

    好的,所以我找到了解决方案。 在使用 HTML 内容中的 preg_match() 匹配要抓取的链接后,您需要先转义链接(原因我还不知道)。 我们这样做: html_entity_decode($match)

    【讨论】:

      【解决方案3】:

      对于其他一些人,请检查您是否使用 绝对路径 到 cookie 文件!

      'C:\wamp\www\cookie.txt'

      代替:

      'cookie.txt'

      curl_setopt($curl, CURLOPT_COOKIEFILE, 'C:\wamp\www\cookie.txt');
      curl_setopt($curl, CURLOPT_COOKIEJAR, 'C:\wamp\www\cookie.txt');
      

      【讨论】:

        【解决方案4】:

        遇到同样的问题,最后通过调用 curl_close() 解决了这个问题。如果丢失,则不会保存 cookie。

        【讨论】:

          猜你喜欢
          • 2013-11-12
          • 2016-11-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-18
          • 2017-10-29
          • 2014-04-23
          • 2011-10-11
          相关资源
          最近更新 更多