2013-07-26 54 views
1

我想使用Perl的Mechanize庫填寫Web表單。Perl WWW ::機械化 - 身份驗證錯誤獲取URL

只要我在搜索框中輸入URL,它就會提示下面的消息,我可以手動登錄成功。

enter image description here

然而,當我運行下面的腳本,我得到以下錯誤:

enter image description here

如何正確地在第一個身份驗證對話框證書使用我$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) 

編輯:

這裏是請求站點

--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. 
+0

您正在使用什麼版本的機械? – Nate

+0

如何檢查當前版本? –

+0

剛剛檢查。我正在使用VERSION 1.70 –

回答

0

上運行wget與舊版本機械化的結果,你可以繼承的WWW::Mechanize包,並提供自己的憑據程序:

package MyMech; 

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

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

然後在你的程序中使用這個包,而不是WWW的::機械化:

package main; 

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

更新

你已經更新了你的問題,表示NTLM身份驗證的要求。檢查CPAN上的LWP::Authen::Ntlm

+0

默認憑據例程有什麼問題?它看起來與你建議覆蓋的那個一樣 –

+0

我不再接收連接錯誤,但它似乎不像Mech代理正確地獲取網頁。即使我刪除了'get_basic_credentials'子例程,它似乎允許我獲取url(這是可疑的)。此外,當我嘗試轉儲$ mech-> forms –

+0

@ user1022944中的表單時,沒有任何內容顯示,沒有錯誤的默認憑據例程。但幾年前,我開始使用這種模式,這種模式在其他技術失敗時也可以使用另請注意,這適用於HTTP基本身份驗證,而不是摘要身份驗證。作爲你的問題的一部分,我建議你運行wget並粘貼一個輸出的副本(所以我們可以看到你網站的頭文件):'wget -O/dev/null -S http://www.bbc.co.uk /'(但用您正在提取的URL替換BBC)。 –