автоматический доступ на защищенный веб-сайт с помощью Perl

Язык Perl и его LWP-модуль облегчают автоматизацию доступа к веб-сайтам; сложности возникают в том случае, если для доступа на веб-сайт необходимо ввести имя пользователя и пароль. К счастью, эту проблему помогают решить Perl-модули. Из статьи Брета Свидена вы почерпнете информацию о том, как найти, установить и использовать модули WWW::Mechanize и Crypt::SSLeay в сценарии Perl, что автоматизирует регистрацию на защищенных веб-сайтах.

Должен сказать, что я далеко не самый опытный программист. К счастью, я знаю, что когда у меня возникают сложности, я могу обратиться к множеству книг, журнальных статей, веб-сайтов, тематическим конференциям в сети Интернет и многим людям за помощью. Тем не менее, несмотря на массу информации, находящейся в моем распоряжении, данные по одному из аспектов было сложно найти. К чему бы я ни обращался, я нигде не мог найти хорошее решение, в котором Perl и LWP используются для доставки веб-страницы с защищенного сайта.

В конце концов, я решил написать сценарий для автоматизации процедуры регистрации самостоятельно. Попутно я заметил, что и другие пытались решить подобные проблемы. С некоторыми изменениями основной вопрос, который вставал передо мной вновь и вновь, был таков: «Ну как, в конце концов, мне отправить имя пользователя и пароль на веб-сайт с помощью Perl?» Я нашел ответ на него раз и навсегда.

Perl в Windows?

Сюрприз! Мои примеры не для варианта Perl для UNIX; все мои эксперименты проводились на платформе Windows. Так как я работаю с Perl в Windows, мои объяснения и примеры основываются на Perl 5.8.x от ActiveState (ActivePerl). Ваши результаты могут быть немного другими, если вы будете использовать другую версию Perl (я понятия не имею какую, но должен же я был об этом сказать :). И все-таки в большинстве случаев мое решение может применяться вне зависимости от платформы.

сначала о самом сложном

Если вы собираетесь зайти на защищенный веб-сайт, URL будет скорее всего начинаться с HTTPS, а не с HTTP. К сожалению, модуль LWP (библиотека для работы с WWW на Perl) не поддерживает HTTPS. Чтобы установить соединение поверх защищенной HTTP-сессии, вам придется установить модуль под названием Crypt::SSLeay. Его легко найти на CPAN, но так как я работаю с Windows, это мне не сильно помогает.

Практически все программисты, работающие с Perl под Windows, используют версию Perl от ActiveState. Этот пакет был специально скомпилирован и устанавливается подобно другим Windows-приложениям. Лучшее в Perl от ActiveState - диспетчер пакетов Perl (PPM). Чтобы запустить программу просто перейдите в директорию \Perl\Bin и наберите ppm в командной строке. Из ppm вы сможете найти любой уже скомпилированный для Windows модуль Perl и легко установить его. К сожалению, большинство модулей, которые можно найти в репозиториях ActiveState, предлагаемых по умолчанию, очень старые или вообще недоступны, как в случае с Crypt::SSLeay. Попробуйте задать в строке поиска ppm Crypt::SSLeay, и вы увидите милое сообщение об ошибке: No matches for 'Crypt::SSLeay'; see 'help search'.

Но не отчаивайтесь - Crypt::SSLeay, уже скомпилированный для Windows, существует. Вам просто нужно посмотреть в другой модульной базе.
поиск и установка Crypt::SSLeay

Я понятия не имею, почему Crypt::SSLeay нельзя получить из ActiveState. Я лишь знаю, что его можно найти в канадском репозитории и установить из командной строки ppm. Вместо того чтобы печатать install Crypt::SSLeay, вам нужно набрать:

install http://theoryx5.uwinnipeg.ca/ppms/Crypt-SSLeay.ppd

Если вам интересно, вы можете пролистать предлагаемые пакеты Perl, скомпилированные специально для платформы Win32 в репозитории TheoryX. Просто откройте http://theoryx5.uwinnipeg.ca/ в браузере и перейдите по ссылке на репозитории ppm для Win32 ActivePerl 8xx и 6xx. Если вы хотите установить еще модули из этого репозитория, пополните ваш список репозиториев в командной строке ppm с помощью команды rep add.

Crypt::SSLeay устанавливает все, что вам необходимо, автоматически, за исключением двух DLL. Во время установки вам будет дана подсказка - добавить libeay32.dll и ssleay32.dll. При получении подсказки ответьте "Да"; вам потребуются оба эти файла.

После того, как вы выполните самую трудную часть работы (то есть найти и установить Crypt::SSLeay для Windows ;), самое время заняться написанием кода.

упростите себе жизнь

Следующее препятствие - отправка имени пользователя и пароля на защищенный сайт. Мне захотелось написать сценарий, который взаимодействует со страницей таким же образом, как делаете это вы с помощью обычного браузера, или хотя бы, по возможности, максимально к этому приближенным. После того, как я написал несколько сценариев и отправил фрагменты из них на списки рассылки libwww@perl.org, рассчитывая получить помощь, я получил ответ - "Эй, будет значительно проще, если ты будешь просто использовать WWW::Mechanize." Итак, я снова обратился к CPAN, чтобы попробовать последовать этому совету.

Я быстро прочитал документацию - и загадка регистрации на защищенном веб-сайте была решена. Модуль WWW::Mechanize позволяет вам
взаимодействовать с веб-сайтом почти так же, как это делает веб-браузер. Это позволит вам переходить по ссылкам и заполнять формы. Этот модуль как раз то, что нужно и мне, и вам. Вот как его можно получить.

Отложите в сторону ваш код и откройте командную строку (это напомнит вам о тех старых добрых временах, когда работали в DOS). Запустите ppm и найдите нуждый модуль с помощью команды

> search WWW::Mechanize

Поиск выдаст пару подходящих значений. Вам нужно то, которое выглядит как WWW::Mechanize (в моем поиске оно стояло первым). Для того, чтобы установить модуль, наберите

> install <номер по списку>

WWW::Mechanize в работе

После того, как вы закончите установку, перейдите к CPAN и прочтите данные по модулю WWW::Mechanize. Там вы также найдете несколько интересных отрывков кода и полезные справочные руководства с онлайновой документацией. Для начала я написал для вас небольшой пример с использованием WWW::Mechanize. Сценарий в Листинге 1 извлекает информацию со страницы документации модуля WWW::Mechanize и переводит ее в файл под названием output.html.

Листинг 1. Использование WWW::Mechanize.

1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. my $url = "http://www.cpan.org";
5. my $searchstring = "WWW::Mechanize";
6. my $outfile = "out.htm";
7. my $mech = WWW::Mechanize->new();
8. $mech->get($url);
9. $mech->follow_link(text => "CPAN modules, distributions, and authors", n => 1);
10. $mech->form_name('f');
11. $mech->field(query => "$searchstring");
12. $mech->click();
13. my $output_page = $mech->content();
14. open(OUTFILE, ">$outfile");
15. print OUTFILE "$output_page";
16. close(OUTFILE);


Этот сценарий достаточно простой и не требует объяснений, однако ниже я приведу краткое описание каждой строки.

Строки 2 и 3 - это очень важные операторы USE. USE strict заставляет вас декларировать все переменные и уменьшает риск того, что Perl неправильно истолкует Ваши намерения при использовании подпрограмм (в данном примере их нет). USE WWW::Mechanize позволяет вам пользоваться модулем, установленным ранее.

Строка 4 присваивает $url значение URL, который будет использоваться в сценарии. Хотите перейти на другой веб-сайт? Начните с изменения $url.

Строка 5 - это то, что ищется в заданном URL.

Строка 6 задает имя файла вывода.

Строки 7 и 8 создают новый экземпляр WWW::Mechanize и затем вызывают метод GET для этого экземпляра, используя ранее заданный URL.

Строка 9 предполагает, что страница получена и предлагает переход по известной ссылке на этой странице (вы, конечно же, можете заметить здесь ошибки, но я просто хочу показать вам, как доставлять страницу). Страница, на которую ведет ссылка, доставлена. Так как до этого я проходил все этапы с помощью стандартного браузера, я знаю, что на моей следующей странице находится поле в форме под названием "f".

Строка 10 соотносит форму под названием "f" со страницей.

Строка 11 присваивает форме поля query критерий поиска.

Строка 12 - это виртуальное нажатие кнопки мыши, как если бы вы взаимодействовали со страницей самостоятельно.

Строки 13, 14, 15, и 16 присваивают содержание возвращенной страницы $output_page, открывают простой файл вывода, записывает содержимое в файл и закрывает его.

Вот как работает WWW::Mechanize; а теперь давайте перейдем к его использованию на защищенном веб-сайте.

обнаружение защищенного сайта и вход на него

В Листинге 2 вы увидите пример сценария, в котором я попытался войти на веб-службу электронной почты Yahoo! Попробуйте этот сценарий и вы увидите, как он работает (конечно же, для этого вам потребуется почтовый аккаунт на этом сайте).

Листинг 2. Вход в систему защищенного сайта.

1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. use HTTP::Cookies;
5. my $outfile = "out.htm";
6. my $url = "https://mail.yahoo.com/";
7. my $username = "your_email_username_here";
8. my $password = "your_account_password_here";
9. my $mech = WWW::Mechanize->new();
10. $mech->cookie_jar(HTTP::Cookies->new());
11. $mech->get($url);
12. $mech->form_name('login_form');
13. $mech->field(login => $username);
14. $mech->field(passwd => $password);
15. $mech->click();
16. my $output_page = $mech->content();
17. open(OUTFILE, ">$outfile");
18. print OUTFILE "$output_page";
19. close(OUTFILE);


Обратите внимание на то, что этот сценарий практически такой же, как и первый, показанный в Листинге 1; разница заключается лишь в том, что: Строка 4 говорит сценарию использовать cookies. Защищенные сайты использую cookies с целью идентификации. Точно объяснить, как работают cookies, не входит в задачу нашей статьи. Все, что вам нужно знать, это то, что обычно нужна поддержка cookies для входа в систему защищенного веб-сайта. Строка 6 - это URL для защищенного веб-сайта.

Строки 7 и 8 - это имя пользователя и пароль для почтовой службы Yahoo!.

Строка 10 создает новый экземпляр cookie для ранее созданного экземпляра WWW::Mechanize.

Строка 12 настраивает форму на имя, указанное на странице, на которой находится созданный ранее URL.

Строки 13 и 14 устанавливают свойства login и passwd для ранее установленных данных для имени пользователя и пароля. Остальная часть сценария такая же, как в Листинге 1.

закон подлости: не работает!

Мой сценарий работает? Конечно, нет! Очень редко мои сценарии Perl начинают работать с первого раза; однако, именно неудачи заставляют нас выявлять неисправности.

Лучше всего начать искать ошибки со связи сценария и веб-сайта. Для того, чтобы лучше понять, что происходит, добавьте следующую строку отладки после Строки 4 в сценарии Yahoo! mail Листинга 2:

use LWP::Debug qw(+);

После того, как вы добавили эту строку, запустите сценарий снова.

Строка отладки пошлет значительное количество данных на ваш экран. Потратьте время и внимательно прочтите все, что там написано. В случае с сценарием Yahoo! mail, я увидел много интересного; но самая важная информация содержалась в конце:

Листинг 3. Вывод отладки.

Строка 1: LWP::UserAgent::send_request: GET
https://login.yahoo.com/config/verify?.done=
http%3a//us.####.mail.yahoo.com/ym/login%3f.rand=###############
Строка 2: LWP::UserAgent::_need_proxy: Not proxied
Строка 3: LWP::Protocol::http::request: ()
Строка 4: LWP::Protocol::collect: read 508 bytes
Строка 5: LWP::UserAgent::request: Simple response: OK


Я пронумеровал строки в выходных данных в Листинге 3, чтобы о них проще было говорить; в обычных условиях эти строки не пронумерованы. Я также использовал значки (#) вместо настоящих данных для защиты моего Yahoo! ящика.

Внимание: Для удобства Строка 1 разбита на несколько коротких строк. В действительности она представляет собой одно целое.

устранение ошибок на выходе

Итак, что вы видите в выводе отладки? Строка 1 предполагает, что Yahoo! пытается подтвердить что-то и затем перенаправить сценарий в другое место. Также обратите внимание на положительный ответ Ok в конце, который показывает, что я получаю ответ.

Правильно это или нет, сценарий записывает свой вывод в простой HTML файл до прекращения сеанса. Вывод отладки указывает, что получен ответ. Таким образом, пришло время открыть файл вывода в текстовом редакторе и взглянуть на него.

Наверняка файл вывода содержит некий базовый HTML-код и очень информативное сообщение. Например, вот такое:

<body>
If you are seeing this page, your browser settings prevent you from automatically redirecting to a new URL.
<p>
Please <a href="http://us.f319.mail.yahoo.com/ym/login?.rand=###############">click here</a> to continue.


Сценарий по каким-то причинам не смог выполнить перенаправление, но вы можете продолжить, нажав на ссылку click here. Здесь я вижу простое и быстрое решение проблемы.

простое и быстрое решение

Прежде всего, страница, которая была возвращена сценарию, не имела связи с неудачной попыткой регистрации. Страница просто сообщала, что не смогла перенаправить браузер и просила нажать на линк чтобы продолжить. Поэтому я просто добавляю одну строчку к сценарию после строки 15, и опция click here перенаправляет мой сценарий по конечному адресу, как показано в Листинге 4.

Листинг 4. Окончательный сценарий.

1. #!c:\\perl\\bin
2. use strict;
3. use WWW::Mechanize;
4. use HTTP::Cookies;
5. my $outfile = "out.htm";
6. my $url = "https://mail.yahoo.com/";
7. my $username = "your_email_username_here";
8. my $password = "your_account_password_here";
9. my $mech = WWW::Mechanize->new();
10. $mech->cookie_jar(HTTP::Cookies->new());
11. $mech->get($url);
12. $mech->form_name('login_form');
13. $mech->field(login => $username);
14. $mech->field(passwd => $password);
15. $mech->click();
16. $mech->follow_link(text => "click here", n => 1);
17. my $output_page = $mech->content();
18. open(OUTFILE, ">$outfile");
19. print OUTFILE "$output_page";
20. close(OUTFILE);


Мое простое решение срабатывает! Однако не все защищенные веб-сайты ведут себя так же как Yahoo!. Будьте готовы к тому, что вам придется хорошенько поломать голову, чтобы заставить ваш сценарий регистрации работать.

перечень основных действий для регистрации на защищенном сайте

Я представил вам сценарий Perl, который решает задачу регистрации на защищенном веб-сайте. В качестве заключения, я предлагаю вам перечень основных действий, необходимых для успешной регистрации на защищенном веб-сайте с помощью Perl:

1. Начните с Crypt::SSLeay. Ргистрация на защищенном сайте обычно выполняется через HTTPS. Этот модуль вам необходим. Вы можете найти его версию, скомпилированную для Windows, на сервере TheoryX в Канаде.

2. Добавьте WWW::Mechanize. Чтобы упростить себе жизнь, используйте этот модуль, который позволит вам написать код, имитирующий взаимодействие с веб-сайтом путем перехода по ссылкам и заполнением форм (самая сложная часть регистрации на защищенном сайте).

3. Используйте cookies. На защищенных веб-сайтах используются cookies. Вам нужно включить модуль обработки cookies с помощью оператора use, чтобы они работали автоматически в вашем сценарии.

4. Запуск отладки. Если сценарий работает не так, как нужно, запустите отладку с помощью use LWP::Debug qw(+); Этот оператор посылает большое количество данных на экран, наберитесь терпения, ведь в них содержится очень полезная информация.

5. Создайте файл вывода. Сбрасывайте выходные данные или данные после точки доставки каждой страницы в вашем сценарии в простой HTML-файл и изучите его. Содержимое файла обеспечивает четкую картину того, что получил сценарий взамен на запросы GET.

Примените этот перечень к вашему сценарию, и вскоре вы получите автоматический доступ на защищенные веб-сайты с помощью Perl.



Брет Свиден, GWA IT Architect, IBM


Сетевые решения. Статья была опубликована в номере 04 за 2007 год в рубрике программирование

©1999-2024 Сетевые решения