2

我知道這聽起來像它已經要求在論壇上的問題,但是我認爲,我這裏有一個稍微不同的情景..登錄網站使用WWW重定向::機械化

我嘗試使用Perl登錄到需要認證的網站。我已經意識到完成這個任務的最方便的工具是使用WWW :: Mechanize模塊,它很容易填寫表單並提交它們。

在我的情況,我會遇到以下困難:

  1. 似乎沒有「形式」這關係到我要滿山遍野。相反,這些字段被封裝在表<table></table>中。
  2. 該按鈕本身似乎啓動了一些JavaScript,我知道不被Mechanize模塊支持。但是,爲了測試此頁面的行爲,我在我的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"; 
    } 
    

結果,腳本的運行似乎是成功的。然而,當我認爲我已經登錄並嘗試從該網站獲得的任何數據,我看到(嗅探器),我不斷地轉發到「註冊」頁面。

任何幫助將非常感謝!

在此先感謝!

回答

2

看來我已經意識到如何解決這個問題。我使用Wireshark嗅探器來分析使用瀏覽器時發送的HTTP標頭與機械化對象創建的標頭之間的區別。我發現機械化生成的「連接」頭包含「TE,關閉」值,而瀏覽器發出帶有「保持活動」值的「連接」頭。此外,瀏覽器生成的請求還包含額外的「Keep-Alive:115」標題。我手動添加這些頭到我的機甲對象如下:

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

這解決了這個問題,我能夠成功登錄!

謝謝大家的貢獻和幫助!這是非常讚賞!

1

如果它不在表單標籤中,那麼在某處使用GET請求將所有變量發送到相同(最有可能的)URL的提交按鈕。

你爲什麼試圖模擬使用瀏覽器來點擊身份驗證按鈕,還有其他一些隱藏的領域或你需要訪問的東西?

在我看來,最好的辦法是找出實際驗證用戶和密碼的頁面,並使用SSL POST請求到該頁面。

如果頁面是這樣的:

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

發送在HTTP POST請求,無論登錄頁面(可能是相同的頁面,如果沒有<形式>定義)。 POST變量將是user = $ value和pass = $ other_value。

+0

嗨戴夫,謝謝你的回覆! 你可以請建議如何找出哪個頁面正在執行身份驗證? 只是爲了澄清.. 你的意思是我可以發送一個普通的HTTP POST請求,而不是點擊按鈕?它是否與填寫輸入和點擊實際按鈕具有相同的效果?如果是的話,我擔心我在某種程度上錯過了WWW :: Mechanize模塊的需求... 再次感謝! – 2011-12-29 14:22:33

+0

Eugene,單擊Web窗體上的提交按鈕將發送POST或GET請求,具體取決於

標記中的method =「」行。如果沒有標籤,它發送GET請求(默認),所以只需抓取頁面中的所有輸入併發送它們。這裏有一些很好的閱讀上GET和POST和標籤:http://www.cs.tut.fi/~jkorpela/forms/methods.html – 2011-12-29 22:43:58

+0

嗨戴夫。感謝您的解釋和閱讀鏈接。這非常有用。 – 2012-01-01 13:04:52

1

當您檢查是否$response->is_success你只是檢查目標網站響應沒有任何HTTP錯誤給你。但是,而不是你需要檢查響應頁面是否包含一些文本。例如,「驗證錯誤!」等等。

如果目標網站使用了禁用的JavaScript,那麼這不是問題。

嘗試將x和y(鼠標指針的座標)添加到提交給表單的數據中(某些站點檢查此信息)。

您可以使用一些HTTP流量監測工具來檢查您的瀏覽器發送到目標站點的數據(我使用Firefox HTTPFox擴展)並通過WWW :: Mechanize發出相同的請求。

另外,WWW :: Mechanize不需要cookie_jar。它默認處理cookies。

試試這個代碼:

$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', 
); 
+0

嗨,謝謝你的評論!我使用了HttpFox附加組件(確實非常有用)。但是我不確定我是否理解我在那裏看到的內容。當我選擇POST請求並選擇「標題」選項卡時,我只能看到常規標題和Cookie(您所說的自動處理)。我在「POST數據」選項卡中發現了更多數據,包括提交字段的名稱和值。我也看到一些散列數據的參數:__VIEWSTATE,__ PREVIOUSPAGE,__ EVENTVALIDATION。你可以給我一個線索,瞭解如何使用它來創建機械化相關的POST?謝謝!! – 2011-12-29 15:13:39

+0

__VIEWSTATE通常是隱藏的表單域,所以您不必擔心它(機械化會自動處理它)。您是否嘗試將光標座標提交給目標網站?你能給我你的目標網站的網址,所以我可以檢查它嗎? – gangabass 2011-12-30 05:24:16

+0

嗨,再次感謝!我沒有嘗試座標,因爲我不確定如何獲得正確的按鈕位置。我打算做的是使用Chrome中的「檢查元素」功能來查找座標。如果你可以看看這個網站,可能會很棒,也許我錯過了那裏的一些東西。網址是[link](http://www.eoddata.com)。謝謝! – 2011-12-30 11:29:58

1

我會建議看看WWW ::腳本編寫者。這是寫在WWW ::機械化與JavaScript和AJAX支持的頂部。

WWW ::腳本編寫者https://metacpan.org/pod/WWW::Scripter

使用這個模塊,你可以直接調用javascript函數以及做更多事情。

+0

嗨。感謝您的評論! 我會看看這個模塊。 – 2011-12-29 14:28:55