获取phpBB远程会话

时间:2010-10-05 14:49:35

标签: php session curl login phpbb

我想从我所属的phpBB论坛中抓取一些数据。但为此,需要登录。我可以使用cURL登录,但是如果我在使用cURL登录后尝试抓取数据,它仍然显示我需要在查看该页面之前登录。是否可以使用cURL登录并保留该会话以进行更远的工作?

另一方面,该论坛通常在登录后显示确认页面,然后在5秒后自动重定向到索引页面。问题是,如果我使用cURL登录,我的脚本也会按照该标题位置显示该页面..

有什么解决方法吗?

2 个答案:

答案 0 :(得分:2)

这通常对我有用


$timeout=5;
$file='cookies.jar';
$this->handle=curl_init('');
curl_setopt($this->handle, CURLOPT_COOKIEFILE,  $file);
curl_setopt($this->handle, CURLOPT_COOKIEJAR,   $file);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($this->handle, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($this->handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 (.NET CLR 3.5.30729)");
curl_setopt($this->handle, CURLOPT_TIMEOUT, round($timeout,0));
curl_setopt($this->handle, CURLOPT_CONNECTTIMEOUT, round($timeout,0));

我通常会像这样使用它


$now=grab_first_page();
if(not_logged_in($now)) {
   send_login_info();
}
if(not_logged_in()) { end_of_script_with_error(); }
// rest of script

通过这种方式,cookie可以跨会话保存,并且每次执行某些操作时脚本都不必登录。

---探索以下----

我正在使用一个对象,但你可以用一个名为$ mycurl的简单变量替换$ this->句柄,这些行就像


$mycurl=curl_init(''
curl_setopt($mycurl, CURLOPT_COOKIEFILE, $file)

以下代码的作用是: - 初始化“卷曲实例”(保持简单)(第3行) - 第4行和第5行:将cookie保存到文件中。 Curl就像浏览器一样工作,因此当您使用curl登录页面时,它会将带有身份验证数据的cookie保留在内存中。我告诉它将它保存到文件中,以便第二次运行脚本时它将具有相同的cookie,并且不需要再次进行身份验证。或者,您可以使用相同的cookie文件创建多个脚本,只需一个用于每24小时或每次注销时运行的登录... - 其他设置: * followlocation - 当curl收到http重定向时,它应该返回重定向到的页面,而不是重定向代码 * useragent - curl呈现为​​firefox *超时 - 等待连接建立的时间,通常为5或10绰绰有余

我在这里使用了一个简单的课程http://pastebin.com/Rfpc103X

你可以像这样使用它



// -- initialize curl
$ec=new easyCurl;

// -- set some options
//if the file you are in right now is named file_a.php it will create a file_a.jar cookie file
$ec->start(str_replace('.php','.jar',__FILE__));
$ec->headersPrepare(false);
$ec->prepareTimeOut(20);

$url='http://www.google.com/';

// --- set url
$ec->curlPrepare($url);

// --- get the actual data
$page=$ec->grab();

echo $page;

// to send GET data
$get_data=array('id'=>10);
$ec->curlPrepare($url,$get_data);

// and to post data
$post_data=array('user'=>'blue','password'=>'black');
$ec->curlPrepare($url,array(),$post_data);

它会自动处理POST / GET的设置以及我经常遇到的其他选项。我希望上面的例子对你有用。祝你好运。

答案 1 :(得分:0)

是的,你必须保存cookie。为此,您可以在登录时创建一个cookie jar,您可以在以后访问论坛时重复使用它。

curl --cookie-jar cjar -d "somelogindata" http://example.com/phpbb/login.php

这将创建一个cjar cookie jar文件,然后您可以在以后的请求中重复使用该文件:

curl --cookie-jar cjar --cookie cjar http://example.com/phpbb/viewforum.php?foobar

--cookie-jar选项指定保存cookie的文件;要使用它们,请使用--cookie选项。要更新Cookie,您还应始终提供--cookie-jar选项。