Скрипт, умеющий авторизоваться на Web-странице
Date April 14th, 2010 Author Vitaly Agapov
В очередной раз столкнулся с очередной задачкой: необходимо написать скрипт, умеющий логиниться на Web-страницу и выполнять на ней некоторые действия от имени зарегистрированного пользователя. Задачка, естественно, решилась при помощи Perl, а также двух модулей – LWP::UserAgent и HTTP::Request::Common. Причём, второй совершенно необязателен, но для общего развития пусть будет. И чтобы в будущем не повторять заскоков на cpan.org и усердного чтения perldoc, приведу вариант такого скрипта здесь.
Все комментарии по скрипту приведу прямо в тексте, так будет понятнее. Но в целом скрипт делает следующее: отправляет HTTP POST с логином и паролем на страницу, получает назад ответ с cookies, которые должны содержать идентификатор сессии. Этот идентификатор мы сохраняем и, производя очередную (или очередные) посылки на страницу, подставляем в наши заголовки.
#!/usr/bin/perl use HTTP::Request::Common qw(POST); use LWP::UserAgent; use POSIX qw(strftime); my $date=strftime("%Y%m%d", localtime(time())); #Задаём пути, явки, пароли и всё, что нужно my $url_login="http://url-to-go/path/to/login.cgi"; my $url_export="http://url-to-go/path/to/do/something.cgi"; my $login="login"; my $passwd="password"; my $data_file="/path/to/backup/filename_".$date; # Вызываем конструктор LWP::UserAgent my $ua = LWP::UserAgent->new; # Создаём объект HTTP::Request для отправки данных на аутентификацию my $req = HTTP::Request->new(POST=>$url_login); # Указываем content_type и содержание запроса POST # Это содержание зависит от формы, в которую надо произвести submit и от названий полей $req->content_type('application/x-www-form-urlencoded'); $req->content("j_username=$login&j_password=$passwd&submit=Login"); # Отправляем запрос my $res=$ua->request($req); # Ищем заголовок set-cookie в ответе и запоминаем его my $cookie=$res->{_headers}->{"set-cookie"}; # Готовимся к отправке ещё одного HTTP POST для наших целей my $ua2=LWP::UserAgent->new; # Задаём параметры сообщения: URL, передаваемые формой значения и заголовок cookie, # в котором должен быть Session ID от нашей авторизации my $res2=$ua2->post( $url_export, [ "\$Submit" => "Export", "\$TextField" => $data_file, onemorefield => "value" ], cookie => $cookie ); # Смотрим в ответ и ищем там указание на то, что у нас всё удалось if ($res2->content =~ /Successfully/) { print "Everything's good! \n"; } else { print "Everything's bad! \n"; }
Tags: Perl
Category:
Perl |
1 Comment »
24 April 2010 - 20:28
1. Ну и зачем было мучиться с request в начале, когда post записывается одной строкой?
2. Для приведенного примера use HTTP::Request::Common qw(POST); подключать не нужно, достаточно HTTP::Request.
3. Для обработки кукисов юзаем HTTP::Cookies
Ну а в целом, пост ни о чем. Таких игрушечных примеров в сети навалом.