- PVSM.RU - https://www.pvsm.ru -

Астериск: маршрутизация по номеру звонящего и коду региона

Информация далее, возможно, будет интересна тем, кто использует астериск, получает на него номер 8-800 и имеет абонентов в офисах, которые расположены в нескольких городах РФ.

Мое решение классической задачи астерискера-телефониста: бизнес хочет, чтобы на звонки Дальнего Востока отвечал офис во Владивостоке, звонки Урала и Сибири — офис в Новосибирске, а на все остальные — офис в Москве.

Можно воспользоваться вариантом, представленным ранее на Хабре в статье [1], но я решил сделать решение немного более универсальным. Далее детали реализации и видео-инструкция.

Решение такое: вынести работу с определением региона по номеру телефона за рамки диалплана астериска. Т.е. мы реализуем логику определения кода региона по номеру звонящего на стороне AGI-сервера. Астериск не имеет понятия каким образом работает AGI-сервер, где он берет данные, на каком языке он написан, но получает в результате запроса код региона, и уже далее продолжает обрабатывать звонок по диалплану.

Схема работы

Астериск: маршрутизация по номеру звонящего и коду региона - 1

Как реализован AGI-сервер?

AGI-сервер — в нашем случае, это nodejs-приложение, которое, получив запрос с номером, обращается в MongoDB, находит соответствие и устанавливает необходимое значение переменной диалплана REGION_CODE.

Какой получается диалплан?

Диалплан использования AGI-сервера получается примерно такой:

[incoming]
exten => 88001234567,1,AGI(agi://localhost:3000,${CALLERID(num)})
exten => 88001234567,n,GotoIf($[${REGION_CODE}=24]?outbound,krasnoyarsk,1:)
exten => 88001234567,n,GotoIf($[${REGION_CODE}=50]?outbound,moscow,1:outbound,other,1)

Для каждого региона необходимо указывать свою проверку?

Если у вас есть офисы в каждом регионе РФ (а их у нас 85), то, вероятно, стоит настроить проверку каждого кода. Но обычно требуется менее детальное деление РФ, поэтому также устанавливается переменная COUNTY_CODE — номер федерального округа (а их у нас всего 9).

Т.е. диалплан может выглядеть следующим образом:

[incoming]
exten => 88001234567,1,AGI(agi://localhost:3000,${CALLERID(num)})
exten => 88001234567,n,GotoIf($[${COUNTY_CODE}=5]?outbound,krasnoyarsk,1:)
exten => 88001234567,n,GotoIf($[${COUNTY_CODE}=1]?outbound,moscow,1:outbound,other,1)

Или, конечно, в комбинированном режиме. Логику построения диалплана на основе установленных переменных COUNTY_CODE и REGION_CODE каждый может определить сам.

Как это можно реализовать в пользовательском интерфейсе?

Например, у меня в пользовательском интерфейсе настройка маршрутизации по номеру звонящего выглядит так

Астериск: маршрутизация по номеру звонящего и коду региона - 2

Данные с кодами и названиями можно взять в npm russian-codes [2] и использовать в выпадающих меню.

А откуда данные в MongoDB для AGI-сервера?

Данные, обычно, расположены на сайте Федерального агентства связи в разделе "Открытые данные [3]". Как мы скачиваем и преобразуем в JSON я уже писал на Хабре [4]. Но в текущем формате данных numcap регион указан строкой с названием региона, а не его кодом, что не очень удобно.

Поэтому, используя npm numcap-regions [5] (который в свою очередь использует npm'ы numcap [6] и russian-codes [2]) мы можем получить большой JSON-файл с емкостью операторов РФ с указанием кодов регионов.

А нужно ли обновлять базу с данными по кодам регионов?

Можно загрузить один раз и так и использовать. Но утилиты в указанных npm можно использовать для регулярного обновления данных.

Федеральное агентство связи регулярно вносит изменения в реестр нумерации, поэтому несложно всегда иметь достаточно актуальную базу данных. Хотя, конечно, номера телефонов вряд ли резко сменят регион (а по операторам необходимо провести дополнительную обработку данных). Данные в numcap я обновляю примерно раз в месяц.

Итак, что мне сделать, чтобы у меня заработала маршрутизация по номеру и коду региона?

1. Установить agi-number-archer-app (Установка подробно описана в репозитории agi-number-archer-app [7], его можно клонировать, записать свои конфиги, скрипты деплоя).

2. Загрузить данные в MongoDB (для загрузки данных воспользуйтесь numcap-regions [5], использование также описано в репозитории).

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

Вопросы, пожелания, критические замечания приветствуются.

P.S. Видео с пошаговой настройкой сервиса.

Автор: antirek

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/85486

Ссылки в тексте:

[1] статье: http://habrahabr.ru/post/244131/

[2] russian-codes: https://github.com/antirek/russian-codes

[3] Открытые данные: http://www.rossvyaz.ru/opendata/

[4] писал на Хабре: http://habrahabr.ru/post/246981/

[5] numcap-regions: https://github.com/antirek/numcap-regions

[6] numcap: https://github.com/antirek/numcap

[7] agi-number-archer-app: https://github.com/antirek/agi-number-archer-app

[8] Источник: http://habrahabr.ru/post/252733/