0

ブラウザーの Cookie (以前に Firefox を使用してログインして作成したもの) を読み取ることにより、Web サイトへのログイン プロセスを排除しようとしていました。このFirefox アドオンを使用して 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);
    }  
4

1 に答える 1

0

ハンドラーを挿入して、処理中に要求/応答データにアクセスまたは変更できます。

LWP::UserAgent のドキュメントの引用:

ハンドラーは、リクエストの処理中にさまざまなフェーズで挿入されるコードです。アクティブなハンドラを管理するために、次のメソッドが提供されています。

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

指定された処理フェーズで呼び出されるハンドラーを追加します。%matchspec の指定方法については、HTTP::Config の「Matching」を参照してください。

...

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');
于 2013-08-14T17:54:01.720 に答える