【问题标题】:How to obtain a Reddit feed using PHP's cURL?如何使用 PHP 的 cURL 获取 Reddit 提要?
【发布时间】:2015-04-04 00:00:19
【问题描述】:

我正在尝试使用 PHP 的 cURL 从我的 Reddit 帐户获取提要。因此,我需要保留我的 cookie,目前我正在尝试使用 Netscape 格式的 cookies.txt 文件来执行此操作,但这些并没有应用于页面。我想我一定是在做一些愚蠢的事情。

最终结果我希望在显示之前让页面自动登录到 Reddit,但我希望在跳到更复杂的事情之前先学习一下。

<?php       
    //format cookies.txt file by adding semi colons to the end of new lines if they aren't already there and removing colons added to #'s
    $cookies = file_get_contents('.\cookies.txt');
    $cookies = str_replace("\n",";\n",$cookies);
    $cookies = str_replace("#;","#",$cookies);
    $cookies = str_replace(";;",";",$cookies);
    file_put_contents("./cookies.txt", $cookies);

    //set user agent and url + initiate
    $user_agent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36";
    $url = 'http://www.reddit.com';
    $c = curl_init($url);

    //My options
    $options = array(
        CURLOPT_CUSTOMREQUEST  =>"GET",        //set request type post or get
        CURLOPT_POST           =>false,        //set to GET
        CURLOPT_USERAGENT      => $user_agent, //set user agent
        CURLOPT_COOKIEFILE     =>".\cookies.txt", //set cookie file
        CURLOPT_COOKIEJAR      =>".\cookies.txt", //set cookie jar
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );
    curl_setopt_array( $c, $options );
    //curl_setopt(... other options you want...)

    $html = curl_exec($c);

    if (curl_error($c))
        die(curl_error($c));

    // Get the status code
    $status = curl_getinfo($c, CURLINFO_HTTP_CODE);

    curl_close($c);

    //get html
    echo $html;
?>

【问题讨论】:

    标签: php curl cookies embed


    【解决方案1】:

    这里有几个问题。让我们一次解决一个。

    首先,您声明您希望此脚本将您登录到 reddit。大概这是一个可通过网络访问的 PHP 脚本,您的目标是在您访问此页面时在浏览器中设置 cookie。

    问题 1:如果 cookie 值特定于为其创建 cookie 的 IP 地址(可能还有其他因素),这可能是不可能的。我不熟悉 reddit 如何处理会话,所以我无法回答这个问题。如果 cookie 值可以在任何机器之间共享,那么您就可以开始了。

    问题 2:您没有向浏览器发送任何标头(包括 cookie),但我怀疑您还没有达到这一点。当您到达那里时,您可以使用header()setcookie() 进行此操作。

    其次,您的代码存在一些语法问题。

    • 您正在使用\ 作为目录分隔符。这是有问题的,因为单个反斜杠本身就是escape character。虽然\前面的字符没有转义(\n除外),但这不是一个好习惯。

    • 话虽如此,您应该改用DIRECTORY_SEPARATOR

    • 您正在混合使用单引号 (') 和双引号 (")。在 PHP 中,这很重要。阅读strings 上的文档以获取更多信息。

    • 您还在目录路径中混合使用正斜杠 (/) 和反斜杠 (\)。

    所以现在我们需要确定一些事情,如果您提供您的 cookie 文件,它将帮助我们进行调试。 打乱值,以免我们劫持您的会话。

    • 实际返回到 curl 的是什么?

    • 向您的浏览器输出什么?

    • cookie 值是何时生成的? cookie 可能已过期。

    【讨论】:

    • 非常感谢,我已将此标记为答案,因为它给了我很多研究,再次感谢您 :) 我将在星期二或星期三再次处理此问题,如果我还有问题,我会给你更多信息
    【解决方案2】:

    cURL 可以自行处理 cookie 文件的创建和处理。我建议删除您在//set user agent and url + initiate 之前编写的代码。下一步是确保cookies.txt 存在,并且运行您的脚本的用户具有访问该文件的适当权限(如果您在 Linux 上运行该文件,您应该使用 760、770 或 660)。

    【讨论】:

    • 让 curl 处理 cookie 的选项是 CURLOPT_COOKIEFILE。此外,这些权限有点宽松。如果执行脚本的用户是拥有该文件的用户,则文件模式 400 就足够了。如果执行用户在拥有该文件的组中,040 就足够了。
    • @aholmes 我不确定我是否理解您提到的CURLOPT_COOKIEFILE。 Shard 将它包含在 cURL 选项数组中,它告诉 cURL 处理 cookie。在此之前,cookies.txt 是打开并手动操作的。我的建议是消除手动操作。关于文件权限,Shard 还在他的 cURL 选项中包含了CURLOPT_COOKIEJAR,它告诉 cURL 它需要存储它收到的任何 cookie。为此,它需要对cookies.txt 的写入权限。 400 或 040 不允许这样做。
    • 我很抱歉。我误读了您的回答,并没有将 Shard 的代码用于我的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2020-11-23
    • 2017-01-21
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多