1

我正在使用插件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.
4

2 回答 2

4

credentials标准 HTTP 身份验证很有用,但 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/;
于 2012-05-08T08:19:18.300 回答
2

您不能像这样简单地期望每个函数都返回一个成功的真值和一个错误的失败值。

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

也是如此get- 它返回一个响应对象,这可能总是正确的。

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

于 2012-05-08T01:11:24.097 回答