SIP <-> Telegram: sip.tg

tc6jsiam9awjksbpbgcitmdxii4.pngУверен, многие задавались вопросом: вот есть Телеграм, год назад он обзавёлся звонками, у него открытое 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-провайдерам с одного аккаунта Телеграм (ограничение искусственное, возможно позже будет скорректировано). Звонки для каждого провайдера работают в обе стороны: возможны как входящие, так и исходящие звонки. Редактирование аккаунта выглядит примерно так:

co544r09xikcsjgkugwokwl9kgi.png

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

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


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

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

Как звонить?


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

  • отправить номер телефона в виде сообщения;
  • приложить к сообщению контакт, содержащий номер телефона.


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

3wl4hbyq9dhstmhsuxnmzuxt5zo.png


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

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

Шлюзы


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

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


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

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

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


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

9uj5wdudnoonpv-w-qwnuz4c1pq.png


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

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


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

  • реальный номер телефона пользователя, привязанный к его аккаунту;
  • username пользователя;
  • *ID пользователя.


Здесь также отмечу следующие особенности:

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

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

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

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

Примечания:

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

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

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

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

В заключении оставлю ссылки на все ресурсы проекта:

  • 54crcjxxlgwsbd-ltjlh9hpwi-a.png siptg — аккаунт для звонков;
  • iwr7va3eiltfb88f0ingm6ashk0.png siptg_bot — бот для настройки;
  • ijcvxsljmtcltwbz2sz7dmibpta.png siptg_news — новостной канал;
  • pyil1sh3ep35tnyoulvugmt5z3k.png siptg_public — открытая группа пользователей sip.tg;
  • 7vbuxtik7s1ezi9edbswtlqlrdm.png siptg_support — техническая поддержка.

© Habrahabr.ru