【问题标题】:Obtain phpBB remote session获取phpBB远程会话
【发布时间】:2010-10-05 14:49:35
【问题描述】:

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

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

有什么解决方法吗?

【问题讨论】:

    标签: php session curl login phpbb


    【解决方案1】:

    这通常对我有用

    
    $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 会跨会话保存,并且脚本不必在每次执行某些操作时都登录。

    ---解释如下----

    我正在使用一个对象,但您可以将 $this->handle 替换为一个名为 $mycurl 的简单变量,这些行将类似于

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

    以下代码的作用是: - 初始化“一个 curl 实例”(为了简单起见)(第 3 行) - 第 4 和第 5 行:将 cookie 保存到文件中。 curl 就像浏览器一样工作,因此当您使用 curl 登录页面时,它会将带有身份验证数据的 cookie 保存在内存中。我告诉它把它保存到一个文件中,这样我第二次运行脚本时它就会有相同的 cookie,并且不需要再次进行身份验证。或者,您可以使用同一个 cookie 文件拥有多个脚本,并且每 24 小时运行一次或在您注销时运行一个用于登录的脚本...... - 其他设置: * followlocation - 当 curl 接收到一个 http 重定向它应该返回它被重定向到的页面,而不是重定向代码 * useragent - curl 将自己呈现为 firefox * timeout - 等待建立连接的时间,通常 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 和其他选项的设置。我希望上面的例子对你有用。祝你好运。

    【讨论】:

    • 感谢您的回复,但您能解释一下吗?你到底在做什么使用 cookies.jar 文件?而且我认为您正在为第二个脚本使用一些框架……是吗?
    • 在第一篇文章中解释了一些信息,添加了一个简单易用的类。如果您有更多问题,请随时提问。通常有帮助的是,每次您抓取文件时,将其以 txt 格式保存到硬盘驱动器,然后查看您得到的响应。
    • 非常感谢您的解释。我马上去试试。 :)
    • 像魅力一样工作.. :) 稍后将发布更多查询(如果有)。 :)
    • 嗨 vlad b.,我使用您的代码来尝试实现我在 ["Login to cpanel from php script without passing credentials back to browser"][1] 中所做的事情,但是很接近,但是我不在那里。使用您的代码,我现在可以登录到 cpanel,但是抓取的页面不完整,并且 cpanel 超链接被弄乱了。有什么方法可以让我通过 curl 登录到 cpanel,然后简单地重定向到 cpanel.myweb.com,此时我可以访问 cpanel 而无需请求凭据?谢谢[1]:stackoverflow.com/questions/4931226/…
    【解决方案2】:

    是的,您必须保存 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 选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-26
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2014-07-31
      相关资源
      最近更新 更多