Привет! Итак, я вижу, ты
решил основательно взяться за свою
страничку. Сегодня я помогу тебе сделать её
более продвинутой. Ты, наверное, часто
встречал разделы новостей на крутых сайтах,
и всегда мечтал, чтобы на твоём сайте был
такой же. Да-да, я понимаю, что тебе не
хватает времени в IRC посидеть, а тут
придется искать эти чёртовы новости. Хорошо
бы было, если б их для тебя искал кто-нибудь (или
что-нибудь) другой. И сейчас я расскажу тебе
о небольшом скрипте, который будет “выуживать”
эти самые новости из крутых сайтов. Дело,
конечно, нехорошее - тырить чужие новости,
но я думаю, они не обидятся =) Писать будем на
Perl. Все, что требуется от тебя это найти
подходящий сайт с новостями, просмотреть
его source и между какими тегам находятся
новости. Далее ты меняешь пару строк в
скрипте и всё! Теперь вместо того, чтобы
тратить драгоценное время инета на поиски
новостей, тебе нужно будет всего лишь
обновить базу данных! В общем, лови сам
скрипт (мои комментарии будут следовать за #):
#!/perl/bin/perl #Путь к Perl,
желательно правильный =)
#Далее подключаем необходимые нам модули
use LWP::Simple; #Этот модуль
поможет нам скачать страничку с новостями
use CGI qw(param); #Модуль для
извлечения передаваемых ключей
print "Content-type: text/html\n\n";
$action = param("action"); #Извлекаем значения
ключа action
if ($action eq "refresh") { #Значение равно refresh (обновить)
?
$content = get("http://www.somedomain.ru/newspage.html"); #Скачиваем
# страничку newspage.html и
записываем её source в переменную и всё
# это не без помощи
модуля LWP :)))
@first = split("\n",$content); #Разбиваем source
странички по символу перевода
# строки и записываем их
в массив @first
for($i = 0;$i <= $#first+1;$i++) { #Цикл для “прохода” по
всему массиву.
# $#имя это количество элементов в массиве “имя”
на 1 меньше
if ($flag == 0) { #Переменная
flag равна 1, если мы уже дошли до нужного тега
if ($first[$i] = ~/ начальный
тег /) {
delete $first[$i]; #Удаляем элемент массива (точнее
делаем его пустой строкой)
$flag = 1
} else {delete $first[$i]} } elsif ($flag == 1) {
if ($first[$i] = ~/ конечный тег /) {
delete $first[$i];
$#first = --$i; #Сократить длину массива, т.е.
удалить все следующие элементы
last; #Выходим из цикла
}}}
foreach $item(@first) {if ($item) {push(@second, $item)}} #Все
элементы которые
# не являются пустыми
строками заносим в массив @second (они, кстати,
и
# есть нужные нам
новости)
foreach $item(@second) {$item = "\n";} #Каждому
элементу добавляем “\n”
open(FILE,">file.dat"); #Открываем файл в
режиме перезаписи
print FILE @second; #Записываем
в него весь массив. Он запишется
# в столбик, т.к. мы
прибавили каждому элементу символ перевода
строки.
close(File);
} elsif ($action eq "") { #Если значение ключа
пустое или не указано, т.е. нам
# нужно, чтобы скрипт
просто вывел все новости на экран.
open(FILE,"file.dat"); #Открываем файл в режиме
чтения
while (<FILE>) { #Читаем по
одной строке
print $_ #Выводим на экран
}
close(FILE)
}
Ну, вот и всё. Не забудь
вставить в поиск по шаблону настоящие
добытые тобой теги (или просто строки).
Когда будешь их вставлять, не забудь
проверить на содержание специальных
символов. Например, если в строке будет
символ “/”, то перед ним нужно будет
поставить “\”, тем самым ты говоришь, что
следующий символ – обыкновенный (тег </td>
станет <\/td>) Если в этой строке будут
содержаться числа, которые могут со
временем измениться, то вместо них лучше
написать “\d+”. Ну, в общем, пораскинь
мозгами =)
Отдельный случай для тех,
у кого есть шелл с возможностью запуска
программ в background процессе. Тогда ты можешь
написать небольшой скрипт-демон, который
будет раз в сутки, например, вызывать наш
скрипт с параметром refresh. И тогда тебе
вообще не нужно будет заботиться о новостях,
обо всём позаботится Perl :)))
Теперь, когда скрипт
готов, тебе только осталось
подредактировать свой html. В том месте, где
ты хотел бы видеть свои новости, тебе нужно
вызвать наш скрипт с помощью директивы <!--#exec
cgi="/путь/название.cgi"-->. Также, если ты
собираешься сам обновлять базу данных,
можно нарисовать маленькую картинку под
цвет фона (примерно 7 на 7 мм) и где-нибудь
внизу вставь такой тег: <a href=”/путь/название_скрипта.cgi?action=refresh”><img
src=”/путь_к_картинке/название_картинки” border=”0”></a>
Теперь при нажатии на неё
ты обновишь базу данных. Почему не сделать
нормальную ссылку рядом с новостями? Потому
что обязательно найдётся чел, который
захочет пощёлкать по этой ссылке, а это
будет сильно тормозить загрузку остальных
посетителей.
Если возникнут вопросы,
то пиши на fork@e-mail.ru.
Удачи, Fork….