Дополнительный автоматический анализ вызовов
В ряде случаев получение обработанной в Tariscope информации о вызовах недостаточно, и требуется дополнительный анализ данных, который хотелось бы, чтобы Tariscope выполнял автоматически. Например, служба безопасности компании хотела бы оперативно знать о всех вызовах, выполненных сотрудниками в пожарную охрану, полицию или скорую помощь. Другой случай, когда желательно знать о всех исходящих вызовах, стоимость которых выше определенной величины, или о звонках на телефоны конкурентов. Можно придумать еще целый ряд случаев, когда необходимо оперативно получать уведомления об определенных вызовах.
Естественно, будет не лучшим решением подобных задач посадить за монитор с Tariscope сотрудника, который бы отслеживал такие вызовы. Но этого делать и не надо, если использовать все возможности Tariscope. Tariscope можно настроить так, что он будет после окончания каждого вызова автоматически выполнять анализ данных вызова на предмет соответствия предварительно заданным условиям, например, как мы упоминали ранее, выполнение любым сотрудником компании вызова на номера скорой помощи, пожарной службы или полиции.
Особый случай, который требует оперативного отслеживания, это выявление телефонного фрода. Под телефонным фродом подразумевается определенный тип мошенничества, когда различными способами выполняются несанкционированные вызовы, как правило, международные, за счет компании. В 2015 году по данным международной ассоциации CFCA (Communications Fraud Control Association) потери от телефонного фрода оценочно составляют 38,1 млрд. долларов США [1].
Выявление фрода существенно сложнее, чем выявление, например, вызовов на конкретные телефонные номера, так как заранее не известно, на какие номера будут выполняться вызовы, когда, какой длительностью. Для выявления фрода, как правило, рекомендуется использовать специальные системы, в большинстве случаев работа которых основана на сравнении конкретного вызова с моделью поведения конкретного абонента, группы абонентов и в целом компании. В настоящий момент Tariscope не имеет подсистемы выявления фрода, но это не значит, что в нем нет никаких возможностей для его выявления. Для этого прежде всего следует сформулировать условия, на основании которых можно оценивать вызов на принадлежность к фроду. Давайте попытаемся это сделать, чтобы потом на основании этой информации выполнить настройку Tariscope.
Во-первых, будем рассматривать только исходящие международные вызовы стоимостью более заданной величины, так как фрод существенно реже используется для междугородних и тем более городских вызовов.
Во-вторых, из указанных вызовов в первом условии наиболее подозрительными вызовами с признаками фрода следует считать те, которые выполняются в нерабочее время, в выходные и праздничные дни.
В-третьих, можно оценивать страны, куда выполнялся вызов. В таблице 1 приведены 10 стран, откуда был наибольший фрод – трафик согласно отчету CFCA [1] за 2015 год. Приводятся консолидированные данные, а также данные для стран Северной Америки, Европейского Союза и остального мира. Из страны с номером 1 был наибольший фрод, а из страны с номером 10 – был наименьший фрод.
Таблица 1
Обобщенные данные | Для Северной Америки | Для Европейского Союза | Для остального мира | |
1 | Куба | Куба | Куба | Латвия |
2 | Сомали | Сомали | Великобритания | Куба |
3 | Босния и Герцеговина | Санта Люсия | Сербия | Литва |
4 | Эстония | Босния и Герцеговина | Эстония | Сомали |
5 | Латвия | Сьерра-Леоне | Гвиана | Босния и Герцеговина |
6 | Гвинея | Ямайка | Сомали | Эстония |
7 | Сербия | Кирибати | Африканские страны | Гвинея |
8 | Сьерра-Леоне | Тунис | Албания | Сербия |
9 | Великобритания | Гренада | Алжир | Сенегал |
10 | Литва | США | Прибалтийские страны | Сьерра-Леоне |
Для анализа принадлежности вызова к фроду можно учитывать не только откуда был выполнен вызов, но и куда. Упоминаемый ранее отчет CFCA [1] содержит и такую информацию, которая сгруппирована в таблице 2.
Таблица 2
Обобщенные данные | Для Северной Америки | Для Европейского Союза | Для остального мира | |
1 | США | Филиппины | Испания | США |
2 | Пакистан | Пакистан | Великобритания | Куба |
3 | Испания | Канада | Куба | Сомали |
4 | Куба | Нидерланды | Сомали | Италия |
5 | Италия | Испания | Пакистан | Литва |
6 | Филиппины | Франция | Египет | Пакистан |
7 | Сомали | США | Австрия | Латвия |
8 | Великобритания | Индия | Швейцария | Испания |
9 | Диминиканская республика | Нигерия | США | Тунис |
10 | Египет | Бельгия | Италия | Германия |
И, наконец, можно оценивать вызовы на принадлежность к фроду от абонентов, данные по которым отсутствуют в базе данных системы Tariscope.
Теперь рассмотрим, каким образом поиск вызовов с указанными выше признаками можно реализовать в системе Tariscope.
В настройке службы Tariscope Observer имеется возможность выполнять сценарии при наступлении определенных событий. Для этого в дереве настроек программы Tariscope следует выбрать настройку требуемой службы Tariscope Observer. В зависимости от используемого источника вызовов окно программы Tariscope для этого режима будет различным. На рисунке 1 показано окно программы Tariscope для случая получения информации с FTP сервера.
Рисунок 1
Оно содержит кнопку Сценарии. Щелкните по этой кнопке. Появится окно Сценарии Tariscope Observer, показанное на рисунке 2.
Рисунок 2
Это окно содержит перечень событий, при наступлении которых Tariscope может запустить связанный с данным событием сценарий.
Возможна реакция на следующие события:
- Подключение источника данных.
- Отключение источника данных.
- Изменение класса абонента.
- Изменение класса группы.
- Периодическое действие.
- Новый вызов обработан.
- Ошибка подключения базы данных.
Для анализа вызовов на предмет принадлежности их к фроду, следует выбрать событие Новый вызов обработан. После этого, щелкните по кнопке «…». В открывшемся окне выбора файлов нужно выбрать файл, содержащий сценарий по анализу фрода. Поставляемые с Tariscope сценарии по умолчанию устанавливаются в папку:
…Program Files (x86)\SoftPI\Tariscope4\Scripts
Сценарии могут быть написаны на языках Visual Basic.Net (VB.Net) или C#. Среди поставляемых с Tariscope сценариев пока содержатся только сценарии на языке VB.Net. Файлы с этими сценариями имеют расширение ‘vb’. В корне указанной выше папки есть файл fraud.vb. Он позволяет отправлять уведомление либо на заданный в сценарии электронный адрес или на электронный адрес, заданный в настройках Tariscope об исходящих международных вызовах длительностью более 150 секунд.
Для написания новых сценариев или редактирования существующих, естественно, желательно иметь представление о программировании на языке VB.Net или C#, а также о создании SQL запросов.
Если вы не уверены в своих силах, лучше обратитесь в службу техподдержки компании SoftPI, так как неправильно написанный сценарий может нанести вред системе Tariscope. Написание сценариев силами компании SoftPI не входит в услуги гарантийной или постгарантийной поддержки и выполняется за отдельную оплату.
Структура всех сценариев, используемых в Tariscope, одинакова. Каждый сценарий реализует интерфейс IScript. В этом интерфейсе есть два метода:
- Метод Init. Этот метод вызывается один раз при запуске сценария, когда служба Tariscope Observer компилирует и инициализирует этот сценарий.
- Метод Main. В нем выполняются операции, связанные с конкретным событием. В метод Main передается объект Parameters, который имеет тип, разный для каждого вида событий.
- При инициализации сценария в него передается класс IScriptHost, который позволяет сценарию выполнять некоторые операции приложения. Например, отправить уведомление по электронной почте.
Листинг сценария fraud.vb приведен ниже:
Option Strict Off
Imports System
Imports System.Data
Imports SoftPi.Tariscope.Common
Imports SoftPI.Tariscope.Observer
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
Imports System.IO
Imports System.Collections
Imports System.Collections.Generic
Imports SoftPI.Tariscope
Public Class FraudScanner
Implements IScript
Private Host As IScriptHost
Private NeedFinish As Boolean = False
'
'
Private MAX_CALL_DURATION_S As Integer = 150
Private CALLTYPE_INTERNATIONAL As Integer = 5
'
'
Public Sub Init(ByVal host As IScriptHost) Implements IScript.Init
Me.Host = host
AddHandler host.Close, AddressOf OnClose
NeedFinish = False
End Sub
Private Sub OnClose(ByRef Cancel As Boolean)
Return
End Sub
Public Sub Main(ByVal Parameters As Object) Implements IScript.Main
Dim actionParameters As NewCallActionParameters = DirectCast(Parameters, NewCallActionParameters)
Try
Me.Host.AddEvent("New call processing, ID=" & actionParameters.Id)
Using cn As SqlClient.SqlConnection = New SqlClient.SqlConnection(Me.Host.DatabaseConnectionString)
cn.Open()
Dim CallItems As DAL.CallItems = DAL.CallItems.Instance(cn)
Dim cmd As SqlClient.SqlCommand = CallItems.GetCommand("SELECT ID, Originator, Terminator, CallDateTime, CallSeconds, CallType FROM viCalls WHERE ID=@callid")
cmd.Parameters.AddWithValue("@callid", actionParameters.Id)
Using rs As SqlClient.SqlDataReader = cmd.ExecuteReader()
If rs.Read() Then
If rs.GetInt16(5) = CALLTYPE_INTERNATIONAL AndAlso rs.GetInt32(4) > MAX_CALL_DURATION_S Then
Me.Host.SendMail("", "Fraud Detection system", "Suspicious call detected. ID=" & actionParameters.Id & " CallDateTime=" & rs.GetDateTime(3) & " Call duration=" & rs.GetInt32(4))
End If
End If
End Using
End Using
Catch ex As Exception
Me.Host.AddEvent("Error running script:" & ex.ToString)
End Try
End Sub
Для человека далекого от программирования приведенный выше код может показаться “дремучим лесом”. На самом деле это не совсем так. В тексте сценария красным цветом выделены те строки кода, в которых при необходимости надо вносить изменения.
Рассмотрим первые две выделенные строчки:
Private MAX_CALL_DURATION_S As Integer = 150
Private CALLTYPE_INTERNATIONAL As Integer = 5
Эти строки объявляют две переменные (MAX_CALL_DURATION_S и CALLTYPE_INTERNATIONAL), которые имеют целый тип (Integer), и им присваивается конкретные значения. В переменной MAX_CALL_DURATION_S задается величина продолжительности вызова (150 секунд = 2 минуты 30 секунд). Далее эта переменная используется для сравнения с продолжительностью каждого международного вызова, и все вызовы более этой величины следует рассматривать на принадлежность к фроду. Значение в 150 секунд можно заменить на любое другое значение. Для выделения именно международных вызовов используется переменная CALLTYPE_INTERNATIONAL. Ей присваивается значение 5, что в Tariscope для поля Тип вызова (CallType) как раз соответствует международным вызовам. Для того, чтобы понять откуда взято это значение следует обратиться к документу “Tariscope 4.x. Каталог быазы данных“, описание таблицы Calls, значения поля CallType (Таблица 2.12.3).
Следующая выделенная строка:
SELECT ID, Originator, Terminator, CallDateTime, CallSeconds, CallType FROM viCalls WHERE ID=@callid
Здесь формируется строка SQL запроса, в которой получаются следующие поля представления viCalls для текущего вызова:
- ID. Это идентификатор записи.
- Originator. Телефонный номер, с которого был выполнен вызов.
- Terminator. Телефонный номер, на который был выполнен вызов.
- CallDateTime. Дата и время выполнения вызова.
- CallSeconds. Длительность вызова в секундах.
- CallType. Тип вызова.
При необходимости можно получить и другие параметры вызова из перечня полей представления viCall (смотрите в документе “Tariscope 4.x. Каталог базы данных“).
Следующая выделенная строка сценария выполняет анализ данных на соответствие заданным условиям:
rs.GetInt16(5) = CALLTYPE_INTERNATIONAL AndAlso rs.GetInt32(4) > MAX_CALL_DURATION_S
Она используется в операторе IF как условие сравнения. Состоит из двух условий:
- rs.GetInt16(5) = CALLTYPE_INTERNATIONAL
Берется значение 5-го поля запроса (поле CallType в SQL запросе). Отсчет полей начинается с 0. Значение поля сравнивается со значением переменной CALLTYPE_INTERNATIONAL. Т.е. это условие позволяет выявить является ли этот вызов международным. - rs.GetInt32(4) > MAX_CALL_DURATION_S
Берется значение 4-го поля SQL запроса (поле CallSeconds). Отсчет значений начинается с 0. Значение поля сравнивается со значением переменной MAX_CALL_DURATION_S.
Оба условия объединяются логическим оператором И. То есть действие, которое задано после оператора Then, будет выполняться только в том случае, когда выполнятся эти оба условия. И этим действием является отправка сообщения по электронной почте, что определяется следующим выражением:
Me.Host.SendMail("", "Fraud Detection system", "Suspicious call detected. ID=" & Parameters & " CallDateTime=" & rs.GetDateTime(3) & " Call duration=" & rs.GetInt32(4))
Me.Host.SendMail() – это функция, с помощью которой выполняется отправка сообщения по электронной почте. Эта функция содержит три параметра, которые находятся внутри скобок и разделяются запятыми:
- Первый параметр задает электронный адрес, куда выполняется отправка сообщения. Если этот параметр пустой (“”), как указано в приведенном выше выражении, то используется электронный адрес, указанный в настройка Tariscope – страница настройки “Уведомления и почта”. Если вы желаете отправлять сообщение на какой-то другой адрес, чем указанный в этих настройках или вы не настраивали этот параметр в Tariscope, то в кавычках следует задать этот адрес, например, “Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.”.
- Вторым параметром является тема электронного письма. В рассматриваемом сценарии этим параметров является “Fraud Detection system”. При желании можно заменить этот параметр, например, на “Получен вызов с признаками фрода”.
- Третий параметр – это содержимое тела сообщения. В рассматриваемом сценарии это: "Suspicious call detected. ID=" & Parameters & " CallDateTime=" & rs.GetDateTime(3) & " Call duration=" & rs.GetInt32(4).
Рассмотрим более подробно эту строку.
Часть строки "Suspicious call detected. ID=" & Parameters можно заменить, например, на следующее: “Обнаружен подозрительный вызов с идентификатором =” & Parameters. Значение этого идентификатора содержится в Parameters.
Следующая часть строки " CallDateTime=" & rs.GetDateTime(3) будет отображать дату и время этого вызова. Возможно, будет более читабельнее, если эту часть строки заменить на следующую: “ Дата и время вызова: “ & rs.GetDateTime(3)
И, наконец, " Call duration=" & rs.GetInt32(4) будет содержать длительность вызова. Также, для удобства восприятия информации, можно заменить эту часть строки на: “ Продолжительность вызова:” & rs.GetInt32(4)
В строке SQL запроса, которая рассматривалась выше, содержится запрос еще двух параметров: Originator и Terminator. Соответственно, их значения можно также выводить в теле электронного письма. Для этого следует добавить следующую строку:
“ Вызов выполнялся с номера ” & rs.GetString(1) “ на номер “ & rs.GetString(2)
Если модифицировать SQL запрос, то в сообщении можно выводить информацию о имени абонента, с номера которого выполнялся вызов, наименовании населенного пункта, куда выполнялся вызов, и другую информацию.
Теперь вернем к нашим условиям для выявления вызовов, которые можно подозревать, как фрод. Добавим сначала анализ стоимости вызова. Для этого в месте сценария, где задавались рассмотренные выше переменные MAX_CALL_DURATION_S и CALLTYPE_INTERNATIONAL, добавим переменную MAX_CALL_COST, для которой зададим значение стоимости вызова, начиная с которого вызов может рассматриваться, как подозрительный. Например, пусть это будет значение 3. Т.е. сценарий должен реагировать на любой вызов, стоимость которого больше, чем 3 (гривны, рубля, тенге или другой валюты).
Private MAX_CALL_COST As Decimal = 3.0
Теперь необходимо добавить в SQL запрос получение информации о стоимости вызова. Для этого следует воспользоваться описанием представления viCalls в документе “Каталог баз данных Tariscope 4.x”, чтобы найти требуемое поле. Это поле Cost. Тогда запрос должен выглядеть следующим образом:
SELECT ID, Originator, Terminator, CallDateTime, CallSeconds, CallType, Cost FROM viCalls WHERE ID=@callid
Если нас не интересует продолжительность вызова, то из запроса можно исключить поле CallSeconds. И теперь, получив с помощью этого SQL запроса данные по вызову, следует их проанализировать на удовлетворение интересующих нас условий: международный вызовов со стоимостью более 3. Для этого строку, где производится анализ следует записать следующим образом:
rs.GetInt16(5) = CALLTYPE_INTERNATIONAL AndAlso rs.GetInt32(6) > MAX_CALL_COST
Эта строка предполагает, что запрос поля CallSeconds остался. В случае, если его удалили строка анализа данных изменятся значения в скобках, которые указывают на номер поля в запросе, начиная с 0:
rs.GetInt16(4) = CALLTYPE_INTERNATIONAL AndAlso rs.GetInt32(5) > MAX_CALL_COST
Теперь усилим условия для поиска вызовов, которые можно рассматривать как фрод. Будем анализировать международные вызовы со стоимостью более 3 денежных единиц, которые выполнены с 19:00 до 08:00. Для этого следует создать соответственно две переменные для окончания рабочего времени – END_OF_WORK и начала рабочего времени – BEGINNING_OF_WORK.
Private BEGINNING_OF_WORK As TimeSpan = TimeSpan.Parse("08:00:00")
Private END_OF_WORK As TimeSpan = TimeSpan.Parse("19:00:00")
В документе “Каталог баз данных Tariscope 4.x” находим поле CallDateTime, которое содержит данные о дате и времени звонка, и добавляем его в SQL запрос, если его там еще нет:
SELECT ID, Originator, Terminator, CallDateTime, CallSeconds, CallType, Cost FROM viCalls WHERE ID=@callid
Для анализа результатов запроса будем использовать следующее выражение:
rs.GetInt16(5) = CALLTYPE_INTERNATIONAL AndAlso rs.GetInt32(4) > MAX_CALL_DURATION_S AndAlso (rs.GetDateTime(3).TimeOfDay > END_OF_WORK OrElse rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)
Если кроме нерабочего времени нас интересуют любое время в выходные дни, то указанное выше выражение для анализа результатов запроса следуют еще немного усложнить, добавив в него анализ принадлежности дня вызова к субботе или воскресенью:
rs.GetInt16(5) = CALLTYPE_INTERNATIONAL AndAlso rs.GetInt32(4) > MAX_CALL_DURATION_S AndAlso (rs.GetDateTime(3).TimeOfDay > END_OF_WORK OrElse rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK) AndAlso (rs.GetDateTime(3).DayOfWeek=DayOfWeek.Sunday OrElse rs.GetDateTime(3).DayOfWeek=DayOfWeek.Saturday)
Аналогичным образом можно и далее усложнять условия для выявления вызовов с признаками фрода.
При использовании сценариев для дополнительной обработки данных вызовов следует всегда помнить, что это использование повышает нагрузку на сервер и может привести к замедлению обработки. Кроме этого, если данные о вызовах поступают в Tariscope с задержкой, например, при получении их через FTP сервер, то и уведомление о подозрительных вызовах также будут сформированы с задержкой.
Если приведенной выше информации вам недостаточно для создания необходимого сценария, обратитесь в службу техподдержки компании SoftPI.
Ссылки
1. http://cfca.org/fraudlosssurvey/2015.pdf
2. Tariscope - система учета телефонных разговоров и биллинговая система для операторов связи