Asterisk: Обеспечим VIP-клиентам первое место в очереди звонков, а так же свяжем клиента с конкретным оператором на заданное время
Asterisk — это fun! Каждый раз сталкиваясь с какой-то нестандартной задачей я радуюсь, радуюсь возможности снова погрузиться с головой в это чудесное состояние творчества, работы мысли. В последнее время такие задачи появляются часто и это здорово. Обозначенные в заголовке были реализованы и работают, а значит пришло время поделиться с сообществом своими решениями.
Расскажу немного подробнее о каждой.
1. Организовать список номеров телефонов VIP-клиентов. Звонки от VIP-клиентов должны попадать на первое место в очереди Asterisk, для скорейшей обработки именно их обращения. Так же нужно иметь возможность удобно добавлять и удалять контрагентов из этого списка.
2. Связать звонок клиента с конкретным оператором очереди на заданное время. Настроить Asterisk так, чтобы в его «памяти», на какое-то заданное время, оставалась информация о том, какой из операторов очереди принял вызов. Позвонил человек с номера 8913*75*5*0 и попадает к оператору очереди Алёна и нужно сделать так, чтобы в течение, например суток, входящие звонки с этого номера принимала только Алёна и никто другой. Но это еще не все, если клиент не хочет общаться с Аленой, то он может нажать клавишу * на своем телефоне и в следующий раз попадет уже к другому оператору.
С вступлением на этом заканчиваю, немного Python, MySQL и хитрого dialplan ждут вас под катом. Список VIP-клиентов. Приступив к реализации, я первым делом начал писать web-интерфейс для работы со списком контрагентов, но со временем понял, что это будет куда дольше чем найти что-то готовое. Действительно, спустя пол часа, у меня уже был развернут очень удобный вариант телефонной книги, написаной на php в связке с MySQL — как раз то, что нужно. Большое спасибо разработчикам PHP Address Book за их труд. Описывать установку не стану — все тривиально и очень подробно расписано в мануале, вложенном в архив проекта. Интерфейс очень удобный и понятный
После внесения нужных данных я отправился писать Python-скрипт, который будет принимать от Asterisk CALLERID, обрабатывать его, делать запросы в БД и выставлять нужный приоритет позвонившему исходя из результатов. Код у меня получился вот такой:
В функции WhatKindOfNumber я обрабатываю полученный номер телефона, при необходимости привожу его к нужному мне виду и определяю его тип. Далее, в зависимости от типа, запрашиваю данные в БД и выставляю в Asterisk'е значение приоритета — 5 если номера нет и 10 если он есть. БОльшее значение QUEUE_PRIO — бОльший приоритет.
Дело за малым, добавить строчку с вызовом AGI перед Queue. Например так(диалпланы предпочитаю на ael — не обессудьте):
С этой задачей все, идем далее.
Связка клиент <-> оператор(менеджер). Примем как данность, что взаимосвязь Asterisk и MySQL уже организована(если нет, то можете подсмотреть как это сделать тут).
Идем в mysql и создаем табличку, в которой у нас будут храниться записи о привязках клиентов к операторам.
Теперь внесем в func_odbc.conf запросы, которые будут выполняться из диалплана.
непосредственно сам диалплан:
Логика диалплана такая: Определяем есть ли в базе номер телефона, с которого нам пришел вызов. 1. Если нет, то идем в последний else NoOp(== IF THE NUMBER DOESN'T EXIST IN DB ==); и отправляем звонок в очередь, после чего присваиваем переменной AGENT значение ответившего оператора. И инсертим в БД — НОМЕР, ДАТУ в UTC, АГЕНТА.
2. Если номер в БД есть, то проверяем время. Если дата в БД менее TIMEOUT_OF_NUMBER, то отправим звонок конкретному агенту и обновим время, если больше, то в очередь.
*для того, чтобы иметь возможность заполучить значение переменной MEMBERINTERFACE нужно в конфиге КАЖДОЙ очереди указать параметр setinterfacevar=yes у меня выглядит так:
Регулярно удаляем устаревающие записи из БД. Я написал вот такой скрипт на bash:
Запускается по крону, хоть раз в минуту — зависит от значения TIMEOUT_OF_NUMBER Для возможности удаления привязки позвонившим клиентом нужно добавить в features.conf вот такую строчку
а в диалплан добавить такой вот контекст
и тогда, если в момент разговора клиент нажмет *, привязка удалится из таблицы.
За основу этого решения я взял статью — habrahabr.ru/post/204048, но там автор скромно умолчал многие нюансы.
Заключение. У меня осталось приятное послевкусие от успешно реализованных задач, Asterisk — это целый мир и порой от возможностей, в нем открывающихся, голова идет кругом. Это потрясающее ощущение, когда долго над чем-то работаешь, сумеешь победить, а потом еще и поделишься с другими людьми — будешь кому-то полезным. На этом я заканчиваю, любите свой труд, удачи вам и интересных, сложных задач!