Скрипт, умеющий авторизоваться на Web-странице

Date April 14th, 2010 Author Vitaly Agapov

В очередной раз столкнулся с очередной задачкой: необходимо написать скрипт, умеющий логиниться на Web-страницу и выполнять на ней некоторые действия от имени зарегистрированного пользователя. Задачка, естественно, решилась при помощи Perl, а также двух модулей – LWP::UserAgent и HTTP::Request::Common. Причём, второй совершенно необязателен, но для общего развития пусть будет. И чтобы в будущем не повторять заскоков на cpan.org и усердного чтения perldoc, приведу вариант такого скрипта здесь.

Все комментарии по скрипту приведу прямо в тексте, так будет понятнее. Но в целом скрипт делает следующее: отправляет HTTP POST с логином и паролем на страницу, получает назад ответ с cookies, которые должны содержать идентификатор сессии. Этот идентификатор мы сохраняем и, производя очередную (или очередные) посылки на страницу, подставляем в наши заголовки.

01.#!/usr/bin/perl
02. 
03.use HTTP::Request::Common qw(POST);
04.use LWP::UserAgent;
05.use POSIX qw(strftime);
06. 
07.my $date=strftime("%Y%m%d", localtime(time()));
08. 
09.#Задаём пути, явки, пароли и всё, что нужно
12.my $login="login";
13.my $passwd="password";
14.my $data_file="/path/to/backup/filename_".$date;
15. 
16.# Вызываем конструктор LWP::UserAgent
17.my $ua = LWP::UserAgent->new;
18. 
19.# Создаём объект HTTP::Request для отправки данных на аутентификацию
20.my $req = HTTP::Request->new(POST=>$url_login);
21. 
22.# Указываем content_type и содержание запроса POST
23.# Это содержание зависит от формы, в которую надо произвести submit и от названий полей
24.$req->content_type('application/x-www-form-urlencoded');
25.$req->content("j_username=$login&j_password=$passwd&submit=Login");
26. 
27.# Отправляем запрос
28.my $res=$ua->request($req);
29.# Ищем заголовок set-cookie в ответе и запоминаем его
30.my $cookie=$res->{_headers}->{"set-cookie"};
31. 
32.# Готовимся к отправке ещё одного HTTP POST для наших целей
33.my $ua2=LWP::UserAgent->new;
34. 
35.# Задаём параметры сообщения: URL, передаваемые формой значения и заголовок cookie,
36.# в котором должен быть Session ID от нашей авторизации
37.my $res2=$ua2->post( $url_export,
38.   [
39.      "\$Submit"      => "Export",
40.      "\$TextField"   => $data_file,
41.      onemorefield   => "value"
42.   ],
43.   cookie => $cookie
44.);
45. 
46.# Смотрим в ответ и ищем там указание на то, что у нас всё удалось
47.if ($res2->content =~ /Successfully/)
48.{
49.     print "Everything's good! \n";
50.}
51.else { print "Everything's bad! \n"; }

Tags:
Category: Perl | 1 Comment »

Comments

Один комментарий на “Скрипт, умеющий авторизоваться на Web-странице”

  1. null

    1. Ну и зачем было мучиться с request в начале, когда post записывается одной строкой?

    2. Для приведенного примера use HTTP::Request::Common qw(POST); подключать не нужно, достаточно HTTP::Request.

    3. Для обработки кукисов юзаем HTTP::Cookies

    Ну а в целом, пост ни о чем. Таких игрушечных примеров в сети навалом.

Leave a comment

 Comment Form 

Rich Text Editor, comment