Додатковий автоматичний аналіз викликів
У ряді випадків отримання обробленої в Tariscope інформації про виклики недостатньо і потрібен додатковий аналіз даних, який хотілося б, щоб Tariscope виконував автоматично. Наприклад, служба безпеки компанії хотіла б оперативно знати про всі виклики, які виконані співробітниками з телефонів відомчої АТС до пожежної охорони, поліції або швидкої допомоги. Інший приклад, коли бажано знати про всі вихідних дзвінків, вартість яких вище певної величини, або про дзвінки на (з) телефони із «чорного списку». Можна придумати ще цілий ряд випадків, коли необхідно оперативно отримувати повідомлення про певні виклики.
Звичайно, буде не кращим рішенням подібних завдань посадити за монітор з Tariscope співробітника, який би відстежував такі виклики. Але цього робити і не треба, якщо використовувати всі можливості Tariscope. Tariscope можна налаштувати так, що він буде після закінчення кожного виклику автоматично виконувати додатковий аналіз даних виклику на предмет відповідності попередньо заданим умовам, наприклад, як ми згадували раніше, виконання будь-яким співробітником компанії виклику на якісь конкретні телефонні номери.
Особливий випадок, який вимагає оперативного відстеження, це виявлення телефонного фрода. Під телефонним фродом мається на увазі певний тип шахрайства, коли різними засобами виконуються несанкціоновані виклики, як правило, міжнародні, за рахунок компанії. У 2023 році за даними міжнародної асоціації CFCA (Communications Fraud Control Association) втрати від телефонного фрода становлять десь 38,95 млрд. доларів США [1].
Виявлення фрода істотно складніше, ніж виявлення, наприклад, викликів на конкретні телефонні номери, так як заздалегідь невідомо, на які номери виконуються виклики, коли, якої тривалості. Для виявлення фрода, як правило, рекомендується використовувати спеціальні системи, в більшості випадків робота яких заснована на порівнянні конкретного виклику з моделлю поведінки конкретного абонента, групи абонентів і в цілому компанії. Tariscope має таку підсистему виявлення фрода, але ця підсистема не входить до базової ліцензії на Tariscope і повинна купуватися додатково до базової ліцензії.
В той же час, навіть не купивши таку підсистему, Tariscope дає можливість виявляти підозрілі виклики, які можуть бути фродом. В цій статті ми як раз і розглянемо, як це зробити.
По-перше, будемо розглядати тільки вихідні міжнародні дзвінки вартістю понад заданої величини, так як фрод значно рідше використовується для міжміських і тим більше міських викликів.
По-друге, із зазначених викликів в першій умові найбільш підозрілими викликами з ознаками фрода слід вважати ті, які виконуються в неробочий час, у вихідні та святкові дні.
По-третє, можна оцінювати країни, куди виконувався виклик. Вважається, що найбільше дзвінків, які є фродом, виконується в країни Карибського басейну, а також Азії і Африки.
І, нарешті, можна оцінювати виклики на належність до фроду від абонентів, дані по яких відсутні в базі даних системи Tariscope.
Тепер розглянемо, яким чином пошук викликів із частиною зазначених вище ознак можна реалізувати в системі Tariscope.
У налаштуваннях служби Tariscope Observer є можливість виконувати сценарії при настанні певних подій. Для цього в гілці меню Збір даних/Observer системи Tariscope слід вибрати пункт меню Керування збором даних. Відкриється сторінка налаштування Збір даних/Observer, приклад якої наведений на малюнку 1.
Малюнок 1
Виберіть рядок з необхідних Observer-ом, якщо у вас їх декілька, і клацніть на панелі інструментів по іконці Змінити. В меню, що з’явиться, виберіть пункт Сценарії Observer. В наслідок чого відкриється сторінка Сценарії Observer, приклад якої показаний на малюнку 2.
Малюнок 2
Це вікно містить перелік подій, при настанні яких Tariscope може запустити пов'язаний з цією подією сценарій.
Можлива реакція на такі події:
- Підключення джерела даних.
- Відключення джерела даних.
- Зміна класу абонента.
- Зміна класу групи.
- Періодична дія.
- Новий виклик опрацьовано.
- Помилка підключення бази даних.
Для аналізу викликів на предмет належності їх до фроду в переліку Подія, слід вибрати подію Новий виклик опрацьовано, а в переліку Сценарії вибрати файл, який містить сценарій з аналізу фрода. Сценарії, що поставляються з Tariscope, за замовчуванням встановлюються в папку C:\ProgramData\Tariscope\ObserverScripts
Після вибору необхідного сценарію, збережіть налаштування (малюнок 2).
Сценарії повинні бути написані на мові C#. Серед сценаріїв, що постачаються з Tariscope є файл fraud.cs. Він дозволяє відправляти повідомлення або на задану в сценарії електронну адресу або на електронну адресу, задану в налаштуваннях Tariscope, про вихідні міжнародні дзвінки тривалістю понад 150 секунд, які виконані в проміжок часу: з 19:00 до 08:00. Ці параметри користувач Tariscope може змінити, видалити або додати інші.
Для написання нових сценаріїв або редагування існуючих бажано мати уявлення про програмування на мові C#, а також про створення SQL запитів.
Якщо ви не впевнені в своїх силах, зверніться в службу технічної підтримки компанії SoftPI, так як неправильно написаний сценарій може завдати шкоди системі Tariscope.
Написання сценаріїв силами компанії SoftPI не входить в послуги гарантійної або післягарантійних підтримок і виконується за окрему оплату.
Структура всіх сценаріїв, що використовуються в Tariscope, однакова. Кожен сценарій реалізує інтерфейс IScript.
У цьому інтерфейсі є два методи:
1. Метод Init. Цей метод викликається один раз під час запуску сценарію, коли служба Tariscope Observer компілює і ініціалізує цей сценарій.
2. Метод Main. У ньому виконуються операції, пов'язані з конкретною подією. У метод Main передається об'єкт Parameters.
3. При ініціалізації сценарію в нього передається інтерфейс IScriptHost, який дозволяє сценарію виконувати деякі операції. Наприклад, відправити повідомлення по електронній пошті.
Лістинг сценарію fraud.cs наведено нижче:
using Microsoft.Data.SqlClient;
using SoftPI.Tariscope.WebAdministration.Observer.Scripting.Interfaces;
using SoftPI.Tariscope.WebAdministration.Observer.Scripting.Models;
using System;
using SoftPi.Tariscope.DAL;
public class FraudScanner : IScript
{
private IScriptHost Host;
private bool NeedFinish = false;
//
//
********************************************************************************************
//
private int MAX_CALL_DURATION_S = 150;
private int CALLTYPE_INTERNATIONAL = 5;
private TimeSpan BEGINNING_OF_WORK = TimeSpan.Parse("08:00:00");
private TimeSpan END_OF_WORK = TimeSpan.Parse("19:00:00");
//
//
*********************************************************************************************
//
public void Init(IScriptHost host)
{
this.Host = host;
host.Close += OnClose;
NeedFinish = false;
}
private void OnClose(ref bool Cancel)
{
return;
}
public void Main(object Parameters)
{
NewCallActionParameters actionParameters = (NewCallActionParameters)Parameters;
try
{
this.Host.AddEvent("New call processing, ID= " + actionParameters.Id);
using (SqlConnection cn = new SqlConnection(this.Host.DatabaseConnectionString))
{
cn.Open();
CallItems CallItems = CallItems.Instance(cn);
SqlCommand cmd = CallItems.GetCommand("SELECT ID, Originator, Dialnumber,
CallDateTime, CallSeconds, CallType FROM viCalls WHERE ID=@callid");
cmd.Parameters.AddWithValue("@callid", actionParameters.Id);
using (SqlDataReader rs = cmd.ExecuteReader())
{
if (rs.Read())
{
if (rs.GetInt16(5) == CALLTYPE_INTERNATIONAL &&
rs.GetInt32(4) > MAX_CALL_DURATION_S &&
(((rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)) ||
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday)))
this.Host.SendMail("", "Fraud Detection system", "Suspicious call detected. ID=" + actionParameters.Id + " CallDateTime=" + rs.GetDateTime(3) + " Call duration=" + rs.GetInt32(4));
}
}
}
}
catch (Exception ex)
{
this.Host.AddEvent("Error running script: " + ex.ToString());
}
}
}
Для людини далекої від програмування наведений вище код сценарію може здатися зовсім незрозумілим. Насправді це не зовсім так. У тексті сценарію червоним кольором виділені ті рядки коду, в яких при необхідності можливо вносити зміни.
Розглянемо перші чотири виділені рядки:
private int MAX_CALL_DURATION_S = 150;
private int CALLTYPE_INTERNATIONAL = 5;
private TimeSpan BEGINNING_OF_WORK = TimeSpan.Parse("08:00:00");
private TimeSpan END_OF_WORK = TimeSpan.Parse("19:00:00");
Ці рядки оголошують чотири змінні:
- MAX_CALL_DURATION_S – це тривалість розмови, яка дорівнює 150 секунд, тобто 2 хвилини 30 секунд. Ви можете змінити це значення на будь-яке ціле позитивне число або 0.
- CALLTYPE_INTERNATIONAL – це тип виклику для міжнародних розмов, який застосовується в Tariscope. Його значення дорівнює 5. Якщо ви збираєтеся розглядати тільки міжнародні виклики, то не змінюйте це значення. Якщо вас цікавлять інші виклики, то визначити їх значення ви можете з документу Tariscope 4.6. Каталог бази даних.
- BEGINNING_OF_WORK – це час початку роботого дня, який тут дорівнює 8 годині ранку. Ви можете змінити це значення на будь-яке інше реальне значення часу початку робочого дня.
- END_OF_WORK – це час закінчення робочого дня, який тут дорівнює 7 годині вечора. Ви можете змінити це значення на будь-яке інше реальне значення часу закінчення робочого дня.
Наступний виділений рядок:
SELECT ID, Originator, Dialnumber, CallDateTime, CallSeconds, CallType FROM viCalls WHERE ID=@callid
Це SQL запит до подання viCalls на отримання з нього для поточного виклику, що задається умовою ID=@callid , де @callid є параметром, який містить ідентифікатор останнього виклику, що був оброблений в Observer. Цей SQL запит дозволяє отримати наступні поля:
- ID. Ідентифікатор запису.
- Originator. Телефонний номер, з якого був виконаний виклик.
- Dialnumber. Телефонний номер, на який був виконаний виклик.
- CallDateTime. Дата і час виконання виклику.
- CallSeconds. Тривалість виклику в секундах.
- CallType. Тип виклику.
За необхідності можливо отримати і інші параметри виклику з переліку полів подання viCall.
Наступна виділена частина сценарію виконує аналіз даних на відповідність заданим умовам:
(rs.GetInt16(5) == CALLTYPE_INTERNATIONAL &&
rs.GetInt32(4) > MAX_CALL_DURATION_S &&
(((rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)) ||
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday)))
Цей код використовується в операторі 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.
(rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK))
В цій умові використовується значення 3-го поля запиту, тобто поля CallDateTime. Перевіряється, чи припадає час виклику на проміжок часу між закінченням робочого дня і початком наступного робочого дня.
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday)
Це є альтернативна умова часу виклику, якій повинні відповідати всі міжнародні виклики тривалістю більше 150 секунд, що виконані в суботу або неділю.
Використовуючи логічні оператори && та || можна по різному розглядати відповідність виклика умовам, які потрібні.
Якщо результат перевірки є істина, то виконується команда з відправки електронною поштою повідомлення про цей виклик.
this.Host.SendMail("", "Fraud Detection system", "Suspicious call detected. ID=" + actionParameters.Id + " CallDateTime=" + rs.GetDateTime(3) + " Call duration=" + rs.GetInt32(4));
this.Host.SendMail() – це функція, за допомогою якої виконується відправка повідомлення електронною поштою. Ця функція має три параметри, які знаходяться всередині дужок і розділяються комами:
- Перший параметр задає електронну адресу, куди виконується відправка повідомлення. Якщо цей параметр порожній (""), як зазначено в наведеному вище виразі, то використовується електронна адреса, вказана в налаштуванні Tariscope Повідомлення та пошта. Якщо ви бажаєте відправляти повідомлення на якусь іншу адресу, ніж зазначену на цій сторінці налаштування або ви не налаштовували цей параметр в Tariscope, то в лапках слід задати цю адресу, наприклад, "Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її.".
- Другим параметром є тема електронного листа. У цьому сценарії таким параметром є "Fraud Detection system". При бажанні можно замінити цей параметр, наприклад, на "Отримано виклик з ознаками фрода" або якийсь інший.
- Третій параметр - це вміст тексту повідомлення. В даному сценарії це:
"Suspicious call detected. ID=" + actionParameters.Id + " CallDateTime=" + rs.GetDateTime(3) + " Call duration=" + rs.GetInt32(4) .
Розглянемо більш докладно цей рядок.
Частину рядка "Suspicious call detected. ID=" можна замінити, наприклад, на наступне:
“Виявлений підозрілий виклик з ідентифікатором =” . Значення цього ідентифікатора знаходиться в параметрі actionParameters.ID.
Наступна частина рядка " CallDateTime=" + rs.GetDateTime(3) буде відображати дату і час цього виклику. Можливо, буде краще, якщо цю частину рядка замінити на наступну:
“ Дата і час виклику: “ & rs.GetDateTime(3)
І, наостанок, вираз + " Call duration=" + rs.GetInt32(4) буде містити тривалість виклику. Також, для зручності сприйняття інформації, можна замінити цю частину рядка на:
“ Тривалість виклику:” & rs.GetInt32(4)
У рядку SQL запиту, який розглядався вище, міститься запит ще двох параметрів: Originator і Dialnumber. Відповідно, їх значення також можливо виводити в тілі електронного листа. Для цього слід додати наступний рядок:
“ Виклик виконувався з номера ” & rs.GetInt32(1) “ на номер “ & rs.GetImt32(2)
Якщо модифікувати SQL запит, то в повідомленні можливо виводити інформацію про абонента, з номера якого виконувався виклик, найменування населеного пункту, куди виконувався виклик та іншу інформацію.
Тепер повернемося до наших умов для виявлення викликів, які можна підозрювати, як фрод. Додамо спочатку аналіз вартості виклику. Для цього в місці сценарію, де задавалися розглянуті вище змінні, додамо змінну MAX_CALL_COST, для якої задамо значення вартості виклику, починаючи з якого виклик може розглядатися, як підозрілий. Наприклад, нехай це буде значення 10 гривень. Тобто сценарій повинен реагувати на будь-який виклик, вартість якого більше, ніж 10 гривень.
Private decimal MAX_CALL_COST = 10.0
Тепер необхідно додати в SQL запит отримання інформації про вартість виклику. Для цього слід скористатися описом подання viCalls в документі "Каталог баз даних Tariscope 4.x", щоб знайти необхідне поле. Це поле Cost. Тоді запит повинен виглядати наступним чином:
SELECT ID, Originator, Dialnumber, CallDateTime, CallSeconds, CallType, Cost FROM viCalls WHERE ID=@callid
Якщо нас не цікавить тривалість виклику, то із запиту можна виключити поле CallSeconds. І тепер, отримавши за допомогою цього SQL запиту дані за викликом, слід їх проаналізувати на відповідність умов, які нас цікавлять: міжнародний виклик з вартістю понад 10 гривень. Для цього рядок, де проводиться аналіз, потрібно записати наступним чином:
(rs.GetInt16(5) = CALLTYPE_INTERNATIONAL &&
rs.GetInt32(4)> MAX_CALL_DURATION_S &&
rs.GetDecimal(6) > 10.0) &&
(((rs.GetDateTime(3).TimeOfDay > END_OF_WORK ||
rs.GetDateTime(3).TimeOfDay < BEGINNING_OF_WORK)) ||
(rs.GetDateTime(3).DayOfWeek == DayOfWeek.Sunday ||
rs.GetDateTime(3).DayOfWeek == DayOfWeek.Saturday))
Цей рядок передбачає, що запит поля CallSeconds залишився. У разі, якщо його видалили, у рядку аналізу даних зміниться значення в дужках, які вказують на номер поля в запиті, починаючи з 0.
Аналогічним чином можна і далі ускладнювати умови для виявлення викликів з ознаками фрода.
При використанні сценаріїв для додаткової обробки даних викликів слід завжди пам'ятати, що це використання підвищує навантаження на сервер і може привести до уповільнення обробки.
Крім цього, якщо дані про виклики надходять в Tariscope з затримкою, наприклад, при отриманні їх через FTP сервер, то і повідомлення про підозрілі виклики також будуть сформовані з затримкою.
Якщо наведеної вище інформації вам недостатньо для створення необхідного сценарію, зверніться в службу технічної підтримки компанії SoftPI.