3

WWW::MechanizeでPerlを使用して Web サイトに自動的にログインしようとしています。

私がすることは:

$bot = WWW::Mechanize->new();
$bot->cookie_jar(
        HTTP::Cookies->new(
            file           => "cookies.txt",
            autosave       => 1,
            ignore_discard => 1,
        )
);

$response = $bot->get( 'http://blah.foo/login' );

$bot->form_number(1);

$bot->field( usern => 'user' );
$bot->field( pass => 'pass' );
$response =$bot->click();

print $response->content();

$response = $bot->get( 'http://blah.foo' );

print $response->content();

ログインは機能しますが、ページをロードすると、接続されていないと表示されます。

Cookie をファイルに保存していることがわかります。ログイン部分なしでスクリプトを再起動すると、接続されていると表示されます...

誰もこの奇妙な振る舞いを理解していますか?

編集: 実際、特定のプラットフォームの一部の Web ブラウザーでも問題が発生することに気付きました。ページには「ログインしていません」と表示されます。ただし、ログインするにはページをリロードするだけで十分です。

スクリプトでは、ダブル get を実行しようとしましたが、うまくいきません。唯一の方法は、2 回起動することです。

最後のリクエストを2回行ったときにcurlで機能しました。

4

1 に答える 1

2

私が見た一部のWebサイトは、すべてのページでセッションCookieを正しく設定または処理していないため、「予期しない」順序でページにアクセスすると失敗します。たとえば、ログインページ、ログインハンドラーページ、または一部のポップアップコンテンツページでは、サイトの通常のページによって既に設定されているセッションCookieが表示されることを期待している場合があります。

これは問題のように聞こえます。これは、ページをフェッチするときにCookieがすでに設定されている場合に2回目に機能するためです。

私は、実際のログイン部分に進む前にいくつかの「通常の」ページをフェッチすることによって、スクリプトでより一般的なブラウザのユーザーセッションアクティビティをシミュレートすることにより、この種の問題を回避しました。

$www->get('http://www.example.com');         # Homepage
$www->get('http://www.example.com/account'); # Authenticated section front page
# Now everything is set up, proceed with account login...
于 2010-04-05T17:44:17.320 に答える