2012-02-16 2 views
1

Я пытаюсь написать скрипт perl для входа на защищенный паролем сайт. Я использовал модуль WWW :: Mechanize для подобных задач в прошлом, но этот сайт отличается несколькими способами:Войдите в https-сайт, используя perl

-Он использует javascript на защищенных страницах, поэтому механизация не будет работать. Я бы предпочел реализовать что-то с безгласным браузером, поскольку скрипт запускается ежечасно на моем рабочем компьютере.

-Он не имеет формы для входа в систему, а браузер отображает всплывающее окно для входа в систему, и я не могу на всю жизнь понять, как с этим бороться.

URL-адрес: 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(); 
+0

учетные данные() принимает четыре аргумента. См. [Этот поток, который включает пример кода] (http://www.perlmonks.org/?node_id=437928). –

+0

Cheers. Механизм [документация] (http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize.pm#$mech-> credentials (_ $ username, _ $ password_)) указывает, что 2 аргумента тоже приемлемо. – wxnerd

+0

Ах, прошу прощения. Не осознавали, что они расширили эту функциональность. –

ответ

2

браузер отображает всплывающее окно

Это аутентификации HTTP, описанный в RFC 2617 и документированный в методе credentials в WWW::Mechanize и LWP::UserAgent.

Я вижу, что JavaScript не был задействован. Возможно, только в документах после аутентификации. См. Мой documentation improvement for JS-enabled Mech-workalikes.


редактировать:

Antonio Dolcetta's answer дает подсказку, что используется схема аутентификации NTLM. Обновите свою версию Authen::NTLM. В соответствии с документацией LWP::Authen::Ntlm включите keep-alive и используйте правильную нотацию для netloc (включая номер порта) и имя пользователя (включая доменное имя NT).

+0

Спасибо, я пробовал несколько перестановок, используя метод учетных данных, но продолжаю получать сообщение _Unauthorized на ./mech_test.pl строке 14_. Добавлен код примера на вопрос выше. – wxnerd

+0

Большое спасибо за помощь! – wxnerd

0

Использовать firefox с включенным подключаемым модулем заголовков HTTP.

Таким образом, вы можете видеть, какая информация поступает и выходит, и вы можете ее воспроизвести.

Возможно, эта страница проверяет другие вещи, чтобы запретить боты, такие как обнаружение версии браузера, обнаружение JavaScript и так далее.

Также ваш $ url содержит символ \ t.

1

Похоже, что этот сайт использует 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(); 
+0

Спасибо за помощь - определенно заставил меня указывать в лучшем направлении. – wxnerd