Печенье в Perl LWP - PullRequest
       18

Печенье в Perl LWP

1 голос
/ 11 февраля 2011

Однажды я написал простой сканер для загрузки http-страниц для меня в JAVA.Теперь я пытаюсь переписать то же самое в Perl, используя модуль LWP.

Это мой код Java (который отлично работает):

<code>String referer = "http://example.com";
String url = "http://example.com/something/cgi-bin/something.cgi";
String params= "a=0&b=1";</p>

<p>HttpState initialState = new HttpState();
HttpClient httpclient = new HttpClient();
httpclient.setState(initialState);
httpclient.getParams().setCookiePolicy(CookiePolicy.NETSCAPE);</p>

<p>PostMethod postMethod = new PostMethod(url);
postMethod.addRequestHeader("Referer", referer);
postMethod.addRequestHeader("User-Agent", " Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13");
postMethod.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,<em>/</em>;q=0.8");
postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");</p>

<p>String length = String.valueOf(params.length());
postMethod.addRequestHeader("Content-Length", length);
postMethod.setRequestBody(params);</p>

<p>httpclient.executeMethod(postMethod);

И это версия Perl:

my $referer = "http://example.com/something/cgi-bin/something.cgi?module=A";
my $url = "http://example.com/something/cgi-bin/something.cgi";
my @headers = (
  'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13',
  'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Referer' => $referer,
  'Content-Type' => 'application/x-www-form-urlencoded',
);

my @params = (
    'a' => '0',
    'b' => '1',
);

my $browser = LWP::UserAgent->new( );
$browser->cookie_jar({});

$response = $browser->post($url, @params, @headers);
print $response->content;

Запрос на публикацию выполняется правильно, но я получаю другую (главную) веб-страницу.Как будто куки не работают должным образом ...

Есть предположения, что не так?Почему я получаю разные результаты от программ JAVA и Perl?

Ответы [ 3 ]

7 голосов
/ 11 февраля 2011

Вы также можете использовать WWW :: Mechanize, который является оболочкой для LWP :: UserAgent.Это дает вам банку печенья автоматически.

4 голосов
/ 11 февраля 2011

Вы хотите создавать хэши, а не массивы - например, вместо:

my @params = ( 'a' => '0', 'b' => '1', );

Вы должны использовать:

my %params = ( a => 0, b => 1, );

При передаче параметров в метод записи LWP :: UserAgent вам необходимо передать ссылку на хеш, например:

$response = $browser->post($url, \%params, %headers);

Вы также можете посмотреть запрос, который вы отправляете на сервер:

print $response->request->as_string;

Вы также можете использовать обработчик для автоматического вывода запросов и ответов в целях отладки:

$ua->add_handler("request_send", sub { shift->dump; return }); $ua->add_handler("response_done", sub { shift->dump; return });

1 голос
/ 11 февраля 2011

Я считаю, что это связано с $response = $browser->post($url, @params, @headers);

Из doc из LWP :: UserAgent

$ua->post( $url, \%form )
$ua->post( $url, \@form )
$ua->post( $url, \%form, $field_name => $value, ... )
$ua->post( $url, $field_name => $value,... Content => \%form )
$ua->post( $url, $field_name => $value,... Content => \@form )
$ua->post( $url, $field_name => $value,... Content => $content )

Поскольку ваши параметры и заголовки являются хешамиЯ бы попробовал это:

my $referer = "http://example.com/something/cgi-bin/something.cgi?module=A";
my $url = "http://example.com/something/cgi-bin/something.cgi";
my %headers = (
  'User-Agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13',
  'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Referer' => $referer,
  'Content-Type' => 'application/x-www-form-urlencoded',
);

my %params = (
    'a' => '0',
    'b' => '1',
);

my $browser = LWP::UserAgent->new( );
$browser->cookie_jar({});

$response = $browser->post($url, \%params, %headers);
...