Переклад дзвінка за допомогою скрипта в Asterisk

дзвінка

Нещодавно в одного з наших клієнтів виникла необхідність перекладати дзвінки (вхідні та вихідні) на кліку з браузера. Логіка така: група операторів кол-центру приймає та здійснює дзвінки, і після розмови та з'ясування потреб їм потрібно з'єднати клієнта з одним із замовників або іншим спеціалістом організації.

У деяких випадках подібне завдання вирішують наступним чином: за подією в CRM до якоїсь бази даних заноситься номер оператора, і номер, з яким потрібно з'єднати його співрозмовника. Після цього оператор здійснює переведення дзвінка на службовий номер, у контексті перекладу здійснюється запит до бази даних і дзвінок нарешті переводиться на потрібний номер. Діалплан для вихідних у разі виглядає приблизно так:

[operator-out] exten => _X.,1,Noop(Outgoing call from $ to $) exten => _X.,n,Set(__TRANSFER_CONTEXT=transfer) exten => _X.,n,Dial(SIP/provider/$,30,T)

[transfer] exten => 800,1, Set (num=ODBC_GETXFERNUM ($ exten => 800, n, Noop (Transfer to $) exten => 800, n, Goto (some-context,$,1)

При всіх недоліках подібний метод можна застосовувати в тому випадку, якщо відомо, на який номер може знадобитися перевести дзвінок. Припустимо, кол-центр працює на вихідні дзвінки клієнтам кількох замовників. Дзвінок формується автоматично з CRM (з використанням callfile або через originate в AMI), де оператор натискає кнопку "наступний дзвінок" і бачить скрипт розмови з клієнтом. Тоді можна просто додати змінну, що успадковується, з номером, і переводити дзвінок на нього:

У callfile додати успадковану змінну __num:

Channel: Local/101@from-internal Callerid: 74950000000 MaxRetries: 2 RetryTime: 600 WaitTime: 30 Context:from-internal Extension: 74950000000 Priority: 1Set: __num=79991112233

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

exten => 800,1,Noop(Transfer to $) exten => 800,n,Goto(some-context,$,1)

Однак, у нашому випадку, як було зазначено вище, такий метод застосовувати небажано.

На щастя, розробники Asterisk подбали про нас, і через cli можна здійснити переведення певного каналу в заданий контекст:

Аналогічний функціонал є і в AMI:

Action: Redirect [ActionID:] value Channel: value [ExtraChannel:] value Exten: value [ExtraExten:] value Context: value [ExtraContext :] value Priority: value [ExtraPriority:] value>

Залишилося лише одне питання: як визначити канал, який нам потрібно перекласти, адже ми знаємо лише номер оператора.

Потрібно розуміти, що звичайна розмова є поєднанням двох каналів. У консолі ми можемо виконати bridge show all та побачити всі ідентифікатори з'єднань.

> bridge show all Bridge-ID Chans Type Technology 14418b64-0635-46e7-bd48-f4b820461eaa 2 basic simple_bridge

А командою bridge show подивитись інформацію про те, які саме канали беруть участь у з'єднанні.

Зрозуміло, що перебирати всі bridge-id у пошуках потрібного каналу незручно, і простіше отримати детальну інформацію про канали та знайти у видачі bridge-id, на підставі якого можна буде ідентифікувати потрібний нам канал.

> core show channels concise SIP/RT-00000453!incoming!!1!Up!AppDial!(Outgoing Line)!89063448810. 3!134!14418b64-0635-46e7-bd48-f4b820461eaa!1479984681.1659 SIP/67-00000452!macro-dialout-trunk!s!23!Up!Dial! 200000) !67. 3!134!14418b64-0635-46e7-bd48-f4b820461eaa!1479984681.1658

Ми бачимо, що на даний момент у нас є два канали з однаковим bridge-id (14418b64–0635–46e7-bd48-f4b820461eaa), і ми знаємо внутрішній номер оператора. Залишається лише отримати ім'я другого каналу та здійснити переклад. Розглянемо приклад bash-скрипту, який реалізує необхідний функціонал (протестовано на FreePBX 13):

Скрипт викликається з двома параметрами – номер оператора та номер, на який потрібно перевести дзвінок. Залишається лише «навчити» CRM його коректно викликати.

Що ми отримали в результаті? Можливість перекладу дзвінка оператора по одному кліку без необхідності використання баз даних та додаткових дій з боку працівника, не використовуючи готові CRM та модулі для роботи з asterіsk для них. При цьому скрипт однаково працює як з вхідними, так і з вихідними дзвінками.

Подібна реалізація буде корисною для аутсорс-колл-центрів, довідкових та інших служб, де потрібно швидко переводити дзвінки на велику кількість номерів, а також може застосовуватися для полегшення праці секретаря у великій організації.

Коментарі ( 2 )

agic

ACTION: Redirect Shannel: SIP/x7065558529–8f54 Context: default Exten: 5558530 Priority: 1

Або чому не ARI приклад

Мені одному здається, що подібна реалізація з викликом bash скрипта, є трохи милиця?

Адже набагато правильні дати необхідної доступ арм або crm системі через ami, Rest. А далі вже робити потрібне на логіці.