Совсем недавно группа заинтересованных лиц организовала джаббер канал ав-скул. В связи с этим возникла идея сделать бота, который будет делать для этой комнаты что-то полезное. Долго размышлять не пришлось - задача сформулировалась так: сообщать в общий чат о новых записях в блогах. Для реализации такого робота я решил использовать скриптовый язык Perl, на котором достаточно быстро и удобно можно автоматизировать подобные несложные задачки. Итак, первое, что нам понадобится, это подключение библиотек, необходимых для работы со страницами в интернет, для перевода текста в разные кодировки и для подключения к джаббер-сервису: Производим подключение к серверу jabber.org: Сначала устанавливаем соединение, а потом аутентифицируемся. В случае успешного выполнения подключения выводим сообщение, что все в порядке. Если возникают ошибки - прекращаем работу скрипта с выводом ошибки. После этого заходим в комнату: Теперь самое время объявить несколько переменных, которые потребуются в дальнейшем: Тут мы указываем путь, по которому в дальнейшем будет располагаться файл, заготовку для ссылки на запись в блоге и ссылку на главную страницу ав-скул. Затем начинаем вечный цикл: Первым делом скачиваем главную страницу ав-скул и помещаем ее в переменную $content. Затем переводим из кодировки windows-1251 в юникод. Разбиваем на отдельные строки, которые помещаем в массив @page_to_parse. После этого выбираем из этого массива элемент, содержащий ключевую подстроку: $reg1 Если вы откроете код главной страницы ав-скул и выполните поиск по этой строке, то найдете блок Новое в блогах. Именно он-то нам и нужен. Найдя нужную строку мы разделяем ее по элементу: $reg2 Именно такой кусок кода содержится перед каждым названием блога. Разделенные части помещаем в массив @stage1 И сдвигаем полученный массив на один элемент - это то, что находилось перед первым названием и больше нам не потребуется. После этого каждый элемент массива будет выглядеть примерно так: Вот на этом примере и рассмотрим, что происходит дальше. Для того, чтобы выделить из этого набора слов название блога эту строку нужно разделить по элементу $reg3 Очевидно, что после такого разделения нулевым элементом массива @titles_clear_temp окажется До чего дошёл прогресс!!!, а первым - все остальное: Нулевой элемент помещаем в массив @Titles, остальное в массив @stage2, который передается дальше: Тут разделителем выступит $reg4 , который разделит строку на ?dn=blogs&to=comment&id=1278 и все остальное: Для выделения из ?dn=blogs&to=comment&id=1278 номера записи используем регулярное выражение: s/?dn=blogs&to=comment&id=// Результат помещаем в массив @Links, а остальное в массив @stage3, который передается дальше: На данном этапе мы получаем автора записи. Для этого выбираем разделитель до имени автора $reg5 и после $reg6 После первого разделения получаем: Первое нам не нужно, а второе разделяем снова и на этот раз получаем Kiwi и еще множество элементов, так как разделитель < встречается неоднократно. Но это не важно - главное, мы получили ник автора - Kiwi и помещаем его в массив @Authors, а остальное нас не интересует. После этого шага мы имеем три массива @Links @Titles @Authors. В них собраны по порядку все номера записей, соответствующие им названия и имена авторов. Теперь нужно выяснить, а что же нового появилось с прошлой проверки. Для этого открываем предварительно созданный файл Old_State.txt, расположенный в каталоге, путь к которому был указан ранее в переменной $WorkDir. Файл содержит одну строку - номер записи, которая была самой новой при прошлой проверке. Этот номер помещаем в переменную$OldLink и удаляем символ переноса строки: Кроме этого, в данном блоке кода в переменную $SavedLink сохраняется номер самой новой ссылки на данный момент. Дальше сравнение полученных номеров ссылок с той, которая была самой новой при прошлой проверке: Если номер полученной только что ссылки больше номера самой новой из прошлого раза, то в чат отправляется сообщение: Цитата Новое в блогах Название новой записи by Имя Автора Ссылка на запись Ссылка формируется из заготовки, находящейся в переменной $avschool_link и номера записи. Перед отправкой сообщение переводится в юникод. И последний кусочек: Снова открываем файл Old_State.txt, но на этот раз для того, чтобы записать в него номер ссылки, являющейся самой новой при данной проверке. А затем отправляем скрипт спать на 600 секунд и все повторяется снова. В результате наш бот будет оперативно сообщать о новых записях, появившихся в блогах