Уверен, многие задавались вопросом: вот есть Телеграм, год назад он обзавёлся звонками, у него открытое API, но почему-то до сих пор никто не сделал связку с протоколом SIP. Ведь это даёт неограниченные возможности: от замены SIP-звонилок до организации ещё одного канала коммуникации с пользователями Вашего бизнеса. Сегодня я расскажу историю появления первого такого шлюза, который теперь доступен абсолютно всем!

Когда-то давно я попал на ресурс Talk37 (ныне это ruVoIP.net) и мне он очень понравился. Несмотря на то, что в последнее время он приобрёл дурную славу благодаря стараниям любителей даркнета, активное сообщество проекта — это всё-таки люди, которые болеют за него душой. Я отдельно благодарю его создателя Дмитрия Серова за отзывчивость и упорный труд.

ruVoIP.net — это бесплатная виртуальная АТС, причём её функционалу позавидовала бы почти любая коммерческая АТС. Каждый зарегистрированный в ней пользователь получает при регистрации свой внутренний номер, на который можно дозвониться множеством способов. И вот, 24 сентября 2017 года, первый прототип шлюза увидел свет: теперь стало возможно дозвониться до пользователей ruVoIP.net через Телеграм! Вернее… что значит возможно? Мы создали отдельного пользователя Телеграм, который научился принимать звонки и приветствовать звонящих с просьбой ввести внутренний номер. Но куда ввести? Как ввести? Вообщем, что-то заработало и вызвало у всех активных участников огромную радость сродни запуску ракеты в космос. И не важно, что оно часто падало, не было никакого DTMF, а звук напоминал старый КВ-приёмник.

Время шло, шлюз улучшался, а ruVoIP.net вышел в ТОП поисковых систем по запросу «sip телеграм». Мне начали поступать запросы от разных людей, которые хотят сделать такой же шлюз; были в том числе и коммерческие предложения. К сожалению, архитектура прототипа не позволяла его расширение и была слишком сложна для использования конечными пользователями, поэтому я был вынужден всем отказывать с обещаниями что-то сделать. Я очень хотел что-то отрелизить к новому году, но мне это оказалось не под силу.

К 12 февраля 2018 года новая версия шлюза, наконец, достигла уровня, когда её уже стало можно пощупать — началось закрытое бета-тестирование. Проект подобного масштаба я делаю впервые, поэтому не всё получилось организованно, но свою пользу принесло: в конечном счёте удалось исправить ещё около пары десятков багов на тех юзкейсах, о которых я даже не думал.

Что получилось


Я не могу утверждать, что удалось исправить абсолютно все баги. В процессе работы я активно общался с желающими сделать такой же шлюз и у меня выстраивалась картина того что нужно пользователям. С другой же стороны, каждая функция очень сильно зависит от возможностей самого Телеграм. Далеко не всё удалось сделать удобно (а что-то не удалось сделать вовсе) из-за ограничений платформы.

В результате получилось два основных режима: Операторы и Шлюзы. Настройки обоих режимов производятся через бота @siptg_bot.

Операторы


Это режим замены SIP Softphone мессенджером Телеграм. Если у Вас уже есть аккаунт у какого-то SIP-провайдера, но Вы не хотите устанавливать (на телефон) очередной Softphone, который занимает память, расходует батарею, требует тонкой настройки кодеков и плохо подстраивается под качество канала передачи данных, то этот режим для Вас. Разрешается создавать до 20 независимых подключений к SIP-провайдерам с одного аккаунта Телеграм (ограничение искусственное, возможно позже будет скорректировано). Звонки для каждого провайдера работают в обе стороны: возможны как входящие, так и исходящие звонки. Редактирование аккаунта выглядит примерно так:


Кнопки содержат либо текущее значение опции, либо её название, если значение не задано (исключение составляет Пароль). На каждой странице настроек есть справка, которая вызывается по нажатию кнопки Помощь.

Как принимать звонки?


Поскольку боты в Телеграм не умеют звонить, у сервиса имеется отдельный аккаунт @siptg, который выполняет эту функцию. При входящем звонке номер и имя звонящего абонента берутся из SIP-заголовков и приходят в виде отдельного сообщения; вместе с сообщением также приходит DTMF-клавиатура:


Примечание: я понимаю, что текущая реализация выглядит странно и не удобно, но это вынужденная мера: API Телеграм не позволяет определять имя абонента используя локальную адресную книгу; по той же причине не представляется возможным поместить информацию о номере звонящего на экран звонка.

Как звонить?


Здесь мы снова сталкиваемся с ограничениями Телеграм: нельзя набрать произвольный номер телефона, можно только позвонить другому пользователю. Поэтому для звонка на произвольный номер предусмотрено два способа:
  • отправить номер телефона в виде сообщения;
  • приложить к сообщению контакт, содержащий номер телефона.

Для удобства, оба способа можно применять как к боту (@siptg_bot), так и к аккаунту для звонков (@siptg). Если настроено несколько аккаунтов операторов, то появится запрос о выборе оператора для звонка:

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

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

Шлюзы


Наиболее интересным режимом работы является режим Шлюзы. Этот режим позволяет использовать аккаунт Телеграм через SIP: принимать звонки и звонить со своего аккаунта Телеграм другим пользователям. Например, Вы можете создать для своего бизнеса специальный аккаунт Телеграм, сообщить его своим клиентам в качестве контактного и принимать звонки, интегрируя их в общую очередь виртуальной АТС. А поскольку звонки возможны в обе стороны, у Ваших операторов также будет возможность перезвонить клиенту при необходимости; при этом клиент увидит звонок от имени Вашей компании.

Для чего нужна отдельная сессия Телеграм?


Мессенджер Телеграм разрешает использование одного аккаунта с разных утройств, при этом на каждом устройстве создаётся отдельная сессия. Поскольку при использовании sip.tg в режиме шлюза интеграция с SIP выполняется от имени Вашего аккаунта, необходимо создать новую сессию Телеграм. Создание сессии доступно через настройки бота: в разделе Шлюзы нужно нажать кнопку Войти и следовать инструкциям.

Примечание. API Телеграм не позволяет получить ограниченный доступ к Вашему аккаунту, в связи с чем, создавая новую сессию, Вы даёте своё согласие на передачу полных прав над своим аккаунтом Телеграм сервису sip.tg. Администрация сервиса прилагает все усилия, чтобы ограничить использование Вашего аккаунта Телеграм третьими лицами, не передаёт информацию о Вашей сессии Телеграм третьим лицам и не использует Ваш аккаунт Телеграм для целей, отличных от заявленных, однако не несёт ответственности за возможный ущерб, который может возникнуть в результате хищения данной информации третьими лицами путём взлома, либо физического доступа к оборудованию сервиса.

Как подключить Телеграм к виртуальной АТС?


После создания сессии, можно настроить подключение своего аккаунта Телеграм к виртуальной АТС. Для этого нужно создать новое SIP-подключение в разделе Шлюзы настроек бота:

Имеется два способа подключения: входящее (кнопка Новый вх.: Вы настраиваете виртуальную АТС для подключения к серверам sip.tg) и исходящее (кнопка Новый исх.: сервера sip.tg подключаются к виртуальной АТС). Можно создать несколько как входящих, так и исходящих подключений и использовать их независимо на разных устройствах (при этом, общее число подключений не должно превышать 20). Флажки DTMF вх. и DTMF исх. позволяют управлять отображением клавиатуры донабора внутреннего номера и отображением номера звонящего абонента при входящем звонке.

Как звонить и принимать звонки?


Вне зависимости от выбранного способа подключения к виртуальной АТС, входящие и исходящие звонки производятся одинаково: при входящем звонке виртуальной АТС передаётся номер и имя звонящего пользователя Телеграм, а для исходящего звонка достаточно набрать номер пользователя Телеграм. В качестве номера пользователя Телеграм можно использовать одно из следующих значений:
  • реальный номер телефона пользователя, привязанный к его аккаунту;
  • username пользователя;
  • *ID пользователя.

Здесь также отмечу следующие особенности:
  1. При входящем звонке, если о пользователе известна только часть данных, в качестве номера указываются первое из доступных значений: номер телефона, username или ID. Т.е., если номер телефона пользователя не известен, но пользователь указал username, то в качестве номера будет возвращён username. Если у пользователя не известен ни номер телефона, ни установлено username, то в качестве номера будет указан *ID.
  2. Звонить пользователю по его ID можно только в том случае, если ранее было прямое или косвенное с ним взаимодействие: обмен сообщениями, предыдущие звонки и т.п.


Кое-что ещё


Аккаунт для звонков @siptg зарегистрирован на реальный номер телефона. Почему бы его не использовать для чего-нибудь ещё? Первое что приходит в голову — это организовать шлюз доступа в Телеграм из ТфОП. Да, я над этим уже думал, но пока его делать не стал. А сделал следующее.

Бывает, уезжая в роуминг, требуется оставаться на связи. Поскольку принимать звонки на российскую сим-карту очень дорого, я подумал, что неплохо было бы сделать приём входящих звонков в Телеграм! Всё что потребуется — это настроить переадресацию на российском номере и купить местную сим-карту для доступа в Интернет.

Для переадресации входящих звонков в Телеграм нужно выполнить USSD-запрос **21*+79581006789# перед поездкой. После поездки выполните команду ##21# для отключения переадресации.

Примечания:
  1. Стоимость услуги переадресации оплачивается согласно Вашему тарифному плану как звонок на мобильный номер города Москвы.
  2. Номер телефона, на который зарегистрирован аккаунт Телеграм, должен совпадать с номером телефона, на котором устанавливается переадресация.
  3. Корректная работа данной функции зависит от Вашего оператора связи. В частности, работа с нероссийскими операторами связи не гарантируется.


Что будет дальше?


Говоря откровенно, неопределённость в отношении Телеграм в России как была, так и остаётся. Кроме того, судьба проекта целиком зависит и от команды Телеграм. Я не знаю какой будет реакция команды, поскольку, имея неудачный опыт обращения в техническую поддержку ранее, я не стал обращаться вновь. В случае одобрения можно будет существенно улучшить текущую реализацию и я вижу от этого абсолютную пользу для всех: проект открывает новые возможности Телеграм как платформы, что, в конечном счёте, должно привлечь и новую аудиторию.

Также у меня есть чёткое понимание того, что нужно делать дальше, я хорошо знаю узкие места, которыми нужно будет заняться. Я также понимаю, что в результате хабраэффекта всё может сломаться, поскольку я не выделил на старте больших мощностей, но надеюсь, что заложенная возможность масштабирования позволит сократить время восстановления. Тем не менее, если всё будет действительно плохо — заходите дня через 2-3 :).

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

В заключении оставлю ссылки на все ресурсы проекта:
  • siptg — аккаунт для звонков;
  • siptg_bot — бот для настройки;
  • siptg_news — новостной канал;
  • siptg_public — открытая группа пользователей sip.tg;
  • siptg_support — техническая поддержка.

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


  1. nikvel
    16.03.2018 21:07

    Да, хорошая задумка! Тоже недавно думал над союзом SIP и telegram, но только для сборка статистики звонков. Т.е. чтобы в чат приходила информация о дате звонка, номера, длительности. У Вас же планы гораздо глобальнее, непременно буду следить за проектом.


  1. JC_IIB
    17.03.2018 00:28

    Что под капотом? FreeSWITCH, Kamailio, или (не дай бог!) Asterisk?


    1. avegorov Автор
      17.03.2018 01:21

      Да, это ни в коем случае не Asterisk. О том что именно — я хотел рассказать позже. Пока что могу сказать, что все realtime части написаны на C++, а логика — на Python 3.


  1. ish
    17.03.2018 03:54

    А видео поддерживается?


    1. Infactum
      17.03.2018 09:31
      +1

      На текущий момент в телеграме нет поддержки видео звонков.


      1. ish
        17.03.2018 10:11

        ой )


    1. gbg
      17.03.2018 10:15

      Если только скриншотами в чат… Кстати, это идея!


  1. RusXP
    17.03.2018 05:30
    +1

    а проект коммерческий, исходный код можно посмотреть?


    1. antirek
      17.03.2018 17:26
      +1

      Тут есть кампания на Индигого по сбору денег на опенсорс версию шлюза в телеграм. Это не имеет отношения к шлюзу автора поста, но тем не менее может быть интересно вам

      www.indiegogo.com/projects/telegram-to-sip-voice-gateway--2# мопед не мой ))

      к примеру, зачем кому-то передавать свой аккаунт в тг, если можно будет поставить свой шлюз?


  1. zhenyat
    17.03.2018 11:26
    +2

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

    Никого не пугает?


    1. JC_IIB
      17.03.2018 12:33
      +1

      Вы даёте своё согласие на передачу полных прав над своим аккаунтом Телеграм сервису sip.tg.


      О как! Не, такое сразу лесом.


    1. avegorov Автор
      17.03.2018 12:43

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


  1. ozyab
    17.03.2018 12:43
    +1

    От всей души спасибо автору топика за столь нужный функционал. Теперь не надо использовать свою АТС. А сервера, если не секрет, где находятся? Как у них с задержкой?
    PS Пошел тестить))


    1. avegorov Автор
      17.03.2018 12:45

      Основные сервера пока только в Германии. Но локация, скорее всего, будет расширяться.


  1. ozyab
    17.03.2018 12:48

    Для переадресации входящих звонков в Телеграм нужно выполнить USSD-запрос **21*+79581006789# перед поездкой. После поездки выполните команду ##21# для отключения переадресации.

    А еще можно использовать для входящих в метро в телегу (привет, Теле2!). Переадрессация по условию «недоступен»: **62*+79581006789#


  1. 120minutes
    18.03.2018 23:55

    Правильно ли я понял, что для полноценной работы в режиме альтернативного SIP клиента необходимо передать хозяевам сервиса не только полный доступ к личному аккаунту Telegram, но также логин/пароль для подключения к SIP провайдеру со всеми вытекающими?


    1. avegorov Автор
      18.03.2018 23:55

      Неправильно. Доступ к Вашему аккаунту Телеграм требуется только в режиме Шлюзы, целевой аудиторией которого является бизнес, кому важно быть на связи со своими клиентами в т.ч. через Телеграм. Для использования Телеграм в режиме альтернативного SIP клиента необходимы только данные для подключения к Вашему SIP провайдеру (используя режим Операторы).


      1. 120minutes
        19.03.2018 01:39
        -1

        При первом субъективном взгляде у сервиса в настоящий момент нежизнеспособный сценарий применения — в особенности, если это для бизнеса. Доступ к своему аккаунту Telegram адекватный человек третьему лицу никогда не даст. Мотивировать использовать отдельный аккаунт — тоже не вариант, т.к. надежнее держать тогда отдельный SIP клиент. Кроме того, еще и вы, как промежуточное звено, все разговоры прослушивать и записывать сможете. Ну а раскрывать данные подключения к своему провайдеру связи — вообще верх опрометчивости, кто будет отвечать за неожиданную утечку средств с баланса, когда такое случится.


        1. avegorov Автор
          19.03.2018 02:05

          отдельный аккаунт — тоже не вариант, т.к. надежнее держать тогда отдельный SIP клиент

          По-моему Вы запутались и не слишком утрудили себя разобраться в особенностях работы каждого из режимов, даже несмотря на мои разъяснения.

          Кроме того, еще и вы, как промежуточное звено, все разговоры прослушивать и записывать сможете.

          Техническая возможность есть. Но это не в моих интересах, о чём честно заявлено в Соглашении об использовании.

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

          Вы когда-нибудь пользовались услугами Виртуальных АТС? Слышали что-нибудь, например, про pbxes.org? А про реализацию Push-режима в Groundwire читали?

          Как бы то ни было, я не настаиваю на использовании Вами сервиса sip.tg. Если Вам ближе свой Asterisk у себя в комнате, запертый в сейфе, с выделенной линией e1 — это Ваш выбор. Везде действует закон: безопасность обратно пропорциональна удобству.


          1. 120minutes
            19.03.2018 02:41

            По поводу отдельного SIP клиента — верно, моя неточность, в режиме шлюза это не поможет.

            Отдельными облачными виртуальными АТС не пользовался и не планирую, хотя прекрасно знаю предмет.
            Использую и Groundwire, и CloudSoftphone (тот же Acrobits, что и Groundwire), но только со своими Push серверами SIPIS — читали о таком?

            Вы не обижайтесь, пожалуйста. А то, смотрю, в сердцах минусовать меня стали. У меня есть профессиональная субъективная точка зрения об организации безопасности голосовых сервисов — я же помочь вам хотел, потому акцентировал внимание на критичных проблемных деталях. Хотите — учитывайте, не хотите — не надо.


            1. JC_IIB
              19.03.2018 10:54

              У меня есть профессиональная субъективная точка зрения об организации безопасности голосовых сервисов


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


  1. avegorov Автор
    19.03.2018 02:04

    (удалено)