Вход на веб-сайт с помощью LWP и Perl

#perl #login #webclient #lwp

#perl #аутентификация #webclient #lwp

Вопрос:

Здесь несколько неопытный программист пытается написать программу для входа на сайт моих курсов и загрузки всего содержимого (лекции, домашние задания и т.д.). Очевидно, что это сайт, защищенный паролем, поэтому я должен предоставить ему это. Я достаточно хорошо понимаю LWP::UserAgent и тому подобное, и что мне нужно использовать учетные данные. Чего я не могу понять, так это как перейти на следующую страницу. Я могу зайти в систему, но как perl получает результат моего входа в систему?

пример кода (очевидно, я извлек информацию из журнала):

 use LWP::UserAgent;

my $ua = LWP::UserAgent->new;
my $url = 'login URL';
$ua -> credentials(
  $url,
  '',
  'user',
  'pass'
);
my $response = $ua ->get($url);
print $response->content; 
  

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

О, еще одна вещь, на сайте моих собственных курсов нет уникального URL, насколько я знаю.

Ответ №1:

Вероятно, вы захотите использовать WWW::Mechanize, подкласс LWP::UserAgent, разработанный, чтобы действовать скорее как браузер, позволяя вам перемещаться по страницам веб-сайта с уже созданным для вас хранилищем файлов cookie.

Комментарии:

1. Также спасибо. Опять немного чтения! (Я знал, что это было там, но иногда я думаю, что все дело в поиске в нужных местах)

Ответ №2:

Вы используете только credentials , если сайт использует HTTP basic auth, в этом случае вы не «входите в систему», вы просто передаете учетные данные с каждым запросом.

Если на сайте установлена система входа на основе формы, то вам нужно использовать cookie_jar и запросить URI действия формы с любыми данными, которые она ожидает.

Комментарии:

1. спасибо за быстрый ответ. Я думаю, мне нужно почитать о HTTP, о том, как работает Веб и т.д.

Ответ №3:

 #!/usr/bin/perl

use LWP::UserAgent;
use HTTP::Cookies;

my  $ua=LWP::UserAgent->new(timeout => 20);
    $ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.8) Gecko/20100202 MRA 5.5 (build 02842) Firefox/3.5.8');
    $ua->requests_redirectable(0);

my  $cook = HTTP::Cookies->new;
    $ua->cookie_jar($cook);

print = requester('http://urlexample/login.php', 'login=yourloginamp;password=pass' )->as_string;

sub requester
{
    my $type = 'GET';
    if($_[1]){$type = 'POST'}   
    my $req = HTTP::Request->new($type => $_[0]);
    $req->content_type('application/x-www-form-urlencoded; charset=UTF-8');
    if($_[1]){$req->content($_[1])}
    my $res = $ua->request($req);
    return $res;
}