Бесплатно Perl: бот для джаббер-комнаты

Тема в разделе "Сборник статей по безопасности и анонимности", создана пользователем Hermanicus, 1 апр 2017.

  1. Совсем недавно группа заинтересованных лиц организовала джаббер канал ав-скул.

    В связи с этим возникла идея сделать бота, который будет делать для этой комнаты что-то полезное. Долго размышлять не пришлось - задача сформулировалась так: сообщать в общий чат о новых записях в блогах.

    Для реализации такого робота я решил использовать скриптовый язык 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 сохраняется номер самой новой ссылки на данный момент.

    Дальше сравнение полученных номеров ссылок с той, которая была самой новой при прошлой проверке:

    Если номер полученной только что ссылки больше номера самой новой из прошлого раза, то в чат отправляется сообщение:
    1. Цитата
    2. Новое в блогах
    3. Название новой записи by Имя Автора
    4. Ссылка на запись
    5. Ссылка формируется из заготовки, находящейся в переменной $avschool_link и номера записи. Перед отправкой сообщение переводится в юникод.

    И последний кусочек:

    Снова открываем файл Old_State.txt, но на этот раз для того, чтобы записать в него номер ссылки, являющейся самой новой при данной проверке.

    А затем отправляем скрипт спать на 600 секунд и все повторяется снова.

    В результате наш бот будет оперативно сообщать о новых записях, появившихся в блогах
     

Поделиться этой страницей