Портал для веб-мастера

Инструменты для Бизнеса

Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » PERL/CGI

Создание news-reader'а с веб-интерфейсом.

Каждый, кто начинает программировать на Перле, сталкивается с аббревиатурой CPAN, что значит Comprehensive Perl Archive Network ("всеобъемлющий архив по Перлу") CPAN - прекрасный ресурс, где можно отыскать все что угодно, связанное с Перлом. В мире много зеркал CPAN, так что выбирайте то, которое вам ближе географически. Для этого сходите на ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN, где есть список всех зеркал.

Немного об организации архива. Каждое зеркало центрального сервера содержит файл CPAN/Roadmap или CPAN/Roadmap.html, а также CPAN/modules/Readme, где есть описания всех содержащихся модулей. Вы скажете - Зачем нам эти модули? Мы и сами можем написать... Ну если так - то пожалуйста, пишите сами. А те, кто желает сэкономить время и силы, зайдите на CPAN и найдите для себя уже готовый модуль.

Не так давно передо мной стала задача - сделать что-то наподобие news-reader'а прямо на веб-странице. То есть: при обращении к серверу пользователь получает список сообщений в группе новостей (конференции) в виде ссылок на сами сообщения. Щелкнув по ссылке, пользователь сможет поглядеть картинку, содержащуюся в сообщении. Доступ к конференции осуществляется по протоколу NNTP.

Мне нужен был CGI, NNTP и base64 для декодирования картинок внутри сообщений. Для обеспечения CGI-интерфейса был взят модуль CGI.pm (CPAN/authors/id/LDS/CGI.pm-2.13.tar.gz). Для того, чтобы общаться с news-сервером по NNTP протоколу я нашел NNTPClient все там же на CPAN - CPAN/authors/id/RVA/NNTPClient-0.22.pm.gz. Ну и последний компонент - base64 декодировщик я нашел в модуле LWP (MIME:Base64) (CPAN/authors/id/LDS/CGI-modules-2.74.tar.gz.)

Использование библиотек, написанных не мной самим, позволило отвлечься от низкоуровневых задач, и сконцентрироваться на самом высоком уровне функционирования скрипта. Да и время сэкономило немало.

Вот такой скрипт получился в результате:

Скрипт 1

 =1= #!/usr/bin/perl =2= =3= use CGI; # must be version 2 or higher =4= use News::NNTPClient; =5= use MIME::Base64; =6= =7= $nntpserver = "news.teleport.com"; # location of news server =8= =9= ## because of the copyright nature of this material, you should =10= ## put this script in a directory that has an appropriate htaccess file. =11= =12= @groups = ( =13= ["clari.living.comics.bizarro", "Bizarro"], =14= ["clari.living.comics.cafe_angst","Cafe Angst"], =15= ["clari.living.comics.doonesbury","Doonesbury"], =16= ["clari.living.comics.forbetter","For Better or For Worse"], =17= ["clari.living.comics.foxtrot","Foxtrot"], =18= ["clari.living.comics.ozone_patrol","Ozone Patrol"], =19= ["clari.editorial.cartoons.toles","Toles"], =20= ["clari.editorial.cartoons.worldviews","Worldviews"], =21= ["clari.news.photos","News photos (not a comic, but handy)"], =22= ); =23= =24= $Q = new CGI; =25= $Qself = $Q->self_url; =26= =27= unless ($group = $Q->param('group')) { # nothing at all, give index =28= $links = join "\n", =29= map { "<p><a href=\"$Qself?group=$_->[0]\">$_->[1]</a>" } @groups; =30= =31= print <<"GROK"; q/"/; =32= @{[$Q->header]} =33= @{[$Q->start_html('Comics','merlyn@stonehenge.com')]} =34= <h1>Read the Comics</h1> =35= <p>Select the group you want to read: =36= <HR> =37= $links =38= <HR> =39= <p>Please respect the copyrights and license agreements of this service. =40= @{[$Q->end_html]} =41= GROK =42= q/"/; =43= exit 0; =44= } =45= =46= unless ($article = $Q->param('article')) { # group but no art, give group =47= $N = new News::NNTPClient($nntpserver,119,0); =48= for ($N->xover($N->group($group))) { =49= ($numb,$subj) = split /\t/; =50= $links .= "<p><a href=\"$Qself&article=$numb\">$subj</a>\n"; =51= } =52= =53= print <<"GROK"; q/"/; =54= @{[$Q->header]} =55= @{[$Q->start_html('Comics','merlyn@stonehenge.com')]} =56= <h1>Read the Comics</h1> =57= <p>Select the article you wish to view: =58= <HR> =59= $links =60= <HR> =61= <p>Please respect the copyrights and license agreements of this service. =62= @{[$Q->end_html]} =63= GROK =64= q/"/; =65= exit 0; =66= } =67= =68= ## $group and $article both valid: =69= $N = new News::NNTPClient($nntpserver,119,0); =70= $N->group($group); =71= @art = $N->article($article); =72= shift @art while @art and $art[0] !~ /^Content-Type: (image\/[-a-z]+)/; =73= $type = $1; =74= shift @art while @art and $art[0] !~ /^\s*$/; =75= pop @art; # heh =76= $gif = decode_base64(join "", @art); =77= print "Content-type: $type\n\n"; =78= print $gif; =79= exit 0; 

Комментарии:

Строки 3-5: подключение модулей

Строка 7: Адрес news-сервера можно конечно же поменять.

Строки 12-22 определяют массив названий групп, в длинной форме - для сервера и в короткой - для человека. Длинное имя можно получить, например, так - $groups[2][0], а короткое - $groups[2][1]

В строке 24 создается CGI-объект $Q. Входные данные скрипт может получать из командной строки, через переменную окружения и из стандартного потока ввода.

Строка 25 позволяет получитьURL скрипта, который используется в дальнейшем.

В 27 строке проверяется входной параметр 'group'. И если его нет - то выводится полный список групп. Строки 28-44 создают страничку со списком доступных групп на основе массива @groups 28-29 строки создают переменную $links, содержащую ссылки на группы в виде:

 <p><a href="SOMEWHERE?group=clari.living.comics.doonesbury">Doonesbury</a> Где SOMEWHERE - это как раз URL скрипта. 

Строки с 32 по 40 выводят результат - заголовок, начало HTML-документа, список ссылок и конец HTML-документа. Конструкция @{[thing]} - это вывод 'thing' в списковом контексте. Можно было вместо этого просто разбить оператор print на несколько операторов print.

Строка 46: проверка на наличие входного параметра article.

Строки с 47 по 65 выводят список сообщений в выбранной группе.

Строка 47: установление соединения с news-сервером (порт 119 - стандартный)

Строки с 48 по 51: вывод тем всех сообщений в данной конференции. Выражение в строке 48 возвращает массив строк, где символом табуляции разделены номер и тема сообщения. 49 строка разбивает строки, а 50тая - создает строку со списком уже в HTML-виде, где на каждое сообщение - своя ссылка:

<a href="SOMEWHERE?group=clari.living.comics.doonesbury&article=123">Doonesbury</a>

Строки 52-60: вывод результатов

Строка 69 начинает часть скрипта, которая непосредственно выдает картинки, содержащиеся в отдельных сообщениях. Снова устанавливается соединение с news-сервером, и забирается уже конкретное сообщение.

Строка 71: сообщение укладывается в массив @art

Строка 72: так как важна только та часть сообщения, которая начинается с Content-type, то все остальные строки можно выкинуть. При этом сохраняется тип картинки (строка 73).

Строки 74-75: Пустая строка после Content-type пропускается

Строка 76: непосредственно декодирование из base64

Строки 77-78: вывод картинки браузеру

Автор: Анисимов Михаил · Добавлена: 2003-09-16
Просмотров: 2788 · Рейтинг: 1.0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Есть ли у вас свой сайт?
Всего ответов: 141618
Наша кнопка
WoWeb.ru - портал для веб-мастера