Как и многие использую астериск для организации телефонной связи. У абонентов кроме их внутреннего номера есть также номер мобильного, куда совершаются переадресации, а также рассылаются смс в случае пропущенного вызова.


Традиционно уведомления о пропущенных звонках отправлялись или на емейл, или на мобильный в виде смс. С появлением Телеграм стало возможным отправлять сообщения в мессенджер. Одна незадача: мы не можем отправить сообщение именно на номер мобильного.


А нам это удобнее, т.к. номера мобильных у нас уже есть (у нас есть сотни абонентов, желающих получать уведомления :), а chat id еще найти надо, да еще и для каждого свой.


Решение: небольшой чат-бот.


Чат-бот принимает пользователя и спрашивает у него номер телефона. Затем полученный номер и соответсвующий chat id сохраняет на сервер. Теперь мы можем отправлять уведомление на номер на наш сервиса, а бот, привязанный к сервису, будет будет пересылать это уведомление соответствующему пользователю в телеграм. Получается и дешево (мы теперь не платим за смс), и сердито.


Два момента


  1. пока пользователь не подключится к боту, мы не можем отправлять ему сообщения.
  2. идентификатор пользователя отправившего номер и идентификатор пользователя имеющего отправленный номер сравниваются, в случае расхождения пользователь не будет ассоциирован с указанным номером

Приложение маленькое, но крайне полезное. Отправлять можно любое сообщения (которое ранее отправлялось через смс или емейл) — уведомления о звонках, ошибках, падениях серверов и т.д.


Немного деталей


Отправка происходит путем отправки http-запроса на локально запущенный веб-сервер, который по совместительству реализует чат бота. Сервер производит поиск соответствия в БД mongo и затем отправляет данные в Телеграм. Все просто.


Веб-сервер написан на nodejs, для взаимодействия с Телеграмом используется замечательная библиотека telegraf.


Как создать бота и получить токен уже есть инструкция.


Как отправить сообщение?


POST-запрос с json сообщением


Например:


curl -X POST   http://localhost:3030/send/<number>   -H 'content-type: application/json'   -d '{"text": "Ahtung!!"}'

Как это работает у меня? После завершения вызова астериск вызывает небольшой скрипт, который смотрит статус вызова и отправляет по необходимости сообщение. Вот и все.


Исходники на гитхабе: telegram-alert
Установка описана в репозитории.
Для желающих быстрого старта есть docker-compose.yml


Видео использования (50 секунд)



Предложения? Вопросы?

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


  1. KoMePcAHT
    11.10.2017 05:05

    а request_contact для ботов не работает? пользователю нужно руками вводить номер своего телефона?


    1. antirek Автор
      11.10.2017 05:06

      Почему не работает? Как раз через request_contact и запрашивается номер пользователя. В коде это вот github.com/antirek/telegram-alert/blob/master/index.js#L34 Можно и на видео увидеть появление кнопки и запрос контакта.


      1. KoMePcAHT
        11.10.2017 05:19

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


  1. DieSlogan
    12.10.2017 17:28

    Мы сделали немного иначе, у нас есть двусторонний мобильный номер, на который пользователь может слать смс. Если пользователю нужен бот, то он шлет смс с текстом «Telegram». В ответ ему приходит смс с ссылкой на бота и параметром уникального ключа.
    После входа активируется ваша схема, т.е. запрос номера телефона и сохранение уже в базе, только в нагрузку идет еще сверка уникального ключа.


    1. antirek Автор
      13.10.2017 05:28

      Ой, вы перестраховщики! )) Тоже думал на счет верификации, но так как мы всегда шлем на конкретный номер, то есть мы заведомо знаем нужный номер, то даже подключение «левых» номеров, не позволяет этим левым получать инфо. Ну и команд нет, поэтому все просто.