2017-08-04 56 views
1

我已經通過下面的腳本成功登錄到網頁,但網頁卡在重定向頁面。我不知道如何通過它。下面是我的代碼登錄網頁後通過自動直接頁面

use strict; 
use warnings; 
use LWP::UserAgent; 
use HTTP::Request::Common qw(POST); 
use HTTP::Cookies; 

my $URL="http://www.redirect.com"; 
my $UA = LWP::UserAgent->new(); 
$UA->ssl_opts(verify_hostnames => 0); 


my $req =HTTP::Request::Common::POST("$URL", 
Content_type=>'form-data', 
Content =>[ 
    'username'=>'name', 
    'password'=>'pass', 
] 
); 



my $resp=$UA->request($req); 

if ($resp->is_success) { 
    my $res2 = $UA->post($resp->base, []); 
    open(OUTFILE1, ">html1.txt"); 
    print OUTFILE1 $res2->decoded_content; 

    if ($res2->is_success) { 

     if(($resp->code() >= 200) && ($resp->code() <400)) { 

      open(OUTFILE, ">html.txt"); 
      binmode(OUTFILE, ":utf8");  
      print OUTFILE $resp->decoded_content; 

     }else{ 
      print "Error: ". $resp->status_line. "\n"; 
     } 
    } 
} 

這是輸出文件的一部分,我得到

<HTML> 
    <HEAD> 
     <TITLE> 

     </TITLE> 
    </HEAD> 
    <BODY onLoad="document.AUTOSUBMIT.submit();">This page is used to hold your data while you are being authorized for your request.<BR> 
    <BR>You will be forwarded to continue the authorization process. If this does not happen automatically, please click the Continue button below. 
    <FORM NAME="AUTOSUBMIT" METHOD="POST" ENCTYPE="application/x-www-form-urlencoded" <INPUT TYPE="SUBMIT" VALUE="Continue"></FORM> 
    </BODY> 
</HTML> 

如何通過本次車展直接頁訪問的網站,我想?根據答案進行了修改,但沒有輸出。

編輯2017年8月7日

我嘗試打印出html1.txt$res2方式simbabque建議和調試。輸出類似於下面

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
    <html><head> 
     <title>302 Found</title> 
    </head><body> 
     <h1>Found</h1> 
    <p>The document has moved <a 
     href="http://www.redirect.com">here</a>.</p> 
     <hr> 
     <address>Apache/2.2.3 (CentOS) Server at www Port 80</address> 
</body></html> 

我不知道這是什麼意思。誰能幫忙?

+0

您在輸出中缺少一個用於打開FORM格式標籤的'>'。這是真的錯過了,還是在複製時丟失了它? – simbabque

+0

這是一個正確的302響應。它告訴你它已被重定向。您的LWP用戶代理應該自動執行。 – simbabque

+0

謝謝@simbabque,如果成功爲什麼程序不能進入'if($ res2-> is success)'循環?該代碼不會打印'html.txt'。 – Tim

回答

0

關於這個有趣的部分可能是標題。 A 正常網站將發出重定向狀態碼,如302 Found。但這顯然不是這種情況,或者他們不需要這個相當奇怪的HTML事情。

HTML內置JavaScript執行。

<BODY onLoad="document.AUTOSUBMIT.submit();"> 

它告訴瀏覽器在頁面加載完成後直接提交表單。你的問題是LWP :: UserAgent不能這樣做,因爲它沒有JS支持。

但是,由於這種情況總是發生,所以代碼周圍是微不足道的。所有你需要做的是每次登錄時提交該表格。

my $res = $ua->request($req); 
if ($res->is_success) { 
    my $res2 = $ua->post($res->base, []); 
    if ($res2->is_success) { 
     ... 
    } 
} 

形式沒有參數。唯一的<input>元素是提交按鈕,並且由於它沒有name屬性,因此它不會顯示爲參數。該URL可能與您最初提交的URL相同,但它可能已經完成了真正的重定向,因此最好使用響應對象的base屬性。


我很想知道他們爲什麼會讓這個過程變得很奇怪。它當然不授權任何東西。它可能會設置額外的Cookie,就像其中一種營銷重定向方式,但從您展示的內容中看不到。而且它也不會停止自動化。

+0

謝謝@simbabque,我編輯我的代碼按照您的建議,但是輸出。我修改了嗎?我編輯上面的代碼。 – Tim

+0

@Tim你是否更新過輸出?您應該嘗試在第二個請求中發送的內容。查看該網址是否正確。 – simbabque

+0

嗨@simbabque,第二個請求失敗,所以代碼將結束,而不會進入打印輸出文件的if循環。 – Tim