2012-05-07 6 views
1

Я использую плагин WWW::Scripter (подкласс WWW::Mechanize) для аутентификации на странице входа моего хоста. Они используют Ruby с некоторыми функциями JavaScript на странице входа, поэтому я не могу просто использовать модуль LWP::Agent. Вот код:Проблема аутентификации с WWW :: Scripter

#!/usr/bin/env perl 
use strict; 
use warnings; 
use diagnostics; 

use LWP::Debug qw(+); 
use LWP::ConnCache; 
use WWW::Scripter; 

my $url = 'https://control.vp.net/login'; 
my $username = '[email protected]'; 
my $password = 'example'; 

my $w = WWW::Scripter->new(keep_alive => 1) or die "error1: $!\n"; 
$w->conn_cache(LWP::ConnCache->new); 
$w->use_plugin('JavaScript') or die "error2: $!\n"; 
$w->credentials($url, undef, $username, $password) or die "error3: $!\n"; 
$w->get($url) or die "error4: $!\n"; 
print $w->content() or die "error5: $!\n"; 

Я имею следующее сообщение об ошибке:

Uncaught exception from user code: 
error3 

Я потратил несколько часов, и прибегая к помощи я чувствую, что мне действительно нужно некоторые помощь в настоящее время. Я буду признателен за любую помощь, которая поможет понять, почему я не могу аутентифицироваться. Моя версия Perl 5.10.1 на Ubuntu 11, если это имеет значение.

Спасибо.

Update

Я изменил одну строку в коде:

$w->credentials($username, $password) or die "error3: $!\n"; 

и получать только белую страницу в настоящее время. Если я включаю диагностики прагму, появляется довольно общая ошибка:

Use of uninitialized value in subroutine entry at blib/lib/Net/SSLeay.pm 
(autosplit into blib/lib/auto/Net/SSLeay/randomize.al) line 2227 (#1) 
(W uninitialized) An undefined value was used as if it were already 
defined. It was interpreted as a "" or a 0, but maybe it was a mistake. 
To suppress this warning assign a defined value to your variables. 
+1

Попробуйте использовать '$ w-> credentials ($ username, $ password)', no '$ url, undef'. Класс 'WWW :: Scripter' является подклассом' WWW :: Mechanize', поэтому см. Http://search.cpan.org/~jesse/WWW-Mechanize-1.72/lib/WWW/Mechanize.pm для документации 'credentials' –

+0

Благодарим вас за ответ. Я обновил свой пост. Не могли бы вы помочь устранить белую страницу? – Andrew

+1

Вы используете правильный '$ url'? Временно удалите строку '$ w-> use_plugin ('JavaScript') или умрите« error2: $! \ N »;', чтобы узнать, получаете ли вы белую страницу в результате какого-либо скрипта с этой страницы или просто потому, что это содержимое страницы. –

ответ

4

credentials подходит для standard HTTP authentication, но веб-формы - это нечто иное. Удалите этот вызов метода и узнайте, как функционируют веб-формы. JavaScript не влияет на веб-форму, Mechanize достаточно.

use strictures; 
my ($url, $username, $password) 
    = qw(https://control.vps.net/login [email protected] example); 
my $w = WWW::Mechanize->new; 
$w->get($url); # automatically raises exception on HTTP errors 
$w->submit_form(with_fields => { 
    'session[email_address]' => $username, 
    'session[password]' => $password, 
}); 
die 'login failed' 
    if $w->content =~ /your email and password combination were incorrect/; 
+1

Связанный: http://stackoverflow.com/questions/8670353/auto-login-web-form – daxim

+0

Я очень благодарен за вашу отличную помощь. – Andrew

2

Вы не можете просто ожидать, каждая функция возвращает значение truthy на успех и falsy значение в случае неудачи, как это.

entry for credentials, например, ничего не говорит о том, что он возвращает, поэтому вы не должны пытаться ничего делать с тем, что он возвращает.

То же самое относится к get - он возвращает объект ответа, который предположительно всегда будет истинным.

Вам необходимо вызвать все функции, а затем проверить $w->status(). Если он возвращает 401 или 403, аутентификация завершилась неудачно.

+0

Я попытался добавить статус метода после каждой строки, но он, к сожалению, не показывает номер ошибки. – Andrew

+1

'status()' действует только после вызова 'get()'. –

+1

Если OP получает ответ, статус должен быть в порядке. –

Смежные вопросы