【问题标题】:Reading Firefox cookie using LWP使用 LWP 读取 Firefox cookie
【发布时间】:2013-08-14 17:27:35
【问题描述】:

我试图通过读取浏览器 cookie(我之前使用 Firefox 登录创建的)来消除登录网站的过程。我使用 Firefox addon 从 Firefox 导出它。它给出 200 OK 响应,但返回通用主页而不是我的自定义“登录”主页。如何确保 cookie 正确传递到服务器?

#!/usr/bin/perl 
use strict ;
use warnings;
use LWP::UserAgent;
use HTTP::Cookies::Netscape;

my @GHeader    = (
                        'User-Agent'      => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.19) Gecko/2010040200 Ubuntu/8.04 (hardy) Firefox/3.0.19',
                        'Accept'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                        'Accept-Language' => 'en-us,en;q=0.5',                        
                        'Accept-Charset'  => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
                        'Accept-Encoding' => 'gzip,deflate',
                        'Keep-Alive'      => '300',
                        'Connection'      => 'keep-alive'
                  );

    my $cookie_jar = HTTP::Cookies::Netscape->new(
                          file => "cookies.txt",
                          );
    my $Browser = LWP::UserAgent->new;
    $Browser->cookie_jar( $cookie_jar );
    my ($OutLine,$response)=();    
    my  $URL = 'http://www.hanggliding.org/';
    printf("Get [%s]\n",$URL);
    $response = $Browser->get($URL,@GHeader);
    if($response->is_success)
    {
        if($response->status_line ne "200 OK")
        {
                printf("%s\n", $response->status_line);       
        }
        else
        {
            printf("%s\n", $response->status_line);                      
            $OutLine =$response->decoded_content;
            open(HTML,">out.html");printf HTML ("%s",$OutLine);close(HTML);
        }
    }
    else
    {
        printf("Failed to get url [%s]\n", $response->status_line);
    }  

【问题讨论】:

    标签: perl http cookies lwp


    【解决方案1】:

    您可以inject a handler在处理过程中访问或修改请求/响应数据。

    引用 LWP::UserAgent 的文档:

    处理程序是在处理请求的各个阶段注入的代码。提供了以下方法来管理活动处理程序:

    $ua->add_handler( $phase => \&cb, %matchspec )

    添加要在给定处理阶段调用的处理程序。有关如何指定 %matchspec,请参阅 HTTP::Config 中的“匹配”。

    ...

    request_send => sub { my($request, $ua, $h) = @_; ... }

    此处理程序有机会在将请求发送到协议处理程序之前对其进行处理。如果它希望终止处理,它应该返回一个 HTTP::Response 对象;否则它应该什么都不返回。

    从那里,您可以注入一个处理程序来分析请求对象,否则什么也不做:

    use LWP::UserAgent;
    use Data::Dumper;
    
    sub dump_request {
        my ($request, $ua, $h) = @_;
        print Dumper($request);
        return undef;
    }
    
    my $browser = LWP::UserAgent->new;
    
    $browser->add_handler(
        request_send => \&dump_request,
        m_method => 'GET'
    );
    
    $browser->get('http://www.google.com');
    

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多