WWW :: Scripter的身份验证问题

时间:2012-05-07 23:15:41

标签: perl mechanize www-mechanize

我使用插件WWW::ScripterWWW::Mechanize的子类)来验证我的主机的登录页面。他们在登录页面上使用Ruby和一些JavaScript函数,因此我不能只使用LWP::Agent模块。这是代码:

#!/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 = 'example@example.com';
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版本在Ubuntu 11上是5.10.1。

感谢。

更新

我已将代码中的一行更改为:

$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.

2 个答案:

答案 0 :(得分:4)

credentialsstandard HTTP authentication有好处,但Web表单有所不同。删除该方法调用并了解Web表单的功能。 JavaScript对Web表单没有影响,Mechanize就足够了。

use strictures;
my ($url, $username, $password)
    = qw(https://control.vps.net/login example@example.com 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 :(得分:2)

你不能简单地期望每个函数在成功时返回真值,而在失败时返回虚假值。

例如,entry for credentials没有说明它返回的内容,所以你不应该尝试做任何事情。

同样适用于get - 它返回一个响应对象,可能总是为真。

您需要调用所有函数,然后检查$w->status()。如果它返回401或403,则验证失败。