【问题标题】:Perl WWW::Mechanize -- Authentication Error GETing URLPerl WWW::Mechanize -- 获取 URL 的身份验证错误
【发布时间】:2013-07-26 19:49:01
【问题描述】:

我正在尝试使用 Perl 的 Mechanize 库填写网络表单。

每当我在搜索框中输入网址时,它都会提示以下消息,我可以手动成功登录。

但是,当我运行以下脚本时,出现以下错误:

如何使用我的$mech 对象正确填写第一个身份验证框凭据?

my $mech = WWW::Mechanize->new( 'keepalive' => 1 );

my $url = "http://URL/I/NEED/TO/ACCESS";
my $username = "username";
my $password = "password";

$mech->credentials($username, $password);
$mech->get($url);          <----------------- ERROR (LINE 93)

编辑:

这是在请求的站点上运行wget 的结果

--2013-08-30 11:16:17--  http://moss.micron.com/MFG/ProbeTest/Lists/Manufacturing%20Requests/AllItems.aspx
Resolving moss.micron.com... 137.201.88.118
Connecting to moss.micron.com|137.201.88.118|:80... connected.
HTTP request sent, awaiting response... 
  HTTP/1.1 401 Unauthorized
  Server: Microsoft-IIS/7.0
  WWW-Authenticate: Negotiate
  WWW-Authenticate: NTLM
  X-Powered-By: ASP.NET
  MicrosoftSharePointTeamServices: 12.0.0.6341
  Date: Fri, 30 Aug 2013 17:16:17 GMT
  Connection: keep-alive
  Content-Length: 0
Authorization failed.

【问题讨论】:

  • 您使用的是哪个版本的 Mechanize?
  • 如何查看当前版本?
  • 刚刚检查过。我正在使用 1.70 版
  • 应该够新了。你的代码对我来说很好。我注意到您的用户名和密码用双引号引起来。您的用户或密码中有$ 或其他控制字符吗?如果是这样,请尝试单引号。
  • A \ 将具有转义以下字符的效果。将其更改为单引号或使用 \\.

标签: perl webforms mechanize www-mechanize


【解决方案1】:

使用旧版本的 Mechanize,您可以继承 WWW::Mechanize 包并提供您自己的凭据例程:

package MyMech;

use vars qw(@ISA);
@ISA = qw(WWW::Mechanize);

sub get_basic_credentials {
  my ($self, $realm, $uri) = @_;
  return( "user", "password" );
}

然后在你的程序中使用这个包而不是 WWW::Mechanize:

package main;

my $mech = MyMech->new();
$mech->get( $url );

更新

您已更新问题以表明 NTLM 身份验证的要求。在 CPAN 上查看 LWP::Authen::Ntlm

【讨论】:

  • 默认凭证例程有什么问题?它看起来与您建议覆盖的相同
  • 我不再收到连接错误,但似乎 Mech 代理无法正确获取网页。即使我删除了 get_basic_credentials 子例程,它似乎也允许我获取 url(这是可疑的)。此外,当我尝试将表单转储到 $mech->forms 时,什么也没有显示
  • @user1022944 默认凭据例程没有问题。但几年前,我开始使用这种模式,当其他技术失败时,这种模式也能奏效。另请注意,这适用于 HTTP Basic Auth,而不是 Digest Auth。作为您问题的一部分,我建议您运行 wget 并粘贴输出的副本(以便我们可以看到您网站的标题):wget -O /dev/null -S http://www.bbc.co.uk/(但用 BBC 代替您要获取的 URL)。
  • 我在页面上运行了wget。你如何看待标题?
  • @user1022944 您的网络服务器需要NTLM 身份验证,而不是Basic。有关差异的描述,请参阅hc.apache.org/httpclient-legacy/…
猜你喜欢
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
相关资源
最近更新 更多