Отправка служебных сообщений в whatsapp через yowsup2 методом http-get, в том числе отчетов бэкап-сервера Bacula
Достаточно много видел примеров использования whatsapp-уведомлений с zabbix, и другими системами мониторинга, но на собственные эксперименты с whatsapp меня вдохновила эта статья. Однако если с системами мониторинга все ясно, то при наличии прекрасной «врожденной» системы email-оповещений, городить огород ради одной bacula было откровенно лень. Да и вдруг, потом захочется поставить zabbix или еще что-то куда-то послать? Каждому боту по ватсапу? Так что, пусть это будет что-то более универсальное. Например, отдельный сервер, который сможет обслужить bacula, zabbix, syslog-сервер, сайт или даже виндоусы с макинтошами.
UPD: Сразу оговорюсь, что задачи «наиболее простым путем отправить произвольное сообщение на телефон» не стояло, так как есть джаббер, смс, любой мобильный email-клиент, наконец. Задача была: а) приспособить именно whatsapp, так как он уже есть в моем телефоне и еще около 1 млрд других, в отличие от того же пресловутого telegram б) сделать как можно более универсальный шлюз, с которого можно быстро перенаправить рассылку хоть куда, а то и дублировать.
Приступим. Я ставил на «пустой» Centos 7 amdx64 в lxc-контейнер под proxmox ve 4.4.
Первое, что обычно делаю — обновляю, подключаю epel и ставлю ssh, чтобы потом удобно работать
Далее ставим зависимости и yowsup:
Скачиваем, распаковываем и устанавливаем yowsup:
Регистрируем номер мобильного. Симка вставлена в мобильник (или шлюз, в моем случае) на который придет смс. Номер не должен быть засвечен в whatsapp. Сначала запрашиваем код регистрации:
В ответ придет смс с кодом вида XXX-XXX, который используем для подтверждения регистрации
Сервер сообщит об удачной регистрации:
Записываем пароль из переменной pw в конфиг-файл
В этом файле три строчки (страна, номер, пароль):
Собственно, все. Пробуем
Если сообщение пришло, двигаемся дальше. Чтобы комфортно побаловаться живым whatsapp-чатом из терминала — нужна кириллица. Если ее нет, а вместо нее ошибки вида «ascii … ordinal not in range(128)» — надо поставить локаль и поправить один файл.
С localectl в моем сетапе какие-то проблемы, поэтому:
пишем LANG=ru_RU.UTF-8 , сохраняем и рестартуем сессию
Следующим шагом надо поправить кодировку yowsup. Делаем, как сказано тут.
После строки import sys добавить:
Теперь можно запускать живой чат и слать-принимать сообщения кириллицей. Have fun.
Наигравшись вдоволь, пора приспособить этот прекрасный инструмент для нужд трудящихся вокруг серверов. Для этого было решено использовать достаточно простой и гибкий инструмент Webhook github.com/adnanh/webhook, хотя есть и масса других способов. Например shell2http github.com/msoap/shell2http.
Скачиваем и распаковываем webhook в любой каталог. Я для удобства положил в /var/webhook
А чтобы потом, при желании, было удобнее добавлять всякие файлы-картинки-видео — так же скопировал yowsup-cli.config в /var/yowsup Как говорится, пусть все будет через одно место.
Поскольку Webhook позволяет запускать через http заранее подготовленные команды — создадим файл с правилами hooks.json .
В файле опишем хук, который будет принимать команды по адресу http://адрес сервера:9000/hooks/wp-admin , обрабатывать и слать сообщения на whatsapp админа. Внутрь файла добавляем описание условий:
То есть, каждый, кто вызовет url http://адрес сервера:9000/hooks/wp-admin?msg=привет — исполнит скрипт /var/webhook/admin.sh , а тот, в свою очередь, отправит привет админу на whatsupp, и только ему. Я решил не передавать каждый раз пару телефон-сообщение, а при необходимости рассылки на другие номера создать дополнительные хуки. Например, хук с отправкой определенному контакт-листу или универсальный с парой телефон-сообщение и каким-то токеном для вящей безопасности.
Итак, проверяем, правильно ли мы написали хук, запуском:
Далее, создаем скрипт отправки /var/webhook/admin.sh, который будет отсылать сообщения админу:
Добавлена проверка на пустоту и пробелы, чтобы при любом вызове хука не приходили пустые сообщения.
Открываем в браузере http://адрес сервера:9000/hooks/wp-admin?msg=привет . Все должно работать. Добавляем хук в автозагрузку. Я сделал через systemd .
Сохраняем. Запускаем. Проверяем.
Теперь можно сделать простую отправку средствами curl с другой машины
Однако, так можно слать лишь скучные сообщения без форматирования, похожие на sms. Чтобы получать красиво отформатированные сообщения, да еще и с emoji-графикой нужно предварительно кодировать содержимое msg в urlencode. Иначе в url попадут esc-последовательности. Это пригодится и для дальнейшего примера с Bacula.
сurl умеет делать urlencode самостоятельно, только синтаксис будет иным. Например, отправим сообщение с переводом строки:
Теперь можно заняться bacula, т.е. тем, что, собственно, и сподвигло на вышеописанные пляски Идем на сервер, где установлен bacula-director, ставим bc и curl.
Потом берем прекрасный скрипт из статьи bacula.us/sending-notification-whatsapp и немного подправляем. Внимание, если хотим использовать смайлики emoji, то файл должен быть в UTF-8.
Из секции Variables удаляем RECIPIENT_NUMBER и CONF, они нам не понадобятся. А переменную YOWSEXEC изменяем на curl-вызов хука отправки админу.
Вводим свои данные для подключения к MySQL
И вместо строки отправки:
Ставим права на исполнение:
Готово. Теперь, как указано в статье, можно вставлять в задания
и получать на телефон красивые отчеты:
Всем спасибо. Буду благодарен за комментарии и поправки.
UPD(12.01.2018): Yousup обновили до 2.5.7, баги поправили. Если у кого не работает — обновить yowsup, при регистрации использовать --env android (поправил выше).