2010-04-29 74 views
5

我想用Perl的WWW::Mechanize登錄我的銀行並提取交易信息。在通過瀏覽器登錄我的銀行(Wells Fargo)後,它簡要地顯示了一個臨時網頁,上面寫着「請等待,而我們驗證您的身份」。幾秒鐘後,它進入銀行的網頁,我可以獲取我的銀行數據。唯一的區別是URL包含多個附加到臨時頁面的URL的「GET」參數,該臨時頁面只有一個sessionID參數。如何獲得WWW-Mechanize登錄Wells Fargo的網站?

我能夠成功獲取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" 
); 

回答

2

你需要逆向工程所發生的事情而中間的頁面上。例如,它是否使用Javascript來設置一些cookie? Mech不會在頁面上解析或執行Javascript,因此它可能會嘗試跟隨元刷新,但會漏掉一些關於最終請求需要發生的重要信息。

嘗試使用類似Firebug的工具來觀察瀏覽器執行元刷新時發送的請求。檢查發送到請求最終頁面的所有請求標頭,包括cookie。然後使用Mech來複制它。

+0

感謝您指向Firebug。我安裝了它並注意到在中介頁面中有一個''行,它引用了一個javascript函數。我猜測我運氣不好,因爲Mech在這個時候無法處理javascript。 – 2010-05-01 12:22:41

+1

你可能不會走運,你只需要找出那些Javascript函數在做什麼,並讓Mech做同樣的事情。使用Firebug觀看HTTP交易 - 是否有任何POST字段或cookie,您以前沒有看到? JS可能會添加它們,所以將Mech加入相同的東西。 – friedo 2010-05-01 18:10:44

1

如果你知道下一個頁面,您可以嘗試得到它使用

$mech->add_header($name => $value); 
+0

這將添加請求標頭,但不會將字段添加到請求URI或POST內容。 – 2010-05-02 19:41:11

3

對不起安裝額外的GET參數後的位置,已經有好幾年,因爲我已經編碼的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或類似的。我在互聯網存檔/返回機器中找到了源代碼,並對其進行了修改,使其成爲您在上面看到的內容。所以,感謝Youngblood先生或其他類似的人,無論你在哪裏,並感謝他們教給我這個meta scrape技巧!

1

首先,你需要知道的是Javascript或還沒有,我建議使用Web Developer(但你可以使用NoScript太)禁用Javascript和嘗試通過瀏覽器登錄(但首先你需要清除相關的所有Cookie時,目標網站!)。

如果仍然(用javascript禁用)可以登錄這不是的Javascript問題,你需要調查HTTP頭(也可能是X,例如將點擊的按鈕y座標或一些餅乾只收到當你加載CSS文件等)。

我建議使用HttpFox來檢查HTTP標頭。您需要運行HttpFox日誌記錄,然後再次執行登錄(通過在執行此操作之前禁用映像將明顯減少日誌)。之後,您需要檢查每個請求和相應的響應,以查找設置了隱藏cookie的位置或創建了一些隱藏的表單參數。

如果禁用JavaScript後無法登錄,則需要查看標題。您需要將HTTP頭響應中提供的cookie與稍後請求中的cookie進行比較。在找到帶有「惡意」Javascript的html後,您可以分析此Javascript以查找算法如何創建此cookie(或表單參數)。

而你最後一步將是在你的WWW :: Mechanize請求中重複這個cookie /表單參數。

+0

!大多數答案通常提供複製/粘貼答案,您提供過程背後的一般邏輯!感謝名單 – deckoff 2014-05-02 05:16:19