Уведомление о звонке по telegram

    image image
    Довольно часто компании, использующие Asterisk, сталкиваются с необходимостью автоматического перевода звонка на мобильный телефон сотрудника. Конечно, идеальным решением была бы установка на телефоны какого-нибудь софтфона, но далеко не везде качество мобильного интернета удовлетворяет потребности передачи голоса, так что звонок переводится именно на номер мобильного телефона. В соответствии с законодательством и внутренними правилами, операторы связи чаще всего не разрешают подстановку произвольного номера в качестве Caller ID, поэтому работники, которым переводится вызов, видят не номер звонящего клиента, а номер офиса. В некоторых случаях это даже удобно, но бывает и так, что перезвонить клиенту нужно немедленно. Конечно, работник может зайти в интерфейс статистики(если, конечно, он есть) и найти там номер звонившего, но это не всегда возможно и всегда абсолютно неудобно.

    Для решения задачи по передаче номера звонившего сотруднику на мобильный телефон использовали разнообразные методы: отправка смс (стоит дополнительных денег, требуется оборудование или договор с сервисом вроде sms.ru), озвучивание номера по звонку в офис и донабору некоего добавочного номера (долго, стоит денег, да и запомнить налету 11 цифр сложно), и наконец, jabber (которым сегодня мало кто пользуется).
    Столкнувшись с подобной задачей, мы захотели использовать telegram. На официальном сайте, в разделе Apps есть неофициальный консольный клиент под Linux — telegram-cli, что нам и нужно! Однако, в силу своей неофициальности, похвастаться установкой в один клик это приложение не может, так что придется собирать его из исходников. В сети можно найти одну и ту же инструкцию, которая кочует с сайта на сайт, однако следуя ей, мы потерпели неудачу, и не один раз.

    Итак, последовательность верных действий такова:
    Как обычно, обновляем систему
    apt-get update или yum update.
    

    Для корректной работы telegram-cli требуется python версии 2.7 и выше. Проверить, какая именно версия установлена у вас (если, конечно, она вообще установлена) можно так:
    python -V
    

    Еще потребуются следующие пакеты
    для ubuntu server 14.04
    libreadline-dev libconfig-dev libssl-dev lua5.2 liblua5.2-dev libevent-dev libjansson-dev libpython-dev make
    

    для centos 6.X
    lua-devel openssl-devel libconfig-devel readline-devel libevent-devel libjansson-devel python-devel
    

    а также git
    Как только необходимые пакеты установлены, можно приступать к установке самого telegram-cli
    Выберем каталог, где он будет находиться.
    cd /usr/src
    

    И получим сами исходники
    git clone --recursive https://github.com/vysheng/tg.git
    

    теперь можно перейти в каталог и приступить к сборке
    cd ./tg
    ./configure
    

    а вот перед make мы рекомендуем открыть файл ./tgl/mtproto-utils.c и закомментировать или удалить там строки 101 и 115:
    assert (0); // As long as nobody ever uses this code, assume it is broken.
    

    В противном случае велик риск получить ошибку вот такого вида
    tgl/mtproto-utils.c:101: BN2ull: Assertion 0' failed. SIGNAL received  
    

    при первой же попытке запуска telegram-cli.
    Ну и наконец можно выполнить make и выпить чашечку кофе, пока приложение будет собираться.
    Когда сборка будет завершена, нужно запустить приложение и ввести свой номер телефона, а также код подтверждения, который придет на него или в другой запущенный клиент telegram:
     /usr/src/tg/bin/telegram-cli -k /usr/src/tg/tg-server.pub  -W 
    

    а затем выйти командой
    quit
    С этого момента вы можете использовать консольный telegram! Кроме команды quit внимания заслуживает команда help, которая покажет все остальные команды. Нас же в первую очередь интересует отправка сообщений. Делается это так:
    msg Имя_Фамилия Некоторое сообщение
    

    Обратите внимание на то, что между именем и фамилией стоит _ а не пробел, а также на то, что имя всегда стоит перед фамилией.
    А вот так будет выглядеть вызов telegram-cli для отправки одного сообщения и завершения
     /usr/src/tg/bin/telegram-cli -k /usr/src/tg/tg-server.pub -U root -W -e "msg Иван_Иванов Привет, Иван!"
    

    Для удобства напишем простенький скрипт
    telegram.sh
    #!/bin/bash
    name=$1 #Имя_Фамилия
    text=$2 #Сообщение
    path=/usr/src/tg
    ${path}/bin/telegram-cli -k ${path}/tg-server.pub -U root -W -e "msg $name $text" 
    exit 0
    

    обязательно дадим ему права на исполнение
    chmod +x telegram.sh
    

    и попробуем запустить его из консоли. Обратите внимание на то, что сообщение скорее всего будет содержать пробелы, поэтому его нужно взять в кавычки:
    ./telegram.sh Иван_Иванов "Сообщение из консоли"
    

    Конечно, до того как подключать аккаунт к консольному telegram, все контакты пользователей желательно добавить из мобильного или десктопного приложения.
    Дело остается за малым: вызвать наш скрипт из диалплана. Делается это несложно:
    exten => 333,n,Set(name=Иван_Иванов)
    exten => 333,n,System(/home/asterisk/telegram.sh ${name} "Входящий звонок от ${CALLERID(num)}")
    

    Примерно вот так это будет выглядеть на телефоне
    image
    Вызывать скрипт имеет смысл еще до того, как формировать Dial: мобильник может быть занят, отключен, а человек может просто не услышать звонка, а информация о нем тут же придет в telegram.
    Безусловно, если списки мобильных телефонов для переадресации уже хранятся в базе данных, имена контактов telegram имеет смысл тоже хранить там.
    Итак, меньше чем за час мы получаем возможность отправки прямо из диалплана Asterisk номера звонящего на мобильный телефон сотрудника, и конечно же, мы можем передавать любую дополнительную информацию через этот шифрованный канал связи.
    Автор текста: специалист по Asterisk компании centos-admin.ru Алексей Дмитриев
    Southbridge
    182,00
    Обеспечиваем стабильную работу серверов
    Поделиться публикацией

    Комментарии 12

      0
      >> В противном случае велик риск получить ошибку вот такого вида tgl/mtproto-utils.c:101: BN2ull: Assertion 0' failed. SIGNAL received

      Насколько я понял — утилита падает в том случае, когда принимает информацию, формата которой не знает (например нескучные стикеры там, анимированные gif и прочая модная хрень). Что в нашем случае некритично.

      Одно время плотно занимался этим вариантом построения «бота». В отличие от классического бота можно писать тем абонентам, с которыми ещё не было общения. А также узнавать — подключен ли абонент к телеграму :)

      Но не смог решить проблему получения сообщения и складывания его в базу. Споткнулся на настройке lua-скриптов…
        0
        Утилита падает, если не закомментировать указанные строки, еще до того, как пользователь в первый раз введет свой номер телефона.
        Можно telegram-cli в режиме демона запустить и складывать все данные в базу.

          0
          А вот здесь поподробнее, пожалуйста:
          Как именно происходит складывание в базу? У Вас получилось подключиться из lua к СУБД?
            0
            Мы не углублялись в процесс получения сообщений — не было такой необходимости, но полагаю, можно решить задачу быстро и в лоб: запустить /usr/src/tg/bin/telegram-cli -k /usr/src/tg/tg-server.pub -W >> file в screen и просто забирать информацию из файла
        0
        Добавил в extensions.conf
        exten => 333,n,Set(name=Miha)
        exten => 333,n,System(/etc/asterisk/telegram.sh ${name} «Входящий звонок от ${CALLERID(num)}»)
        Но не работает. Поменял 333 на свой формат _XXXX, работает, но отправляет сообщение если сбрасывает звонок не тот кто звонил, а кому звонили.
          0
          Чтобы при всех звонках сообщение приходило, то нужно СНАЧАЛА дергать скрипт, а ПОТОМ вызывать Dial
          0
          exten => 333,n,Set(name=Иван_Иванов)
          exten => 333,n,System(/home/asterisk/telegram.sh ${name} «Входящий звонок от ${CALLERID(num)}»)

          не отрабатывает, а именно не вызывается *.sh, переменные передаются видно по логам. Asterisk 11.7.0
          сам скрипт от пользователя выполняется на ура, подскажите что не так?

          extensions.conf
          exten=>_7XXXXXXXXXX,1,Dial(SIP/${EXTEN}@multifon-out,30,r)
          exten=>_7XXXXXXXXXX,n,Set(name=Denis_A)
          exten=>_7XXXXXXXXXX,n,System(/etc/asterisk/tg.sh ${name} «Входящий звонок от ${CALLERID(num)}»)

            0
            Скорее всего, пользователь, от которого работает Астериск, не имеет прав на доступ к конфигу telegram-cli или к его исполнению. Посмотрите от кого запущен Астерис и запустите скрипт от него через sudo. Возможно, потребуется добавить выполнение скрипта через sudo и разрешить пользователю Астериск выполнять его в sudoers
              0
              Проверять надо именно sudo -u asterisk ./tg.sh, а не su asterisk && ./tg.sh
              Потому как конфиг лежит в /root/./telegram-cli и сколько ни давай на нее права 777, доступа все равно не будет на самом деле.
                0
                user@ubuntu:~$ sudo -u asterisk /etc/asterisk/tg.sh
                [sudo] password for user:
                Telegram-cli version 1.4.1, Copyright © 2013-2015 Vitaly Valtman
                Telegram-cli comes with ABSOLUTELY NO WARRANTY; for details type `show_license'.
                This is free software, and you are welcome to redistribute it
                under certain conditions; type `show_license' for details.
                Telegram-cli uses libtgl version 2.1.0
                Telegram-cli includes software developed by the OpenSSL Project
                for use in the OpenSSL Toolkit. (http://www.openssl.org/)
                I: config dir=[/home/user/.telegram-cli]
                phone number: +79178000000
                code ('CALL' for phone code):
                *** 1466413970.477063 incorrect code
                code ('CALL' for phone code): 46120
                User Denis online (was online [2016/06/20 14:17:55])
                > telegram-cli: loop.c:480: write_auth_file: Assertion `auth_file_fd >= 0' failed.
                SIGNAL received
                h/etc/telegram-cli/tg/bin/telegram-cli(print_backtrace+0x2c)[0x80a998c]
                /etc/telegram-cli/tg/bin/telegram-cli(termination_signal_handler+0x7d)[0x80a9a2d]
                [0xb7737404]
                [0xb7737428]
                /lib/i386-linux-gnu/libc.so.6(gsignal+0x47)[0xb72f8687]
                /lib/i386-linux-gnu/libc.so.6(abort+0x143)[0xb72fbab3]
                /lib/i386-linux-gnu/libc.so.6(+0x277c7)[0xb72f17c7]
                /lib/i386-linux-gnu/libc.so.6(+0x27877)[0xb72f1877]
                /etc/telegram-cli/tg/bin/telegram-cli(write_auth_file+0x147)[0x80ab417]
                /etc/telegram-cli/tg/bin/telegram-cli(on_login+0x17)[0x80ac5c7]
                /etc/telegram-cli/tg/bin/telegram-cli(tgl_export_auth_callback+0x62)[0x80e6072]
                /etc/telegram-cli/tg/bin/telegram-cli[0x80d3637]
                /etc/telegram-cli/tg/bin/telegram-cli(tglq_query_result+0x12f)[0x80db2bf]
                /etc/telegram-cli/tg/bin/telegram-cli[0x80d0ac6]
                /etc/telegram-cli/tg/bin/telegram-cli[0x80d20e2]
                /etc/telegram-cli/tg/bin/telegram-cli[0x80fceec]
                /usr/lib/i386-linux-gnu/libevent-2.0.so.5(event_base_loop+0x6f4)[0xb76f3234]
                /etc/telegram-cli/tg/bin/telegram-cli(net_loop+0xc2)[0x80ab1f2]
                /etc/telegram-cli/tg/bin/telegram-cli(loop+0x1d7)[0x80ac917]
                /etc/telegram-cli/tg/bin/telegram-cli(inner_main+0x17)[0x80a8eb7]
                /etc/telegram-cli/tg/bin/telegram-cli(main+0x365)[0x80a7f25]
                /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb72e3af3]
                /etc/telegram-cli/tg/bin/telegram-cli[0x80a8051]

                Переустановил /etc/telegram-cli/ Каких прав не хватает и где?
                  0
                  я сделал проще: папку telegram-cli скопировал в /var/lib/asterisk и дал права правильные
              0
              У меня FreePBX 13. Добавил строку вызова скрипта в диалплан существующего EXT/
              exten => 196,1,Set(__RINGTIMER=${IF($["${DB(AMPUSER/196/ringtimer)}" > «0»]?${DB(AMPUSER/196/ringtimer)}:${RINGTIMER_DEFAULT})})
              exten => 196,n,Set(name=nikolay_a)
              exten => 196,n,TrySystem(/home/asterisk/telegram.sh ${name} «Входящий звонок от ${CALLERID(num)}»)
              exten => 196,n,Macro(exten-vm,novm,196,0,0,0)
              exten => 196,n(dest),Set(__PICKUPMARK=)
              exten => 196,n,Goto(${IVR_CONTEXT},return,1)
              exten => 196,hint,SIP/196&Custom:DND196,CustomPresence:196

              Скрипт положил в домашний каталог asterisk, выдал все права
              [root@freepbx asterisk]# ls -l /home/asterisk/telegram.sh
              -rwxr-xr-x 1 asterisk asterisk 184 Oct 1 04:36 /home/asterisk/telegram.sh

              Сам скрипт отрабатывает 100%, в нем есть проверочная строка
              [root@freepbx asterisk]# cat /home/asterisk/telegram.sh
              #!/bin/bash
              name=$1
              text=$2
              /bin/echo 2 > /home/asterisk/test — файл создается и перезаписывается.
              /var/lib/asterisk/tg/bin/telegram-cli -k /var/lib/asterisk/tg/tg-server.pub -U asterisk -W -e «msg $name $text»
              exit 0

              Если запустить скрипт через sudo -u — сообщение в телеграмм приходит. при звонке сообщение не приходит…

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

              Самое читаемое