如何使用 PHP 的 cURL 获取 Reddit 提要?

How to obtain a Reddit feed using PHP's cURL?

我正在尝试使用 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;
?>

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

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

首先,你声明你希望这个脚本让你登录到reddit。大概这是一个 web-accessible PHP 脚本,您的目标是在访问此页面时在浏览器中设置 cookie。

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

问题 2:您没有向浏览器发送任何 headers(包括 cookie),但我怀疑您还没有做到这一点。当你到达那里时,你可以用 header() or setcookie().

来做到这一点

其次,你的代码有一些语法问题。

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

  • 综上所述,您应该改用 DIRECTORY_SEPARATOR

  • 您正在混合使用 single-quotes (') 和 double-quotes(")。在 PHP 这具有重要意义。阅读 strings 上的文档以获取更多信息。

  • 您还混合了 forward-slashes (/) 和 back-slashes (\) 作为您的目录路径。

所以现在我们需要确定一些事情,如果你提供你的cookie文件,它会帮助我们调试。 扰乱值,这样我们就无法劫持你的session。

  • 实际上返回给 curl 的是什么?

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

  • cookie 值是什么时候生成的?可能cookie已经过期了。