我正在尝试编写一个perl脚本来登录到一个受密码保护的站点。我以前也使用过WWW::Mechanize模块来完成类似的任务,但是这个站点在几个方面有所不同:
-It在受保护的页面上使用javascript,因此机械化将不起作用。我更喜欢用无头浏览器实现一些东西,因为脚本在我的工作机器上每小时运行一次。
-It没有登录表单,相反,浏览器会显示一个弹出框来登录,而我无论如何也想不出如何处理它。
网址:https://fwxwww2.hpr.for.gov.bc.ca/Scripts/Public/Common/Report.asp?Report=Hourly
我已经找到了足够好的资源来指导如何在登录后继续使用javascript,所以真正让我困惑的是如何进行身份验证。提前感谢您对如何处理此问题的任何建议。我对不涉及perl的解决方案持开放态度,但我运行的是cygwin,因此选择有点有限。
#!/usr/bin/perl
use strict;
use warnings;
use WWW::Mechanize;
use Data::Dumper;
my $url= 'https://fwxwww2.hpr.for.gov.bc.ca/Scripts/Public/Common/Report.asp?Report=Hourly';
my $mech = WWW::Mechanize->new( autocheck => 1 );
$mech->credentials(
'myusername',
'mypassword'
);
$mech->get( $url );
print $mech->content();发布于 2012-02-17 03:28:01
浏览器将显示一个弹出框
这是RFC 2617中描述的HTTP身份验证,并在WWW::Mechanize和LWP::UserAgent中的方法credentials中进行了记录。
我看不到涉及到JavaScript。可能只在认证后的文档中。请参阅我的documentation improvement for JS-enabled Mech-workalikes。
编辑:
Antonio Dolcetta's answer给出了使用NTLM身份验证方案的提示。升级您的Authen::NTLM版本。根据LWP::Authen::Ntlm文档,启用keep-alive并对netloc (包括端口号)和用户名(包括NT域名)使用正确的表示法。
发布于 2012-02-17 17:24:54
看起来该网站正在使用NTLM进行身份验证。确保您安装了LWP::Authen::Ntlm。尝试如下所示(此示例使用LWP::UserAgent而不是WWW::Mechanize,但应该是相同的)
另请参阅:http://www.perlmonks.org/?node_id=642656
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
my $url = 'https://fwxwww2.hpr.for.gov.bc.ca/Scripts/Public/Common/Report.asp?Report=Hourly';
# important to use keep_alive for NTLM
my $ua = LWP::UserAgent->new(keep_alive=>1);
$ua->credentials('fwxwww2.hpr.for.gov.bc.ca', '', 'username', 'password');
my $response = $ua->get($url);
print $response->content();发布于 2012-02-17 15:43:17
使用firefox并启用实时http头插件。
通过这种方式,您可以看到进出的信息,并且能够复制这些信息。
该页面可能会检查其他内容以禁止bot,如浏览器版本检测、javascript检测等。
您的$url也包含一个\t字符。
https://stackoverflow.com/questions/9317637
复制相似问题