Скрипт, умеющий авторизоваться на 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:
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