perl访问ftp
我承认我不是最有经验的Perl程序员。 幸运的是,当我陷入困境时,我知道我可以向众多书籍,杂志文章,网站,新闻组和邮件列表寻求帮助。 尽管我可以处理所有事情,但是始终无法获得一项关键信息。 无论从哪里看,我都找不到使用Perl和LWP从安全站点获取网页的理想解决方案。
经过许多痛苦和磨难之后,我终于编写了一个脚本来自己完成登录过程的自动化。 一路上,我注意到其他人也在努力解决类似的问题。 即使有所不同,我一次又一次看到的基本问题是: 在世界范围内,如何使用Perl将用户名和密码发送到网站? 我自己终于找到了解决方案,我希望可以一劳永逸地回答这个问题。
硬的东西第一
如果您打算与安全的网站进行通信,则会话URL将以HTTPS而不是HTTP开头。 不幸的是,LWP(Perl中的WWW库)模块不支持HTTPS。 要通过安全的HTTP会话建立通信,您需要安装一个名为Crypt :: SSLeay的模块。 在CPAN上很容易找到这个模块(请参阅参考资料 ),但是由于我是在Windows上开发的,因此对我没有太大帮助。
Windows上几乎所有的Perl程序员都使用ActiveState中的Perl。 该程序包已编译并与其他Window应用程序类似地安装。 来自ActiveState的Perl最好的部分是Perl软件包管理器(PPM)。 简单地键入ppm
在C:\Perl\Bin
提示和ppm的启动。 从那里,您可以搜索已经为Windows编译的任何Perl模块,并Swift安装它。 不幸的是,默认的ActiveState存储库中找到的大多数模块都非常旧或根本不可用,Crypt :: SSLeay就是这种情况。 尝试从ppm提示符下搜索Crypt :: SSLeay,您会收到一条不错的错误消息: No matches for 'Crypt::SSLeay'; see 'help search'.
No matches for 'Crypt::SSLeay'; see 'help search'.
但是请不要失望-已经为Windows编译的Crypt :: SSLeay确实存在。 您只需要查看其他模块存储库。
查找并安装Crypt :: SSLeay
我不知道为什么ActiveState无法提供Crypt :: SSLeay。 我确实知道您可以在加拿大的存储库中找到它,然后从ppm提示符下安装该模块。 除了输入install Crypt::SSLeay
您还需要输入:
install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd
正确键入命令,安装将顺利进行。 但是,出现印刷错误,您又收到另一条错误消息: Error: Failed to download <your typographical error here>
除两个DLL之外,Crypt :: SSLeay会自动安装您需要的所有内容。 在安装过程中,系统将提示您添加libeay32.dll和ssleay32.dll。 出现提示时回答是。 您需要这两个文件。
有了它,您就可以进行最困难的工作(即找到并安装Windows的Crypt :: SSLeay),并且可以开始编写代码了。
让生活更轻松
向安全站点发送用户名和密码是下一个障碍。 尽管仅使用LWP就可以实现此目标,但是编写脚本来与页面进行交互似乎更直观,这与使用常规浏览器的方式类似,或者至少尽可能接近。
我写了一些脚本并将它们的摘要贴到listserv libwww@perl.org上寻求帮助后,我下了休息。 有人给我回信说:“嘿,如果您只使用WWW :: Mechanize,它将容易得多。” 因此,我再次去了CPAN调查他们的建议。
快速阅读了文档,并解决了登录安全网站的奥秘。 WWW :: Mechanize模块允许您与网站交互,就像使用Web浏览器一样。 它使您可以跟踪链接并填写表格。 该模块正是我需要的,您也需要它。 这是获取方法。
- 搁置您的代码并打开命令窗口(您知道,它使您回到DOS的美好时光)。
- 转到您的C:\ Perl \ bin目录,然后键入
ppm
。 Perl软件包管理器将启动,并在ppm提示符ppm>
处离开。 - 在ppm提示符下,键入
search WWW::Mechanize
。 搜索返回几个匹配项。 您想要一个简单地说WWW::Mechanize
(在我的搜索中,列表中的第一个匹配项)。 - 要安装该模块,请键入
install 1
(如果搜索将WWW :: Mechanize关联为其他编号,请输入该编号而不是1)。
WWW ::机械化行动
安装完成后,转到CPAN并阅读WWW :: Mechanize模块的文档(请参阅参考资料 )。 您还将在在线文档中找到一些很棒的代码段和有用的食谱示例。 为了帮助您入门,我编写了一个快速的WWW :: Mechanize示例。 清单1中的脚本检索WWW :: Mechanize模块文档页面并将其转储到名为output.html的文件中。
清单1.使用WWW :: Mechanize
1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. my $url = "http://www.cpan.org";
5. my $searchstring = "WWW::Mechanize";
6. my $outfile = "out.htm";
7. my $mech = WWW::Mechanize->new();
8. $mech->get($url);
9. $mech->follow_link(text => "CPAN modules, distributions, and authors", n => 1);
10. $mech->form_name('f');
11. $mech->field(query => "$searchstring");
12. $mech->click();
13. my $output_page = $mech->content();
14. open(OUTFILE, ">$outfile");
15. print OUTFILE "$output_page";
16. close(OUTFILE);
该脚本很简单,可能很容易解释,但是下面是每一行的简要介绍:
- 第2行和第3行是最重要的
USE
语句。USE strict
强制您声明所有变量,并降低使用子过程(在上面的示例中不存在)时Perl误解您的意图的风险。USE WWW::Mechanize
允许您使用先前安装的模块。 - 第4行将脚本中稍后使用的URL分配给
$url
。 是否要转到其他网站? 首先更改$url
。 - 第5行是在声明的URL中搜索的内容。
- 第6行将文件名分配给最终输出文件。
- 第7和8行创建WWW :: Mechanize的新实例,然后使用先前分配的URL对该实例调用
GET
方法。 - 第9行假定已接收到该页面,并在该页面上链接了一个已知链接(显然,您可以在此处进行更多的错误检查,但现在,我只想演示如何检索页面)。 链接页面被检索。 由于我以前是使用标准浏览器执行这些步骤的,所以我知道我的下一页以名为“ f”的形式提供了一个搜索字段。
- 第10行引用了页面上名为“ f”的表单。
- 第11行为表单字段
query
分配了我要搜索的搜索字符串。 - 第12行是虚拟按钮单击,就像您自己在与页面进行交互一样。
- 第13、14、15和16
$output_page
返回的页面的内容分配给$output_page
,打开一个简单的输出文件,将内容写入该文件,然后关闭该文件。
这就是WWW :: Mechanize的基本用法; 现在让我们继续在安全的网站上使用它。
查找安全站点并登录
在清单2中,您看到一个脚本示例,在该示例中,我尝试使用Yahoo!®mail登录基于Web的电子邮件帐户。 自己测试一下该脚本,并查看其运行方式。 (显然,此测试需要一个基于Web的电子邮件帐户。)
清单2.登录到安全站点
1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. use HTTP::Cookies;
5. my $outfile = "out.htm";
6. my $url = "https://mail.yahoo.com/";
7. my $username = "your_email_username_here";
8. my $password = "your_account_password_here";
9. my $mech = WWW::Mechanize->new();
10. $mech->cookie_jar(HTTP::Cookies->new());
11. $mech->get($url);
12. $mech->form_name('login_form');
13. $mech->field(login => $username);
14. $mech->field(passwd => $password);
15. $mech->click();
16. my $output_page = $mech->content();
17. open(OUTFILE, ">$outfile");
18. print OUTFILE "$output_page";
19. close(OUTFILE);
注意,大多数脚本与清单1所示的第一个脚本相同; 区别如下:
- 第4行告诉脚本使用cookie。 安全站点使用cookie进行身份验证。 cookie过程的确切工作方式超出了本文的范围。 现在,只知道您需要cookie支持才能登录到安全的网站。
- 第6行是安全网站的URL。
- 第7和8行是Yahoo!的用户名和密码。 邮件帐户。 显然,我没有包含真实的用户名和密码。 您可以在这些行中轻松替换您的帐户信息,因此脚本可以为您工作。
- 第10行为先前创建的WWW :: Mechanize实例创建一个新的cookie实例。
- 第12行将表单设置为在先前[创建的] URL登陆页面上指定的名称。
- 第13和14
passwd
login
和passwd
属性设置为先前定义的用户名和密码值。 该脚本的其余部分与清单1中的脚本相同。
请记住,通过浏览到yahoo.mail.com并检查URL所到达HTML页面的源,我发现了表单名称和字段login
和passwd
。
墨菲定律:不起作用
我的脚本能用吗? 当然不是! 我很少让我的Perl脚本在第一次尝试时就可以工作。 但是,失败是进行一些故障排除的机会。
开始进行故障排除的好地方是脚本和网站之间的通信。 为了更好地了解幕后情况,请在Yahoo!的第4行之后添加以下调试行。 清单2的邮件脚本:
use LWP::Debug qw(+);
添加语句后,再次启动脚本。
debug语句将大量信息发送到屏幕。 花点时间尝试理解屏幕上的所有内容。 如果是Yahoo! 邮件脚本,我在屏幕上看到了很多正面信息; 但是,最重要的信息出现在最后:
清单3.调试输出
Line 1: LWP::UserAgent::send_request: GET
https://login.yahoo.com/config/verify?.done=
http%3a//us.####.mail.yahoo.com/ym/login%3f.rand=###############
Line 2: LWP::UserAgent::_need_proxy: Not proxied
Line 3: LWP::Protocol::http::request: ()
Line 4: LWP::Protocol::collect: read 508 bytes
Line 5: LWP::UserAgent::request: Simple response: OK
我在清单3中对输出行进行了编号,以便于讨论。 在正常情况下,此类行未编号。 另外,为了保护Yahoo !,我使用数字符号(#)代替了返回的实际数字。 帐户。
注意: 为了更好地查看,第1行被分成多行。 它实际上显示为一行。
对输出进行故障排除
那么您在调试输出中看到了什么? 第1行建议Yahoo! 正在尝试确认某些内容,然后将脚本重定向到另一个位置。 另外,请注意最后的肯定Ok
响应,这表示我有所收获。
对与错,脚本在退出之前将其输出写入一个简单HTML文件。 调试输出指示返回了某些内容。 因此,是时候在文本编辑器中打开输出文件并进行查看了。
果然,输出文件包含一些基本HTML代码和一个非常有说服力的消息。
清单4.错误页面输出
<body>
If you are seeing this page, your browser settings prevent you
from automatically redirecting to a new URL.
<p>
Please
<a href="http://us.f319.mail.yahoo.com/ym/login?.rand=###############">click here</a>
to continue.
脚本由于某种原因未能重定向,但是可以选择继续click here
引用。 在这一点上,我看到了解决该问题的快速简便的方法。
快速简便的解决方案
首先,返回到脚本的页面未引用失败的登录。 该页面只是表示无法重定向浏览器, click here
继续。 因此,我只需要在第15行之后向脚本中添加一行代码,然后click here
选项将脚本带到其最终目的地,如清单5所示。
清单5.最终脚本
1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. use HTTP::Cookies;
5. my $outfile = "out.htm";
6. my $url = "https://mail.yahoo.com/";
7. my $username = "your_email_username_here";
8. my $password = "your_account_password_here";
9. my $mech = WWW::Mechanize->new();
10. $mech->cookie_jar(HTTP::Cookies->new());
11. $mech->get($url);
12. $mech->form_name('login_form');
13. $mech->field(login => $username);
14. $mech->field(passwd => $password);
15. $mech->click();
16. $mech->follow_link(text => "click here", n => 1);
17. my $output_page = $mech->content();
18. open(OUTFILE, ">$outfile");
19. print OUTFILE "$output_page";
20. close(OUTFILE);
只要脚本继续检索重定向页面,Yahoo! 邮件继续提供相同的重定向失败消息,我的快速简便的解决方案可以解决问题。 显然,并非所有安全网站都像Yahoo!那样响应。 做。 准备好自己做一些侦探工作,以使登录脚本正常工作。
安全登录清单
我向您展示了一个Perl脚本,该脚本解决了登录安全网站的奥秘。 总而言之,这是使用Perl构建成功,安全的网站登录脚本的必备清单:
- 以Crypt :: SSLeay开头 :通常通过HTTPS登录到安全站点。 您需要此模块才能使其成为可能。 你可以找到它已经从加拿大TheoryX服务器编译为Windows(参见相关主题 )。
- 添加WWW :: Mechanize :使您的生活更轻松,并使用此模块,该模块使您可以通过轻松地跟踪链接和填写表单(登录到安全站点的重要部分)来编写模仿网站交互的代码。
- 使用Cookie :安全的Web交易使用Cookie。 您需要
use
语句打开它们,以使其在脚本中自动工作。 - 启用调试 :当事情无法按预期进行时,请
use LWP::Debug qw(+);
启用调试use LWP::Debug qw(+);
该语句向您的屏幕发送大量信息; 但是,如果您有耐心,输出将非常有帮助。 - 生成输出文件 :将最终输出或脚本中每个页面检索点之后的输出转储到简单HTML文件中并进行检查。 该文件的内容清楚地显示了脚本从其“获取”请求中获得的回报。
将此清单应用于您的脚本,您将很快使用Perl自动访问安全的网站。
翻译自: https://www.ibm.com/developerworks/web/library/wa-perlsecure/index.html
perl访问ftp