如何使用PHP的cURL获取Reddit源?

时间:2015-04-04 00:00:19

标签: php curl cookies embed

我正在尝试使用PHP的cURL从我的Reddit帐户获取Feed。因此,我需要保留我的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;
?>

2 个答案:

答案 0 :(得分:2)

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

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

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

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

执行此操作

第二,您的代码存在一些语法问题。

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

  • 所有这一切,您应该使用DIRECTORY_SEPARATOR代替。

  • 您正在混合使用单引号(')和双引号(")。在PHP中,这具有重要意义。有关详细信息,请阅读strings上的文档。

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

所以现在我们需要确定一些事情,如果你提供你的cookie文件,这将有助于我们调试。 加扰值,以便我们无法劫持您的会话。

  • 究竟是什么回归卷曲?

  • 您的浏览器输出了什么内容?

  • 什么时候生成了Cookie值? Cookie可能已过期。

答案 1 :(得分:0)

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