1

Win32 :: IE:Mechanizeをいじって、認証が必要ないくつかのサイトに自動的にアクセスしようとしています。これまでのところ、中程度の成功を収めています。たとえば、yahooメールボックスに自動的にログインできます。しかし、多くのサイトで、CAPTCHAと呼ばれる可能性のある何らかの画像検証メカニズムが使用されていることがわかりました。私は彼らに何もできません。しかし、私が自動アクセスしようとしているサイトの1つは、プレーンテキストの検証コードを使用しています。これは、選択可能およびコピー可能な4桁で構成されています。ただし、これらは、を使用してフェッチできるソースファイルには含まれていません。

$mech->content;

インターネット一時ファイル内のすべてのファイルから、Webページに表示されているがソースファイルには表示されていないキーワードを検索しましたが、それでも見つかりません。

何が起こっているのか分かりますか?確認コードがCookieファイルに隠されているのではないかと思っていましたが、見つからないようです:(

以下は、検証コードを除くすべてのフィールド要件を完了するコードです。

use warnings;
use Win32::IE::Mechanize;

my $url = "http://www.zjsmap.com/smap/smap_login.jsp";
my $eccode = "myeccode";
my $username = "myaccountname";
my $password = "mypassword";
my $verify = "I can't figure out how to let the script get the code yet"

my $mech = Win32::IE::Mechanize->new(visible=>1);
$mech->get($url);
sleep(1); #avoids undefined value error
$mech->form_name("BaseForm");
$mech->field(ECCODE => $eccode);
$mech->field(MEMBERACCOUNT => $username);
$mech->field(PASSWORD => $password);
$mech->field(verify => $verify);
$mech->click();

いつものように、どんな提案/コメントも大歓迎です:)

アップデート

私はこの問題を解決するためのそれほど賢くない方法を考え出しました。以下に投稿された私自身の回答にコメントしてください。いつものようにありがとう:)

4

4 に答える 4

3

これが彼らがそこにいる理由です。自動化されたものを実行するためにあなたのようなプログラムを停止するには;-)

CAPTCHAまたはCaptchaは、コンピューターによって応答が生成されないことを確認するためにコンピューティングで使用されるチャレンジ/レスポンステストの一種です。

于 2010-02-25T05:58:10.267 に答える
2

これは無関係な数字のようです。ページはそれを 3 つの場所で使用します。入力フィールドの隣のフォームに表示します。入力値が選択された乱数と等しいことを確認します。つまり、これはクライアントのみのチェックです。それでも、javascript を無効にすると、重要な Cookie が設定されないように見えます。ページのコンテキストで JavaScript を実行できる場合 (get メソッド呼び出しと JavaScript URI を使用して実行できるはずです)、random_number の値を fe 42 に変更し、フォームに入力することができます。

于 2010-02-25T07:46:32.160 に答える
0

コードはJavaScriptによって挿入されます– JSを無効にし、ページをリロードして、ページが消えることを確認します。JSコードを調べて、どこから来たのか、どのように複製するのかを理解する必要があります。

于 2010-02-25T06:01:50.880 に答える
0

james2vegas、zoul、Shoban に感謝します。

私はついに、ここで説明した問題を解決するための、それほどスマートではないが少なくとも実行可能な方法を自分で見つけました。ここでシェアしたいと思います。@james2vegas によって提案されたアプローチはおそらくはるかに優れていると思います...しかし、とにかく私は途中で学んでいます。

私のアプローチはこれです:

確認コードはソース ファイルにはありませんが、選択してコピーできるため、スクリプトでログイン ページのすべてをコピーして確認コードを抽出できます。

これを行うには、Win32::Guest モジュールの sendkeys 関数を使用して、ログイン ページへの「すべて選択」および「コピー」を実行します。

次に、Win32:Clipboard を使用してクリップボードの内容を取得し、Regexp を使用してコードを抽出します。このようなもの:

$verify = Win32::Clipboard::GetText();
$verify =~ s/.* (\d{4}).*/$1/msg;

いくつかの考え:

乱数は、Perl my $random_number = int(rand(8999)) + 1000; のようなものによって生成されます。#var random_number = rand(1000,10000); そして、$verify == $random_number かどうかをチェックします。1 セッションのみの $random_number の値を取得する方法がわかりません。メモリのどこかに保存されていると思います。値を直接取得できれば、これとその追加のモジュールを使用するのにそれほど苦労することはなかったでしょう。

于 2010-02-26T09:15:44.870 に答える