5

Perl のWWW::Mechanizeを使用して銀行にログインし、取引情報を取得しようとしています。ブラウザーを介して私の銀行 (Wells Fargo) にログインした後、一時的な Web ページが表示され、「身元が確認されるまでお待ちください」というメッセージが表示されます。数秒後、銀行のデータを取得できる銀行の Web ページに進みます。唯一の違いは、URL には、sessionID パラメータしかない一時ページの URL に追加されたいくつかの「GET」パラメータが含まれていることです。

WWW::Mechanize をログイン ページから正常にログインさせることができましたが、一時ページでスタックしてしまいます。<meta http-equiv="Refresh"ヘッダーに ... タグがあるので、試してみまし$mech->follow_meta_redirectたが、その一時ページも通過できませんでした。

これを乗り越えるための助けをいただければ幸いです。前もって感謝します。

一時ページでスタックするベアボーン コードは次のとおりです。

#!/usr/bin/perl -w
use strict;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
$mech->agent_alias( 'Linux Mozilla' );

$mech->get( "https://www.wellsfargo.com" );
$mech->submit_form(
    form_number => 2,
    fields => {
        userid => "$userid",
        password => "$password"
    },
    button => "btnSignon"
);
4

4 に答える 4

3

申し訳ありませんが、Perlをコーディングしてから何年も経ちました。ただし、この質問に対する「コピーアンドペースト」の回答はまだ投稿されていないため、Rubyでウェルズファーゴをスクレイプする方法は次のとおりです。

require 'rubygems'
require 'mechanize'

username = 'your_username'
password = 'your_password'

agent = Mechanize.new
agent.user_agent_alias = 'Windows IE 6'

# get first page
page = agent.get('https://online.wellsfargo.com/signon/')

# find and fill form
form = page.form_with(:name => 'Signon')      
form['userid'] = username
form['password'] = password
page = agent.submit form

# find the refresh url
page.body.match /content="1;URL=(.*?)"/
nexturl = $1

# wait a little while and then get the next page
sleep 3
page = agent.get nexturl

# If you have multiple accounts, you can use this. If you just have a single account, you can remove this block
companies = [['Account1', '123456789'], 
             ['Account2', '123456789']]

companies.each do |name, id|
  form = page.form_with(:name => 'ChangeViewFormBean')
  form['viewKey'] = id
  page = agent.submit form

  available_balance = page.search("#cashTotalAvailBalance").text.strip

  puts "#{name}: #{available_balance}"
  sleep 2
end

引用された作品:このスクリプトのバージョンを作成し、それを自分のコードディレクトリに投稿してから、すべてを自分のブログに転送した人がいます。彼の姓はYoungbloodまたは同様のものです。私はインターネットアーカイブ/ウェイバックマシンでソースを見つけ、上記のように変更しました。それで、あなたがどこにいても、ヤングブラッド氏または同様のものに感謝します-そして私にメタスクレイプトリックを教えてくれてありがとう!

于 2010-12-15T04:38:39.933 に答える
2

その中間ページで何が起こっているかをリバース エンジニアリングする必要があります。たとえば、Javascript を使用して一部の Cookie を設定しますか? Mech はページで Javascript を解析または実行しないため、メタリフレッシュを追跡しようとしている可能性がありますが、最終的なリクエストに何が必要かについての重要な情報が欠落しています。

Firebugなどのツールを使用して、ブラウザがメタリフレッシュに続いたときに送信されるリクエストを監視してみてください。最終ページを要求するために送信される、Cookie を含むすべての要求ヘッダーを調べます。次に、Mech を使用してそれを複製します。

于 2010-04-29T19:56:19.730 に答える
1

次のページの場所がわかっている場合は、次のように追加の get パラメータを追加してから、取得を試みることができます。

$mech->add_header($name => $value);
于 2010-04-29T20:00:40.320 に答える
1

まず、この Javascript かどうかを確認する必要があります。Web 開発者(ただし、NoScriptも使用できます) を使用して Javascript を無効にし、ブラウザ経由でログインすることをお勧めします (ただし、最初に、ターゲット サイトに関連するすべての Cookie をクリアする必要があります! ) .

それでも (Javascript を無効にして) ログインできる場合、これは Javascript の問題ではなく、HTTP ヘッダーを調査する必要があります (たとえば、クリックされたボタンの x、y 座標や、CSS ファイルをロードしたときにのみ受信した Cookie など)。

HTTP ヘッダーのチェックにはHttpFoxを使用することをお勧めします。HttpFox ロギングを実行し、その後再度ログインを実行する必要があります (ちなみに、これを行う前に画像を無効にすると、ログが大幅に削減されます)。その後、すべてのリクエストと対応するレスポンスをチェックして、非表示の Cookie が設定されている場所や非表示のフォーム パラメータが作成されている場所を見つける必要があります。

Javascript を無効にした後にログインできない場合は、ヘッダーも確認する必要があります。HTTP ヘッダー応答で提供された Cookie と、後の要求で保持している Cookie を比較する必要があります。「悪意のある」Javascript を含む html を見つけたら、この Javascript を分析して、この Cookie (またはフォーム パラメータ) がどのように作成されたかをアルゴリズムを見つけることができます。

最後のステップは、この cookie/form パラメータを WWW::Mechanize request で繰り返すことです

于 2010-12-16T10:59:59.140 に答える