- Регистрация
- 25.01.17
- Сообщения
- 763
- Реакции
- 225
- Репутация
- 292
Совсем недавно группа заинтересованных лиц организовала джаббер канал ав-скул.
В связи с этим возникла идея сделать бота, который будет делать для этой комнаты что-то полезное. Долго размышлять не пришлось - задача сформулировалась так: сообщать в общий чат о новых записях в блогах.
Для реализации такого робота я решил использовать скриптовый язык 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 сохраняется номер самой новой ссылки на данный момент.
Дальше сравнение полученных номеров ссылок с той, которая была самой новой при прошлой проверке:
Если номер полученной только что ссылки больше номера самой новой из прошлого раза, то в чат отправляется сообщение:
И последний кусочек:
Снова открываем файл Old_State.txt, но на этот раз для того, чтобы записать в него номер ссылки, являющейся самой новой при данной проверке.
А затем отправляем скрипт спать на 600 секунд и все повторяется снова.
В результате наш бот будет оперативно сообщать о новых записях, появившихся в блогах
В связи с этим возникла идея сделать бота, который будет делать для этой комнаты что-то полезное. Долго размышлять не пришлось - задача сформулировалась так: сообщать в общий чат о новых записях в блогах.
Для реализации такого робота я решил использовать скриптовый язык 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 секунд и все повторяется снова.
В результате наш бот будет оперативно сообщать о новых записях, появившихся в блогах