5

私はPerlに非常に慣れていないので、仕事のためにいくつかのプロジェクトを自動化しようとしている間、その場で学習しています。これまでのところ、とても楽しかったです。

私は顧客向けのレポートの作成に取り組んでいます。このレポートは、アクセスできるWebページから取得できます。まず、フォームにユーザー名とパスワードを入力し、ドロップダウンリストからサーバーを選択してログインする必要があります。次に、レポートセクションのリンクをクリックする必要があります。第三に、レポートを作成するためにフォームに記入する必要があります。

これが私がこれまでに書いたものです:

my $mech = WWW::Mechanize->new();
my $url = 'http://X.X.X.X/Console/login/login.aspx';

$mech->get( $url );

$mech->submit_form(
     form_number => 1,
     fields      =>{
        'ctl00$ctl00$cphVeriCentre$cphLogin$txtUser'  => 'someone',
        'ctl00$ctl00$cphVeriCentre$cphLogin$txtPW'    => '12345',
        'ctl00$ctl00$cphVeriCentre$cphLogin$ddlServers'  => 'Live',
     button => 'Sign-In'
   },   
);
die unless ($mech->success);

$mech->dump_forms();

理由はわかりませんが、この後、どのダンプが出力されるかを確認し、最初のログインページのコードを確認します。ログインに成功すると、次のページに到達するはずです。

私とログイン試行に影響を与える可能性のあるCookieを含む何かがありますか?

私が間違っている他の何か?

助けてくれてありがとう、Yaniv

4

5 に答える 5

6

これは事実から数か月後ですが、同様の質問に基づいて同じ問題を解決しました。クライアント側からポストバックを自動化することは可能ですか? を参照してください。詳細については。

代わりに Python の Mechanize または Perl を使用しましたが、同じ原則が当てはまります。

私の以前の回答を要約すると:

ASP.NET ページには、フォーム内に __EVENTTARGET という隠しパラメーターが必要です。これは、通常の機械化を使用する場合には存在しません。

通常のユーザーがアクセスすると、これらのページに __doPostBack('foo') 関数があり、各リンクの javascript onclick イベントを介して __EVENTTARGET に関連する値を与えますが、mechanize は javascript を使用しないため、必要になりますこれらの値を自分で設定します。

python の解決策は以下にありますが、perl に適応させるのはそれほど難しいことではありません。

def add_event_target(form, target):
    #Creates a new __EVENTTARGET control and adds the value specified
    #.NET doesn't generate this in mechanize for some reason -- suspect maybe is 
    #normally generated by javascript or some useragent thing?
    form.new_control('hidden','__EVENTTARGET',attrs = dict(name='__EVENTTARGET'))
    form.set_all_readonly(False)
    form["__EVENTTARGET"] = target
于 2009-08-17T20:07:06.173 に答える
2

あなたはあなたが知っているものだけを機械化することができます。これ以上コードを書く前に、Firebugのようなツールを使用して、これを手動で行うときにブラウザーで何が起こっているかを調べることをお勧めします。

もちろん、使用されるCookieがある可能性があります。または、非表示のフォームパラメータを忘れた可能性がありますか?あなただけが言うことができます。

編集:

  • WWW :: Mechanizeは、それ以上の介入なしにCookieを処理する必要があります。
  • 呼び出したメソッドが成功したかどうかを常に確認する必要があります。最初のget()は機能しますか?
  • サーバーログを調べて、実際に何が要求され、どのHTTPステータスコードが応答として送信されるかを確認すると便利な場合があります。
于 2009-06-09T09:38:53.520 に答える
2

Windows を使用している場合は、Fiddlerを使用して、このプロセスを手動で実行したときに送信されるデータを確認し、Fiddler を使用して、スクリプトで実行したときにキャプチャされたデータと比較します。

私の経験では、フォームの投稿を検査するときは、 Fiddlerのような Web デバッグ プロキシの方が Firebug よりも便利です。

于 2012-05-10T11:47:34.330 に答える
1

WiresharkでWeb 自動化を作成するときに utilityを使用すると非常に役立つことがわかりましたWWW::Mechanize。それはいくつかの点であなたを助けます:

  1. HTTP リクエストが成功したかどうかを確認できます。
  2. HTTP レベルでの失敗の理由を参照してください。
  3. サーバーに渡す正確なデータを追跡し、何を受け取るかを確認します。

ネットワーク トラフィック用の HTTP フィルタを設定し、Perl スクリプトを開始するだけです。

于 2013-03-19T03:30:39.300 に答える
0

aspx ページの非常に短い要旨は、一般的な aspx フォームで "__" が前に付いたいくつかの変数内にすべてのローカル セッション情報を保持することを示しています。通常、これは最上位のフォームであり、すべてのフォーム要素がその一部になりますが、実装によって異なる可能性があると思います。

私が扱っていた特定の実装では、これらの状態変数のうち 2 つについて心配する必要がありました。具体的には次のとおりです。

__VIEWSTATE
__EVENTVALIDATION.

あなたの目標は、これらの変数が送信するフォームに送信されることを確認することです。これらの変数は、上記のメイン フォーム aspxform の一部である可能性があり、おそらくそれとは異なるフォームを送信するからです。

ブラウザーが aspx ページをロードすると、JavaScript の一部がこのセッション情報を asp サーバー/クライアント インタラクション内で渡しますが、もちろん、perl 機械化ではそのような余裕がないため、追加して手動でこれらを自分で投稿する必要があります。 mechanize を使用して要素を現在のフォームに変換します。

解決したばかりの場合、基本的にこれを行いました:

my $browser = WWW::Mechanize->new( );

# fetch the login page to get the initial session variables
my $login_page = 'http://www.example.com/login.aspx';
$response = $browser->get( $login_page);

# very short way to find the fields so you can add them to your post
$viewstate = ($browser->find_all_inputs( type => 'hidden', name => '__VIEWSTATE' ))[0]->value;
$validation = ($browser->find_all_inputs( type => 'hidden', name => '__EVENTVALIDATION' ))[0]->value;

# post back the formdata you need along with the session variables
$browser->post( $login_page, [ username => 'user', password => 'password, __VIEWSTATE => $viewstate, __EVENTVALIDATION => $validation ]);

# finally get back the content and make sure it looks right
print $response->content();
于 2012-05-10T01:48:40.390 に答える