Собственный «Кто звонил?» на базе Мультифона
Самый простой путь, конечно же, купить человеческий HTTP API у какого-нибудь гейта и задёшево отправлять через него. Но во-первых, это неспротивно. А во-вторых, у меня на тарифе несколько сотен СМС включено в абонплату, и с телефона я их почти не отправляю.
Перепробовав все возможные варианты с MessageSend (и через диалплан, и через АМИ, и через чёрта лысого), а также помурыжив SipSak, я сдался и попробовал скрипт для Yate.
О чудо! СМС через Мультифон отправляются.
Но Yate – слишком тяжеловесный движок, подумал я. Yate должен крутиться демоном и требует совершенно избыточной для этих задач конфигурации, подумал я. Поэтому, изучив перловый скрипт, я вычленил из него главное и вернулся к сипсаку. Главным оказался набор нестандартных заголовков (включая обязательного совершенно определённого юзер-агента, ага):
User-Agent: MCPC-MG-1-0-34-3490/2.0.0.5301 X-Movial-Content: sms/text X-Movial-DeliveryReport: true Content-Type: text/plain; charset=ISO-10646-UCS-2
Кстати, кастомный юзер-агент, насколько я понимаю, изначально полностью исключал возможность отправки через Астериск.
На первый взгляд, всё казалось просто. Но сообщения всё равно не уходили. Включив дебаг у сипсака, я понял, что эта скотина имеет набор предопределённых заголовков, которые тупо дублируются, если заданы в командной строке. Пришлось брать в руки напильник.
Обработав сипсак так, чтобы кастомные заголовки он считал приоритетными, а дубли отбрасывал, я добился наконец первого результата. Но моя радость была бы неполной, если бы сипсак корректно кодировал передаваемое сообщение. Расписывать всю эпопею вкостыливания в код, построенный на нуль-терминированных строках, UCS2-BE я не буду, сразу представлю на ваш суд результаты своих трудов: https://github.com/wolandtel/sipsak. Сам процесс отправки СМС я обернул в удобный скрипт. Для комплекта в последнем репозитории есть скрипт settings.sh, который упрощает настройку пароля и маршрутизации (SIP, GSM+SIP, GSM) на мультифоне.
Ну, вот, отправлять СМС мы умеем. Теперь можно настроить сам…
Автоответчик
Здесь нам поможет AGI. Скажу сразу, что от природной лени протокол AGI реализовывать я не стал, а лишь сделал в скрипте такую эмуляцию, которая позволяет выполнить задачу. А именно, скрипт должен дождаться от астериска ответа на команду STREAM FILE, чтобы проигрывание не закончилось раньше времени.
Диалплан
; autoresponder exten => 79xxxxxxxxx,1,NoOp same => n,AGI(notify.agi) same => n,Set(MSG="Абонент умер. Когда воскреснет, может перезвонить. Но хотите ли Вы этого?") same => n,Answer ; Params: speaker, emotion, robot ; speaker: [мужские]: zahar, ermil; [женские]: jane, omazh. ; emotion: good, neutral, evil, mixed. ; robot: true, false. same => n,AGI(tts.agi,$,ermil,neutral,true) same => n,Hangup
Можно было, конечно, отправлять СМС из того же скрипта, которым проигрывается сообщение, но с точки зрения структуры приложения логично было их разнести.
notify.agi
#!/bin/bash while read line; do [ -z "$line" ] && break num=$(echo $line | grep 'agi_callerid: ' | sed 's/agi_callerid: //') [ -n "$num" ] && break done < /dev/stdin [ -z "$num" ] && exit 1 /usr/local/multifon/sms.sh 79xxxxxxxxx "Пропущенный вызов [$(date '+%Y-%m-%d %H:%M:%S')] с номера +$num"
Абсолютно никакого AGI, по факту. Просто делаем, что требуется, и закругляемся.
tts.agi
#!/bin/bash text="$1" speaker="$2" emotion="$3" robot="$4" key= dir=/var/lib/asterisk/tts url=https://tts.voicetech.yandex.net/generate dbg=$ fname="$dir/$(echo -n "$text-$speaker-$emotion-$robot" | md5sum | cut -d' ' -f1)" wav="$.wav" echo -e "$@" > "$dbg" while read line; do echo $line >> "$dbg" [ -z "$line" ] && break done < /dev/stdin [ -f "$wav" ] || /usr/bin/curl -s --data-urlencode "text=$text" \ --data-urlencode format=wav \ --data-urlencode lang=ru-RU \ --data-urlencode "speaker=$speaker" \ --data-urlencode "key=$key" \ --data-urlencode "emotion=$emotion" \ --data-urlencode "robot=$robot" \ "$url" >"$wav" || exit 1 for f in al ul gsm; do [ -f "$.$f" ] || /usr/bin/sox "$wav" -r8k "$.$f" || exit 2 done echo -e "STREAM FILE $fname 0" read line < /dev/stdin echo $line >> "$dbg"
Здесь тоже нет AGI. Мы только дожидаемся ответа от Астериска командой read, чтобы не закрыться раньше, чем он проиграет сообщение. Прошу обратить внимание на параметр -r8k для сокса. Почему-то без параметров он неправильно выставляет рейт выходному файлу, и сообщение получается замедленным в два раза. Подробности самого Яндекс SpeechKit API и то, как получить ключ, есть в документации.
Основная часть на этом закончена. Но статья будет неполной без описания нюансов.
Подготовка сим-карты
Очевидно, чтобы всё это завелось, потребуется отдельный номер с Мультифоном. Вы покупаете сим-карту и…? Простой и очевидный путь – вставить её в телефон, набрать необходимые запросы и начать использовать. Но мы не ищем лёгких путей. У меня с давних времён валяется пачка 3G-модемов (знаменитый E1550 и чуть менее знаменитые E150), но нет ни одного свободного телефона. А использовать свой для таких операций я не люблю: лишний раз выключать, вскрывать.
Итак, для получения и отправки СМС мы будем использовать давно и хорошо всем известный smstools. Настройку я описывать не буду, ибо боян. Только автодекодинг не включайте. А то будет вам мусор вместо тела сообщения.
Итак, после приобретения сим-карты нужно сделать две вещи:
- получить пароль для личного кабинета (ибо эти бабуины убили Сервис-гид, и теперь для каждого номера требуется собственный логин);
- подключить Мультифон (ибо эти бабуины сломали веб-интерфейс, и без USSD не обойтись).
На этом можно было бы и завершить, но так как мы имеем дело с бабуинами, стоит упомянуть про…
Организационные моменты
- Обязательно укажите, чтобы новую сим-карту подключили на существующий лицевой счёт. Насколько я понял, отключение по неактивности не работает, если на все номера один баланс. Да и вообще удобнее. Когда был жив сервис-гид с возможностью управлять всеми номерами из-под одной учётной записи, этот совет был ещё актуальнее.
- В современном мире наебизнеса уже никому не надо объяснять, что сразу после покупки сим-карты необходимо отключать все условно-бесплатные опции (в том числе, «Кто звонил?», ага). Но! Бабуины пошли дальше и некоторые из условно-бесплатных опций не отображаются в личном кабинете. Отключить их можно только звонком в контакт-центр. Желательно подробно прочитать описание тарифа, чтобы выяснить, каких же замечательных вещей вам впарили продали.
- В качестве номера для отправки СМС я использую свой основной номер, потому что на нём есть предоплаченный пакет. Естественно, для этого Мультифон на нём тоже должен быть включен (но совершенно не обязательно держать его постоянно зарегистрированным). Дополнительный номер используется только для приёма звонков.
PS
К сожалению, Мультифон не передаёт номер, переадресовавший звонок. Поэтому, если вы хотите подключить свой бонусный «Кто звонил?» друзьям/родным, придётся на каждого человека покупать отдельный номер под автоответчик. Ещё можно попробовать переадресацию с доп. набором (+79XXXXXXXXXpXX), но я не проверял. Если проверите, пишите.
А вот теперь – всё!
- Яндекс API
- Asterisk
- Разработка систем связи
«МультиФон» — VoIP-звонилка для абонентов «МегаФона»
Не все знают, что у «МегаФона» существует свой «ответ Скайпу» — VoIP-проект «Мультифон». Между тем, это весьма интересный продукт, выпущенный ещё в 2008 году, а сейчас развиваемый инновационным подразделением MegaLabs. Это первый операторский VoIP-сервис в мире. Но на этом его особенности не заканчиваются.
Отличие от того же Skype или Viber заключается в том, что «МультиФон» работает в невозможной для сторонних VoIP-сервисов связке с собственно мобильными сервисами оператора. Скажем, при входящем вызове, если на смартфоне, планшете или компьютере запущено приложение «МультиФон», пользователь может выбрать: ответить через него или через стандартную звонилку. Это оказывается особенно полезным в ситуациях, когда мобильная сеть недоступна, а интернет есть. Например, в кафе, которые часто находятся в подвальных помещениях — сеть там обычно не ловит, а Wi-Fi есть. В этой ситуации абонент «МегаФона» с «МультиФоном» остаётся на связи — причём звонящий даже не заметит, что у вас нет сигнала.
При звонке на номера «МультиФон» (79*********@multifon.ru) соединение, как и положено VoIP-сервисам, бесплатное. При звонках на номера МегаФон всей России исходящий будет стоить 80 копеек в минуту, на номера других операторов России — 1,5 рубля. Это второй резон пользоваться «МультиФоном», например, дома вместо стационарного телефона — звонки с него даже на обычные телефоны выходят значительно дешевле тарифов классической мобильной связи. Средства за звонки списываются с баланса телефона.
МегаФон был одним из пионеров в этом направлении — только сейчас свои VoIP сервисы стали появляться у China Mobile и Deutsche Telekom. Сегодня «МультиФоном» пользуются более миллиона абонентов — это самая популярная разработка MegaLabs на данный момент.
Как это работает
Экосистема «Мультифон» состоит из мобильных приложений для iOS и Android, десктопной версии на Windows, MacOS и Linux, а так же веб-клиента.
По функционалу они немного отличаются: все версии поддерживают голосовые и видеозвонки, но отправка сообщений возможна пока только с десктопного приложения.
Регистрация в системе происходит одним из следующих способов:
- Набрав *137# на телефоне и следуя дальнейшим инструкциям USSD-меню. В данном случае пароль сгенерируется автоматически и придет в SMS от номера 1117.
- Из приложения для компьютера и веб-версии, заполнив форму регистрации. В данном случае пароль для входа можно задать самостоятельно, но SIM-карта также должна быть в телефоне – в процессе регистрации придет SMS с проверочным кодом.
Восстановление пароля в приложении сделано так же — через редирект на веб-страницу мультифона, где нужно ввести номер телефона.
Настройки входящих можно задавать в самом приложении. Отдельно для настроек приёма выпущены специальный виджет для Android и приложение для iOS – МультиФон Редирект. При установке виджета надо вводить пароль заново, но после этого режимы Только GSM, Только SIP, SIP+GSM переключаются одним тапом прямо с рабочего стола — это как раз очень удобно:
При входящем вызове звонок отображается на всех устройствах, где запущено приложение «МультиФон» сразу. На десктопной версии это просто всплывающее уведомление:
На смартфоне же это полноценное окно вызова:
При ответе на звонок с любого устройства, остальные звонки автоматически сбрасываются. Поэтому варианты подслушивания по «параллельному телефону» невозможны.
Впрочем, теоретически можно не ограничиваться приложениями «МегаЛабса» — «МультиФон» работает по стандартному протоколу SIP (любопытным мне показался комментарий разработчиков о том, что он изначально строился на открытом протоколе, т.к. в телекоме не любят нестандартные протоколы), поэтому есть возможность создавать приложения для него самостоятельно. И, что более актуально, подключать к «МультиФону» любые устройства, поддерживающие SIP-телефонию — от SIP-телефонов и SIP-клиентов на ПК и смартфонах до IP-PBX, например, Asterisk.
- Блог компании МегаФон
- Разработка систем связи
При подготовке материала использовались источники:
https://habr.com/ru/articles/278679/
https://habr.com/ru/companies/megafon/articles/193392/