2

フォーラムで既に尋ねられた質問のように聞こえますが、ここでは少し異なるシナリオがあると思います..

Perl を使用して、認証が必要な Web サイトにログオンしようとしています。このタスクを達成するための最も便利なツールは、フォームに入力して送信するのが非常に簡単な WWW::Mechanize モジュールを使用することであることに既に気付きました。

私の場合、次のような問題が発生します。

  1. 入力したいフィールドに関連する「フォーム」がないようです。代わりに、フィールドは table にラップされます<table></table>
  2. ボタン自体は、Mechanize モジュールでサポートされていないことがわかっている JavaScript を起動するようです。ただし、このページの動作をテストするために、Chrome ブラウザーで JavaScript を無効にしましたが、ボタンをクリックしてサイトにログインすることはできました。したがって、ここではjavascriptは必須ではないと思います。
  3. 次のコードを使用していますが、入力した詳細 (ユーザー/パス) は問題ではないようです。何らかの理由で、常に「成功」​​シナリオに従い、「ログイン成功!」を受け取ります。

    my $mech = WWW::Mechanize->new(
     cookie_jar      => {},
     autocheck       => 1,
     onerror         => \&Carp::croak,);
    
    # Login Form
    my $response = $mech->get($url);
    if (!$response->is_success) {
        die "Login page unreachable $url: ",  $response->status_line, "\n";
    }
    
    $mech->field('Email', $Email);
    $mech->field('Password', $Password);
    $response = $mech->click();
    if ($response->is_success) {
        print "Login Successful!\n";
    } else {
        die "Login failed: ",  $response->status_line, "\n";
    }
    

その結果、スクリプトの実行は成功しているように見えますが、既にログオンしていると仮定してサイトからデータを取得しようとすると、(スニファーで) 「登録」ページに継続的に転送されていることがわかります。 .

どんな助けでも大歓迎です!

前もって感謝します!

4

3 に答える 3

2

$response->is_successHTTPエラーなしでターゲットサイトの応答を確認するだけかどうかを確認する場合。ただし、代わりに、応答ページにテキストが含まれているかどうかを確認する必要があります。たとえば、「AuthERROR!」等

ターゲットサイトが無効なJavaScriptで動作する場合、これは問題ではありません。

フォームに送信されたデータにxとy(マウスポインターの座標)を追加してみてください(一部のサイトではこの情報を確認してください)。

HTTPトラフィック監視ツールを使用して、ブラウザがターゲットサイトに送信するデータを確認し(Firefox HTTPFox拡張機能を使用)、WWW::Mechanizeを介して同じリクエストを行うことができます。

また、WWW::Mechanizeはcookie_jarを必要としません。デフォルトでCookieを処理します。

このコードを試してください:

$mech->get($url);
$mech->submit_form(
    form_name => 'aspnetForm',
    fields => {
        'ctl00$cph1$lg1$txtEmail' => $login,
        'ctl00$cph1$lg1$txtPassword' => $password,
    },
    button => 'ctl00$cph1$lg1$btnLogin',
);
于 2011-12-29T01:28:52.307 に答える
2

If it's not in a form tag then there's a submit button somewhere which is using a GET request to send all the variables to the same (most likely) URL.

Why are you trying to emulate using a browser to click the authentication button, is there some other hidden field or something that you need access to?

In my eyes, the best way is to find out the page that is actually authenticating the user and password and use a SSL POST request to that page.

If the page has something like:

<input type="text" name="user" />
<input type="password" name="pass" />

Send over a HTTP POST request to whatever the login page is (likely the same page if no <form> is defined). The POST variables will be user=$value and pass=$other_value.

于 2011-12-28T19:52:29.947 に答える
2

この問題を解決する方法を理解したようです。Wireshark スニファーを使用して、ブラウザーを使用するときに送信される HTTP ヘッダーと、mechanize オブジェクトによって作成されたヘッダーの違いを分析しました。機械化によって生成された「接続」ヘッダーには「TE、閉じる」値が含まれていましたが、ブラウザーは「キープアライブ」値を含む「接続」ヘッダーを発行しました。さらに、ブラウザが生成したリクエストには、追加の「Keep-Alive: 115」ヘッダーが含まれていました。次のように、これらのヘッダーを mech オブジェクトに手動で追加しました。

  $mech->add_header(
  "Connection" => "keep-alive",
  "Keep-Alive" => "115");

これで問題が解決し、正常にログインできました!

あなたの貢献と助けに感謝します!とても感謝しています!

于 2012-01-02T09:14:54.953 に答える