Черт возьми! Не успел…. или мониторинг сайта и оповещение на почту с помощью Node JS.

Hydrock
Front Stories
Published in
4 min readJan 7, 2019

Привет 👋. Давненько я не писал статеек.

Я очень люблю канал …and Action! на youtube. Там парень рассказывает о том, как снимается кино и прочие интересности. Недавно они сделали анонс своей короткометражки. Ее покажут 19 января в Москве, в библиотеке им. Н.А. Некрасова. Но перейдя на сайт для бронирования места, я обнаружил что регистрация закончена.

😨 Все билеты проданы…

Что же делать? Есть небольшая вероятность, что кто-нибудь откажется от билета. Пора написать мониторинг! К тому же я давно хотел попробовать отправку почты с помощью NodeJS.

Начнем с того, что нужно написать небольшой мониторинг сайта. Сделать http запрос и получить тело html страницы, в NodeJS, можно несколькими способами. Я возьму стандартный модуль http. Создадим файл index.js и напишем в нем следующий скрипт:

И запускаем node index.js .

Мы просто делаем запрос до нужного нам ресурса и проверяем, есть ли в ответе та самая строка. Т.е. когда строка о закрытой регистрации не будет найдена, мы сможем уведомить себя об этом.

Кажется работает…

Отлично. Теперь сделаем уведомление на почту. Воспользуемся модулем nodemailer.

Устанавливаем

Напишем скрипт:

Плагин отлично работает с gmail и yandex. Только будьте осторожны со своими секретными паролями, не оставляйте их в публичном доступе.

Далее все просто. Создаем опции, контент письма, создаем специальный объект транспортера и отправляем.

Пришло письмо…

Так… осталось соединить эти вещи. Когда скрипт мониторинга не обнаружит ненавистную строку, о том что регистрация закрыта, отправим себе письмо.

Итоговый скрипт выглядит примерно так:

Я проверил скрипт просто. Создал пустой текстовый файл со строкой “Регистрация на мероприятие завершена”, на сервисе github gist. И начал мониторить эту страницу со своего локального компьютера. Как только я удалил эту строку и gist-a — мне пришло то самое письмо — оповещение.

В целом можно было бы и закончить… но было бы нелепо держать мониторинг на локальной машине. Вынесем его на сервер.

Я воспользуюсь новым сервисом - облако от яндекса. Там дают пробный период, так что можно поиграть. Описывать его в данной статье не буду, если интересно — напишите в комментариях, сделаю простенький обзор.

Копируем файлы на уделенный сервер с помощью ssh, через терминал. И сталкиваемся с проблемой запуска скрипта. Дело в том, что если мы закроем терминал, то процесс NodeJS будет тут же завершен. В данной проблеме нам поможет модуль forever. Это CLI (консольная) утилита для мониторинга ваших процессов. Т.е. ваши процессы будут как demons в linux. Если node программа, запущенная через forever, завершится — forever запустит программу вновь. Но в нашем случае нам нужно просто запустить некую программу и оставить работать её на сервере, не боясь закрыть терминал.

Устанавливаем на сервере глобально:

sudo npm install forever -g

Запускаем с ключем -m 1 (перезапускать программу только один раз):

forever start -m 1 ./index.js

Просмотреть список всех процессов node:

forever list
Так выглядит список всех запущенных процессов

Если нужно убить процесс, то выполним эту команду (0 — индекс процесса):

forever stop 0

Вот и все! Теперь наша программа запущена модулем forever. Можно смело закрыть терминал и идти по своим делам. Наша программа будет мониторить целевой сайт и если на нем пропадёт строка “Регистрация на мероприятие завершена” — отправит сообщение на почту и программа завершится.

Вот в целом и все! Без лишних подробностей 😊. В этом репозитории код из примеров, плюс добавил туда логи.

… оказалось что облако замораживает выполнение скриптов если к серверу нет обращений… так что тут еще нужно покопаться…

На самом деле, все решилось гораздо проще. На сайте библиотеки, где я должен был зарегистрироваться, форма была просто скрыта 😂, поэтому я легко получил своё приглашение.

Я надеюсь, вам понравился пост. Если да, похлопайте 👏, чтобы помочь другим найти эту информацию. И не стесняйтесь оставлять комментарии — буду рад любым замечаниям!

--

--