如何使用 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已经过期了。
我正在尝试使用 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已经过期了。