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 Алексей Дмитриев
Поделиться с друзьями
-->

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


  1. mihmig
    17.06.2016 13:33

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

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

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

    Но не смог решить проблему получения сообщения и складывания его в базу. Споткнулся на настройке lua-скриптов…


    1. akhaustov
      17.06.2016 14:12

      Утилита падает, если не закомментировать указанные строки, еще до того, как пользователь в первый раз введет свой номер телефона.
      Можно telegram-cli в режиме демона запустить и складывать все данные в базу.


      1. mihmig
        17.06.2016 14:33

        А вот здесь поподробнее, пожалуйста:
        Как именно происходит складывание в базу? У Вас получилось подключиться из lua к СУБД?


        1. akhaustov
          17.06.2016 18:51

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


  1. kisel195
    20.06.2016 07:16

    Добавил в extensions.conf
    exten => 333,n,Set(name=Miha)
    exten => 333,n,System(/etc/asterisk/telegram.sh ${name} «Входящий звонок от ${CALLERID(num)}»)
    Но не работает. Поменял 333 на свой формат _XXXX, работает, но отправляет сообщение если сбрасывает звонок не тот кто звонил, а кому звонили.


    1. akhaustov
      20.06.2016 08:22

      Чтобы при всех звонках сообщение приходило, то нужно СНАЧАЛА дергать скрипт, а ПОТОМ вызывать Dial


  1. sundee
    20.06.2016 07:16

    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)}»)


    1. akhaustov
      20.06.2016 08:19

      Скорее всего, пользователь, от которого работает Астериск, не имеет прав на доступ к конфигу telegram-cli или к его исполнению. Посмотрите от кого запущен Астерис и запустите скрипт от него через sudo. Возможно, потребуется добавить выполнение скрипта через sudo и разрешить пользователю Астериск выполнять его в sudoers


      1. akhaustov
        20.06.2016 08:27

        Проверять надо именно sudo -u asterisk ./tg.sh, а не su asterisk && ./tg.sh
        Потому как конфиг лежит в /root/./telegram-cli и сколько ни давай на нее права 777, доступа все равно не будет на самом деле.


        1. sundee
          20.06.2016 12:21

          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/ Каких прав не хватает и где?