我正在尝试使用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;
?>
答案 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上。)