2012-05-07 9 views
1

私のホストのログインページを認証するために、プラグインWWW::Scripter(サブクラスはWWW::Mechanize)を使用しています。彼らはRubyJavaScriptの機能をログインページに使用しているので、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のバージョンは、Ubuntu 11の場合は5.10.1です。

ありがとうございました。

更新

私はにコード内の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. 
+1

'$ w->資格($ username、$ password)'、 '$ url、undef'を使用しないでください。クラス 'WWW :: Scripter'は' WWW :: Mechanize'のサブクラスですので、 'credentials'のドキュメンテーションについてはhttp://search.cpan.org/~jesse/WWW-Mechanize-1.72/lib/WWW/Mechanize.pmを参照してください。 –

+0

返信いただきありがとうございます。私は自分の投稿を更新しました。ホワイトページのトラブルシューティングにお役立てください。 – Andrew

+1

正しい '$ url'を使用していますか?一時的に '$ w-> use_plugin( 'JavaScript')行を削除するか、error2:$!\ n"; "で終了して、そのページのスクリプトの結果として白いページを取得しているかどうかを調べるか、ページ内容。 –

答えて

4

credentialsstandard HTTP authenticationには適していますが、Webフォームは異なるものです。そのメソッド呼び出しを削除し、Webフォームの機能を学びます。 JavaScriptはWebフォームに影響を与えないので、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が応答を受け取った場合、ステータスは正常でなければなりません。 –