2011-05-20 67 views
5

所以這讓我瘋狂。基本上,當我硬編碼我的用戶名和密碼時,我可以登錄沒有問題。但我想提示用戶輸入用戶名和密碼,因爲我想與其他人分享這個程序。 (程序應該登錄到我們的課程網站,並下載所有我們的課程作業信息的 - 講座,漢王等)網站用Perl和Mechanize登錄

此代碼:

use WWW::Mechanize; 
use LWP; 

my $username = 'user'; 
my $password = 'pass'; 

my $mech = WWW::Mechanize->new(); 
$mech -> cookie_jar(HTTP::Cookies->new()); 
$mech -> get('log-in url'); 
$mech -> form_name('theform'); 
$mech -> field ('username' => $username); 
$mech -> field ('password' => $password); 
$mech -> click ('log in'); 
print $mech-> content(); 

然而,當我嘗試並提示用戶輸入登錄信息,它現在可以工作。打印內容返回登錄頁面(說的課程頁面的用戶)的HTML,而不是下頁

use LWP; 
use WWW::Mechanize; 

my $login_url = 'log-in url'; 
print "\nUser name: "; 
my $username = <>; 
print "Password: "; 
my $password = <>; 

my $mech = WWW::Mechanize->new(); 
$mech -> cookie_jar(HTTP::Cookies->new()); 
$mech -> get($login_url); 
$mech -> form_name('theform'); 
$mech -> field ('username' => $username); 
$mech -> field ('password' => $password); 
$mech -> click ('log in'); 
print $mech-> content(); 

這真的是沒有意義的,因爲它們在本質上是一樣的。我甚至在提示中鍵入用戶名/密碼在引號中仍然沒有用.....(我也意識到它不會很容易檢查沒有網站和登錄信息,對此感到抱歉)

+3

您不需要在代碼中使用LWP和$ mech - > cookie_jar(HTTP :: Cookies-> new());'機械化將自動使用cookie。 – gangabass 2011-05-21 01:01:40

回答

11

你需要從用戶輸入運行chomp()

my $username = <>; 
chomp($username); 

由用戶提供的文本有結尾,這是搞砸了你的登錄回車。

+0

謝謝!我希望初學者的書可以提到(可能做某處,但我敢打賭) – msikd65 2011-05-20 18:26:31

+4

@ msikd65駱駝書第1章有一個文件句柄部分:「讀取操作不會自動從輸入行中刪除新行(您的輸入將是,例如,「9 \ n」')。「 – CanSpice 2011-05-20 18:31:00

+0

使用Data :: Dumper和打印轉儲$ some_variable通常是非常有幫助的。它會顯示用戶按下的「回車鍵」。結論是,當某些數據從外部來源獲取時,應該對其進行分析以消除不需要的或有時會產生有毒的字符。這是perl建立在污染模式中的原因。 – Znik 2017-08-11 11:51:10

2

雖然CanSpice是正確的,你也可以看看Term::ReadPassword,它提供了提示,它隱藏了輸入,併爲你照顧chomp