Достаточно много видел примеров использования whatsapp-уведомлений с zabbix, и другими системами мониторинга, но на собственные эксперименты с whatsapp меня вдохновила эта статья. Однако если с системами мониторинга все ясно, то при наличии прекрасной «врожденной» системы email-оповещений, городить огород ради одной bacula было откровенно лень. Да и вдруг, потом захочется поставить zabbix или еще что-то куда-то послать? Каждому боту по ватсапу?
Так что, пусть это будет что-то более универсальное. Например, отдельный сервер, который сможет обслужить bacula, zabbix, syslog-сервер, сайт или даже виндоусы с макинтошами.


UPD: Сразу оговорюсь, что задачи «наиболее простым путем отправить произвольное сообщение на телефон» не стояло, так как есть джаббер, смс, любой мобильный email-клиент, наконец. Задача была: а) приспособить именно whatsapp, так как он уже есть в моем телефоне и еще около 1 млрд других, в отличие от того же пресловутого telegram б) сделать как можно более универсальный шлюз, с которого можно быстро перенаправить рассылку хоть куда, а то и дублировать.

Приступим. Я ставил на «пустой» Centos 7 amdx64 в lxc-контейнер под proxmox ve 4.4.

Первое, что обычно делаю — обновляю, подключаю epel и ставлю ssh, чтобы потом удобно работать

yum -y update
yum -y install epel-release openssh-server
systemctl enable sshd
systemctl start sshd

Далее ставим зависимости и yowsup:

yum -y install unzip wget tar nano
yum -y install python python-dateutil python-argparse
yum -y install libtiff-devel libjpeg-devel libzip-devel freetype-devel lcms2-devel
yum -y install gcc
yum -y install protobuf pycrypto python-axolotl-curve25519
yum -y install python-devel python-pip python-imaging
pip install --upgrade pip

Скачиваем, распаковываем и устанавливаем yowsup:

cd /usr/src/
wget https://github.com/tgalal/yowsup/archive/master.zip
unzip master
cd yowsup-master/
python setup.py install

Регистрируем номер мобильного. Симка вставлена в мобильник (или шлюз, в моем случае) на который придет смс. Номер не должен быть засвечен в whatsapp. Сначала запрашиваем код регистрации:

yowsup-cli registration --requestcode sms --phone 7xxxxxxxxxx --cc 7 --mcc 250 --mnc xx

phone — ваш номер телефона, начинающийся с 7
cc — country code — это код страны (для России это 7)
mcc — mobile country code — это другой код страны (для России это 250)
mnc — mobile network code — это код вашего оператора. (01 — МТС, 02 — мегафон, 20 — теле2, 99 — билайн)

В ответ придет смс с кодом вида XXX-XXX, который используем для подтверждения регистрации

yowsup-cli registration --register xxx-xxx --phone 7хххxxxxxxx --cc 7

Сервер сообщит об удачной регистрации:

status: ok
kind: free
pw: X1isWwe+25d/aOXJpcSduzTV7fg=
price: 33,00 руб.
price_expiration: 1495380655
currency: RUB
cost: 33.00
expiration: 4444444444.0
login: 7хххххххххх X1isWwe+37d/aOXJpcSduzTV7fg=
type: new

Записываем пароль из переменной pw в конфиг-файл

nano yowsup-cli.config

В этом файле три строчки (страна, номер, пароль):

cc=7
phone=7хххxxxxxxx
password=X1isWwe+25d/aOXJpcSduzTV7fg=

Собственно, все. Пробуем

yowsup-cli demos -c yowsup-cli.config -M -s 7хххххххххх "alarm"

Если сообщение пришло, двигаемся дальше. Чтобы комфортно побаловаться живым whatsapp-чатом из терминала — нужна кириллица. Если ее нет, а вместо нее ошибки вида «ascii … ordinal not in range(128)» — надо поставить локаль и поправить один файл.

С localectl в моем сетапе какие-то проблемы, поэтому:

nano /etc/locale.conf

пишем LANG=ru_RU.UTF-8, сохраняем и рестартуем сессию

Следующим шагом надо поправить кодировку yowsup. Делаем, как сказано тут.

nano /usr/lib/python2.7/site-packages/yowsup2-2.5.2-py2.7.egg/yowsup/demos/cli/layer.py

После строки import sys добавить:

reload(sys)
sys.setdefaultencoding('utf8')

должно получиться:

from .cli import Cli, clicmd
from yowsup.layers.interface import YowInterfaceLayer, ProtocolEntityCallback
from yowsup.layers.auth import YowAuthenticationProtocolLayer
from yowsup.layers import YowLayerEvent, EventCallback
from yowsup.layers.network import YowNetworkLayer
import sys
reload(sys)
sys.setdefaultencoding('utf8')

Теперь можно запускать живой чат и слать-принимать сообщения кириллицей. Have fun.

Наигравшись вдоволь, пора приспособить этот прекрасный инструмент для нужд трудящихся вокруг серверов. Для этого было решено использовать достаточно простой и гибкий инструмент Webhook github.com/adnanh/webhook, хотя есть и масса других способов. Например shell2http github.com/msoap/shell2http.

Скачиваем и распаковываем webhook в любой каталог. Я для удобства положил в /var/webhook

cd /usr/src
wget https://github.com/adnanh/webhook/releases/download/2.6.3/webhook-linux-amd64.tar.gz
tar -xvf webhook-linux-amd64.tar.gz -C /var
mv /var/webhook-linux-amd64 /var/webhook

А чтобы потом, при желании, было удобнее добавлять всякие файлы-картинки-видео — так же скопировал yowsup-cli.config в /var/yowsup Как говорится, пусть все будет через одно место.

mkdir /var/yowsup
cp /usr/src/yowsup-master/yowsup-cli.config /var/yowsup

Поскольку Webhook позволяет запускать через http заранее подготовленные команды — создадим файл с правилами hooks.json.

cd /var/webhook?????
nano hooks.json

В файле опишем хук, который будет принимать команды по адресу http://адрес сервера:9000/hooks/wp-admin, обрабатывать и слать сообщения на whatsapp админа. Внутрь файла добавляем описание условий:

[
  {
    "id": "wp-admin",
    "execute-command": "/var/webhook/admin.sh",
    "command-working-directory": "/var/webhook",
    "pass-arguments-to-command":
    [
     {
      "source": "url",
      "name": "msg"
     }
    ]
  }
]

То есть, каждый, кто вызовет url http://адрес сервера:9000/hooks/wp-admin?msg=привет — исполнит скрипт /var/webhook/admin.sh, а тот, в свою очередь, отправит привет админу на whatsupp, и только ему. Я решил не передавать каждый раз пару телефон-сообщение, а при необходимости рассылки на другие номера создать дополнительные хуки. Например, хук с отправкой определенному контакт-листу или универсальный с парой телефон-сообщение и каким-то токеном для вящей безопасности.

Итак, проверяем, правильно ли мы написали хук, запуском:

./webhook -hooks hooks.json -verbose

В ответ увидим:
[webhook] 2017/04/26 05:12:48 version 2.6.3 starting
[webhook] 2017/04/26 05:12:48 setting up os signal watcher
[webhook] 2017/04/26 05:12:48 attempting to load hooks from hooks.json
[webhook] 2017/04/26 05:12:48 found 1 hook(s) in file
[webhook] 2017/04/26 05:12:48 loaded: wp-admin
[webhook] 2017/04/26 05:12:48 serving hooks on 0.0.0.0:9000/hooks/{id}

Далее, создаем скрипт отправки /var/webhook/admin.sh, который будет отсылать сообщения админу:

#! /bin/bash
msg="$(echo "$*" | tr ' ' ' ')"

if [[ ! -z "${msg/ //}" ]]; then
 /usr/bin/yowsup-cli demos -c /var/yowsup/yowsup-cli.config -M -s 7xxxxxxxxxx "$msg"
fi

Добавлена проверка на пустоту и пробелы, чтобы при любом вызове хука не приходили пустые сообщения.

Открываем в браузере http://адрес сервера:9000/hooks/wp-admin?msg=привет. Все должно работать. Добавляем хук в автозагрузку. Я сделал через systemd.

nano /etc/systemd/system/webhook.service

Описываем юнит:

[Unit]
Description=Webhook
After=syslog.target
After=network.target

[Service]
Type=simple
PIDFile=/var/webhook/webhook-service.pid
WorkingDirectory=/var/webhook

User=root
Group=root

OOMScoreAdjust=-500

ExecStart=/var/webhook/webhook -hooks hooks.json -verbose
ExecStop=/usr/bin/pkill -f webhook
ExecReload=
TimeoutSec=300

[Install]
WantedBy=multi-user.target

Сохраняем. Запускаем. Проверяем.

 systemctl enable webhook
 systemctl start webhook
 systemctl -l status webhook

Теперь можно сделать простую отправку средствами curl с другой машины

curl -G http://адрес сервера:9000/hooks/wp-admin?msg=привет

Однако, так можно слать лишь скучные сообщения без форматирования, похожие на sms. Чтобы получать красиво отформатированные сообщения, да еще и с emoji-графикой нужно предварительно кодировать содержимое msg в urlencode. Иначе в url попадут esc-последовательности. Это пригодится и для дальнейшего примера с Bacula.

сurl умеет делать urlencode самостоятельно, только синтаксис будет иным. Например, отправим сообщение с переводом строки:

export VAR="привет\nбуфет"
export MSG=$(echo -e $VAR)
curl -G http://адрес сервера:9000/hooks/wp-admin --data-urlencode msg="$MSG"

Теперь можно заняться bacula, т.е. тем, что, собственно, и сподвигло на вышеописанные пляски Идем на сервер, где установлен bacula-director, ставим bc и curl.

yum -y install bc curl

Потом берем прекрасный скрипт из статьи bacula.us/sending-notification-whatsapp и немного подправляем. Внимание, если хотим использовать смайлики emoji, то файл должен быть в UTF-8.

Из секции Variables удаляем RECIPIENT_NUMBER и CONF, они нам не понадобятся. А переменную YOWSEXEC изменяем на curl-вызов хука отправки админу.

# Variables
HOUR=$(date +%d/%m/%Y\ %H:%M:%S)
YOWSEXEC="curl -G http://ваш сервер:9000/hooks/wp-admin"
LOG="/var/log/bacula/whatsapp.log"

Вводим свои данные для подключения к MySQL

# MySQL config
DBUSER="bacula"
DBPASSWORD="bacula"
DBNAME="bacula"

И вместо строки отправки:

$YOWSEXEC demos --config $CONF --send $RECIPIENT_NUMBER "`echo -e "$MESSAGE${COUNT}"`" &>> $LOG

пишем:

FMSG=`echo -e "$MESSAGE${COUNT}"`   
$YOWSEXEC --data-urlencode msg="$FMSG" &>> $LOG

Ставим права на исполнение:

chmod +x /etc/bacula/send_whatsapp.sh

Готово. Теперь, как указано в статье, можно вставлять в задания

Command = "/etc/bacula/send_whatsapp.sh %i" 

и получать на телефон красивые отчеты:



Всем спасибо. Буду благодарен за комментарии и поправки.
Поделиться с друзьями
-->

Комментарии (17)


  1. Ranckont
    26.04.2017 12:44

    Разве в ватцапе уже разрешили ботов?


  1. Louie
    26.04.2017 12:57

    Это лишь номинально бот. Т.е. программа делающая рутинную работу за человека. Думаю, если на этой же базе сделать полноценный чат-бот или спам-бот — его быстро забанят.


  1. Erelecano
    26.04.2017 19:39

    Но зачем, если есть Телеграм с нормальными ботами?


    1. Louie
      26.04.2017 21:05

      1. Популярность. Для telegram, который мало кто из знакомых использует, мне придется держать на телефоне специальный мессенджер для бота. Если выбирать по простоте и «нормальности» — тогда уж лучше джаббер. Если по надежности для критических уведомлений — смс вне конкуренции, и плевать на красивости.
      Кроме того, wahatsapp, в силу, опять же, своей популярности, интересен и возможным использованием для какой-то гуманной адресной бизнес-рассылки.
      2. Если уж я трачу батарейку на содержание этого средства доставки фоточек младенцев и время на их просмотр — должна и польза быть-) Хоть даже себе на телефон ссылку какую скинуть быстро-)


      1. Erelecano
        26.04.2017 21:36
        -3

        1. Популярность в вашей маргинальной среде, вы хотели сказать?

        СМС по надежности где-то после голубиной почты. СМС могут не придти вообще, могут придти с опозданием на 48 часов, это как карта ляжет.


        1. Louie
          26.04.2017 22:19
          +1

          1. Ну почти-) 100 млн телеграмщиков против 1-миллиардного вотсап-быдла-))) Повторяю, для надежности проще поставить свой, посконный домотканный ни от кого не зависящий джаббер-сервер, на телефоне — xabber и voila! Но суть экспериментов была не в этом.
          Например, по многим показателям сбербанк гораздо хуже крутых и продвинутых коммерческих банков, а уж о швейцарских и говорить не стоит. Но есть ведь карточка, а? И «скинуть на сбер» проще, чем на весьма престижную и популярную «альфу»?

          А насчет голубей — это не как карта, а как инет ляжет. Ато может и рад будешь записочке на лапе и урурурурру -)


          1. Erelecano
            26.04.2017 22:38
            -4

            Миллиарды мух не могут ошибаться, о да!
            Посмотрел у себя в контактах, воцапп использует три человека, телеграм 65. Кажется что-то пошло не так и ваши миллиарды где-то в другом месте.
            Про сбер вообще чушь пишите. Из моих знакомых сбер использует только отец, потому что в РФ пенсионерам принудительно выдают сберовские карточки, добровольно его не использует никто. Все что угодно, Альфа, Рокетбанк, Тинькофф и так далее, а вот сбера нет. И кидать все равно на какую карту, был бы номер, хоть сбер, хоть хрер.

            Нет, не инет. СМС — самый ненадежный способ доставки сообщений. СМСки могут зависнуть у ОПСОСа, могут потеряться и так далее. При этом телеграм или джаббер при наличии интернета дойдут.


            1. Louie
              26.04.2017 23:06

              Эх, люблю ювенильный московский максимализм. Все 65 ведут телеграмы. Медведев завел блох в свитере. На банковские комиссии им плевать, а сбером только пенсы принудительно пользуются…

              Но, глянул я про телеграм и никаких особых отличий от ватсапа не нашел. Возможностей, кроме отправки по фамилии контакта и ботов с токенами — тоже. Закрытый код, смс регистрация… Если в моем примере Вместо yowsup-cli поставить из https://github.com/vysheng/tg telegram-cli — сможете своих 65 осчастливить.


              1. Erelecano
                26.04.2017 23:55

                Как же вас просто ловить на лжи. Исходники клиента открыты, спеки протокола открыты.
                При этом мы имеем нормальный API для ботов и нет нужды на левые номера что-то регить, при этом мы имеем клиенты под все платформы и возможность использовать их одновременно, при этом мы имеем ники и никаких фамилий. Ну и да, у меня заббикс пишет мне в телеграм уже года полтора, без ваших костыльных решений и левых симок.

                Ну и про комиссии вы врете, у нормальных банков комиссий нет, по крайней мере с определенных сумм. И, да, сбером пользуются вынужденно.


                1. Louie
                  27.04.2017 07:09

                  Тяжело с вами. Есть условно-открытый API для регистрации на их сервере, через который работают и боты и открытые клиенты. Это все. Что происходит дальше в Вегасе — остается в Вегасе. Если вы не «программист 1с» (хотя похож) то поймете разницу. https://yalantis.com/blog/whats-wrong-telegram-open-api/
                  Про спеки каких протоколов речь? Http? Https?

                  Ладно. напишу дисклеймер в статье насчет телеграм. Но уверяю, если вам заббикс пишет полтора года без регистраций и симок — кто-то это сделал за вас.


                  1. Erelecano
                    27.04.2017 16:23

                    > кто-то это сделал за вас

                    Судя по вашим повизгиваниям вы не понимаете, что люди могут что-то делать сами. Пытаться донести до вас хоть какую-то информацию бесполезно.


                    1. Louie
                      27.04.2017 19:16
                      +1

                      Донес уже. Узбагойся. Сам поставил телеграм, сам отправил в телеграм, сам нафлудил в теме про вотсап — возьми с полки пирожок. Молодец


  1. uglymaxweber
    26.04.2017 21:05

    Мой опыт использования yowsup показал, что это ПО нестабильно. Whatsapp часто обновлял протокол, а от этого yowsup переставал работать. Еще периодически слетала регистрация. Для стабильности пришлось съезжать на api telegram'а. Теперь все работает как часы.


    1. Louie
      26.04.2017 21:19

      Ага. Был трабл, когда шифрование ввели. Это нормально. Помнится, ICQ на пике популярности подобным увлекались. Хоп, и все любители кипов, миранд и т.п. стонут и зубовно скрежещут-) Золотые времена.
      Но ведь и описанное мной решение на скорую руку скрещенного бульдога с носорогом вполне соответствует стабильности чат-сетей типа телеграма-вайбера-вотсапа. Гармония.
      А для стабильных критических уведомлений используется многоканальный смс-шлюз и джаббер. Всем советую на них сьехать-))


  1. XNoNAME
    26.04.2017 23:06

    Мда, а в телеграмме можно одним GET запросом обойтись к их API
    Даже устанавливать ничего не надо и тем более симку регистрировать.


    1. Louie
      27.04.2017 07:26

      Можно. Много есть API к которым несложно послать запрос. Можно в твиттер, вконтакте или, например, в NASA.
      Выбор большой Как выше говорил, есть свой сервер jabber, sms итд.
      Но, задача была — отправить whatsapp.


    1. Smithson
      27.04.2017 15:16

      А потом инет лег и какая жаль! Независимый канал оповещения НУЖЕН (это про голубей и смс)…
      А что касается выбора, в умные или в красивые, то вацап старше телеграма, поэтому для многих он первый, а телеграм — подобие.

      Конкретно у меня, например, все друзья и коллеги — в вацапе (ну кроме тех, кто в icq ;)), а в телеграме только жена, потому что на её работе он by default. Каждому — своё.