Скрипт, умеющий авторизоваться на 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.
#Задаём пути, явки, пароли и всё, что нужно
10.
my
$url_login
=
"http://url-to-go/path/to/login.cgi"
;
11.
my
$url_export
=
"http://url-to-go/path/to/do/something.cgi"
;
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: 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
Ну а в целом, пост ни о чем. Таких игрушечных примеров в сети навалом.