我使用插件WWW::Scripter(WWW::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.
答案 0 :(得分:4)
credentials
对standard 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,则验证失败。