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

Напишите Perl-сценарий для автоматизации регистрации на веб-сайте.

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

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

Брет Свиден (Bret Swedeen) начал работать в IBM в 1997 году в качестве главного архитектора. Дипломированный инженер по Netware и дипломированный системный администратор по Lotus Professional System и Application Developer, Брет также писал статьи для Lotus Notes Advisor, Database Advisor, LAN Times, и LAN Magazine. В 1997 году он написал Путеводитель администратора по Lotus Notes 4.5, вышедший в издательстве Sybex. В настоящее время Брет разрабатывает на заказ инструменты мониторинга для корпоративного вычислительного окружения IBM.



06.03.2007

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

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

Perl в Windows?

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

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

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

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

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

Поиск и установка Crypt::SSLeay

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

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

Добавление TheoryX в Ваш список репозиториев

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

Если Вы правильно напечатаете команду, проблем с установкой не возникнет. Если же Вы допустите опечатку, перед Вами появится новое сообщение об ошибке: Error: Failed to download <your typographical error here> (Ошибка: Закачка не удалась <здесь приводится Ваша опечатка>).

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

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


Упростите свою жизнь

Следующее препятствие - отправка имени пользователя и пароля на защищённый сайт. В то время как Вы можете достичь эту цель, используя только LWP, на подсознательном уровне появляется желание написать сценарий, который взаимодействует со страницей таким же образом, как делаете это Вы с помощью обычного браузера, или хотя бы, по возможности, максимально к этому приближенным.

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

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

  1. Отложите в сторону Ваш код и откройте командную строку (это напомнит Вам о тех старых добрых временах, когда работали в DOS).
  2. Перейдите в папку C:\Perl\bin и напечатайте ppm. Диспетчер пакетов Perl запустится, и Вы окажетесь в командной строке ppm>.
  3. В командной строке ppm напечатайте search WWW::Mechanize. Поиск выдаст пару подходящих значений. Вам нужно то, которое выглядит как WWW::Mechanize (в моём поиске оно стояло первым).
  4. Для того, чтобы установить модуль, напечатайте install 1 (если Ваш поиск отображает WWW::Mechanize на другой позиции, введите другое число вместо 1).

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.

Учтите, что я нашёл имя формы и поля login и passwd, на сайте yahoo.mail.com, изучив исходный HTML-код страницы.


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

Мой сценарий работает? Конечно, нет! Очень редко мои сценарии 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-код и очень информативное сообщение.

Листинг 4. Ошибка в выводе отладки
<body>
If you are seeing this page, 
your browser settings prevent you from automatically redirecting to a new URL.
(Если Вы видите эту страницу, 
настройки Вашего браузера не позволяют Вам автоматически перейти по новому URL).
<p>
Please 
  <a href="http://us.f319.mail.yahoo.com/ym/login?
  .rand=###############">click here</a>
  to continue (нажмите сюда, чтобы продолжить).

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


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

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

Листинг 5. Окончательный сценарий
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! - отображать сообщение о неудаче перенаправления, моё простое решение срабатывает! Однако не все защищённые веб-сайты ведут себя так же как Yahoo!. Будьте готовы к тому, что Вам придётся хорошенько поломать голову, чтобы заставить Ваш сценарий регистрации работать.


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

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

  • Начните с Crypt::SSLeay: Регистрация на защищённом сайте обычно выполняется через HTTPS. Этот модуль Вам необходим. Вы можете найти его версию, скомпилированную для Windows, на сервере TheoryX в Канаде (см. Ресурсы).
  • Добавьте WWW::Mechanize: Чтобы упростить себе жизнь, используйте этот модуль, который позволит Вам написать код, имитирующий взаимодействие с веб-сайтом путём перехода по ссылкам и заполнением форм (самая сложная часть регистрации на защищённом сайте).
  • Используйте cookies: На защищённых веб-сайтах используются cookies. Вам нужно включить их с помощью оператора use, чтобы они работали автоматически в Вашем сценарии.
  • Запуск отладки: Если сценарий работает не так, как нужно, запустите отладку с помощью use LWP::Debug qw(+); Этот оператор посылает большое количество данных на Ваш экран, наберитесь терпения, ведь в них содержится очень полезная информация.
  • Создайте файл вывода: Сбрасывайте выходные данные или данные после точки доставки каждой страницы в Вашем сценарии в простой HTML-файл и изучите его. Содержимое файла обеспечивает чёткую картину того, что получил сценарий взамен на запросы "get".

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

Ресурсы

Научиться

Получить продукты и технологии

  • ActiveState: Скачайте Perl для Windows бесплатно.
  • TheoryX: Используйте эту базу для того, чтобы найти редкие Perl модули, такие как Crypt::SSLeay.

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux, Web-архитектура
ArticleID=200239
ArticleTitle=Доступ на защищённый веб-сайт с помощью языка Perl
publish-date=03062007