Направляйте входящие вызовы по нужному направлению.
Скрипт “Маршрутизация вызовов на основе DID” перехватывает входящие вызовы и проверяет набранный номер по списку в файле. Это означает, что правила для входящих DID легко настраивать – просто обновляйте файл. Когда номер совпадает с номером из списка, вызов перенаправляется в указанное место назначения. Если настройки транка слишком строгие, а совпадения при этом нет, вызов просто блокируется.
Как работает сценарий маршрутизации входящих вызовов по DID:
- Скрипт открывает файл с именем
routes.json, в котором перечислены ваши внешние телефонные номера и внутренние получатели вызовов. - Сравнивается номер входящего вызова с номерами в файле.
- Если совпадение найдено, вызов направляется соответствующему получателю.
Использование сценария:
- В консоли администрирования перейдите в раздел Console > Integrations > Call Scripts.
- Добавьте из магазина и выберите “Inbound DID Routing”.
- Назовите сценарий для удобства.
- Настройте сценарий на запуск при поступлении вызова на транк (или при наборе этого DID).
- Выберите транк или DID для мониторинга.
- Загрузите свой файл, в котором перечислены телефонные номера и пункты назначения.
- Если вы переименуете файл, обновите конфигурацию сценария.
- Например, если вы переименуете файл JSON, обновите переменную
jsonFileNameсоответствующим образом.
Примечание:
Если сценарий настроен на запуск при вызове на DID, DID и пункт назначения также должны быть указаны в файле json, иначе вызов будет прерван.
Файл .json должен быть отформатирован следующим образом:
JSON
{
"<did_number>": "<DestinationType>.<DN.Number>."
}
Например: DID 112233, маршрутизируемый на добавочный номер пользователя 100, вам нужно сохранить файл следующим образом;
JSON
{
"112233":"Extension.100."
}
Реализация и функциональность скрипта:
Реализация:
- Использует объект
ExternalLineи свойствоIsInboundдля проверки, является ли вызов входящим в телефонную систему. - Использует метод
GetPropertyValue, чтобы получить имя сценария вызова и создать путь, по которому хранится файл. - Использует метод
ReadAllTextиз класса C#File, чтобы прочитать содержимое файла. - Десериализует объект Json и извлекает DID и пункт назначения.
- Использует структуру назначения, чтобы проверить, является ли назначение действительным, и, если оно действительно, построить назначение.
- Маршрутизирует вызов в пункт назначения с помощью
RouteToAsync.
Функциональность:
- Считывает пары ключ/значение из файла
routes.json. - Маршрутизирует вызов в пункт назначения на основе пары ключ/значение.
ВНИМАНИЕ! Чтобы увидеть этот скрипт в магазине 3CX, требуется версия v20 U5. Скрипт предназначен только для справки. Для получения последней версии загрузите его из магазина 3CX.
#nullable disable
using CallFlow;
using System.Threading.Tasks;
using TCX.Configuration;
using TCX.PBXAPI;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace dummy
{
public class InterceptInboundCall : ScriptBase
{
// Specify here your json filename with routing
// Structure of JSON is "Did_number":"[destination]"
// the destination is defined as string presentation of DestinationStruct
//Extension.. - routing to the extension (can be used with system extensions as well), forwarding rules are applied
//VoiceMail.<ringgroup,queue,extension number>. - voicemail of the specific entity.
// EG: "1222333":"Extension.100."
const string jsonFileName = "routes.json";
public override async Task StartAsync()
{
if (MyCall.Caller.DN is ExternalLine externalLine && MyCall.IsInbound)
{
var DIDNumber = MyCall.Caller.CalledNumber;
var cfdAppName = MyCall.CallHandler.MyDN.GetPropertyValue("CF_APP_NAME");
string cfdPath;
if (!string.IsNullOrEmpty(cfdAppName))
cfdPath = cfdAppName.Split('.')[0];
else
cfdPath = MyCall.CallHandler.MyDN.Number.Split('.')[0];
var filePath = System.IO.Path.Combine(MyCall.PS.GetParameterValue("IVRPROMPTPATH"), "Callflows", cfdPath, jsonFileName);
string jsonString = File.ReadAllText(filePath);
var data = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonString);
if (data.TryGetValue(DIDNumber, out var route))
{
var has_valid_destination = DestinationStruct.TryParse(route, out var destination_struct);
//if destination is malformed, the call is not intercepted
if (has_valid_destination)
{
var result = await MyCall.RouteToAsync(destination_struct);
//we are here when forwarding is successful, so we set returned value to true and put log message to CallFlow service log
MyCall.Info($"{DIDNumber} has been redirected to {route} ({result}");
return true;
}
}
}
return false;
}
}
}
Другие скрипты CFD
На нашем сайте есть коллекция скриптов CFD. Ознакомьтесь с ними и узнайте, как можно автоматизировать 3CX в соответствии с вашими потребностями.



