2011-05-20 71 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