Веб-сайты Графика Другое Asterisk e-mail


Asterisk


На этой странице описание моих разработок для системы Asterisk.
Исходники являются собственностью компании, в которой работаю. Но проконсультировать смогу.

Информер погоды по городам Украины
Клиент звонит и слышит текущую погоду в выбранном городе

Используем: Asterisk v 1.2 и старше, perl, Internet
Модули perl: LWP::Simple Asterisk::openIVR

Клиент выбирает город из списка (8 городов) либо выбирает регион Украины, а затем город. В результате он слышит текущую погоду в выбранном городе ("Сегодня в Киеве температура воздуха плюс девять плюс одиннадцать градусов цельсия, малооблачно, без осадков, ветер северный два метров в секунду").
После этого предлагается повторить это же сообщение голосами Ющенко и Ельцина с характерными для выбранного персонажа случайным образом вставками в текст.

Информация берется из rss службы weather.tut.ua


Информер курсов валют и драг.металлов.

Используем: Asterisk v 1.2 и старше, perl, Internet
Модули perl: LWP::Simple

Клиент звонит и слышит текущую информацию о курсах валют (курс НБУ, средний покупки/продажи для рубля, доллара, евро, а так же информацию о стоимости серебра, золота, платины)

Информация с сайта: finance.tut.ua

Проверка актуальности ссылок
По е-майл отправляются предупреждения об устаревших ссылках

traffic-check

Используем: perl
Модули perl: LWP::Simple, Storable, Mail::Sender

Скрипт запускается каждый час.
Осуществляется проверка выбранных файлов(ссылок) и отсылается е-майл, если время последнего изменения файла просрочено на 2 часа.
е-майлы шлются каждый день до решения проблемы.
Все параметры настраиваемы.


Голосовые меню openIVR
Система для проектирования голосовых меню.

Используем: Asterisk v 1.2 и старше, perl
Модули perl: Asterisk::AGI

Пользователь создает ivr-файл с правилами для голосового меню. Файл состоит из блоков, каждый блок содержит набор команд, разделенных символом ";". Существует возможность перехода между блоками безусловно (goto) и по нажатию любой клавиши во время проигрывания голосового сообщения, паузы или выполнения agi-скрипта.
Правила перехода по нажатию клавиши определяются командой press. Пример:
press(
1=>menu1,
2=>menu2,
#=>repeat,
);
В примере возможен переход к блокам [menu1] и [menu2] по нажатию соответственно клавиш 1 и 2 во время проигрывания голосового сообщения, паузы или выполнения agi-скрипта. По нажатию символа "#" происходит повтор текущего блока. Для того, чтобы "обнулить" таблицу переходов необходимо выполнить команду pause() без переменных.
Воспроизведение осуществляется по команде play. Примеры записи:
play('ru/happy_ny_2010');
play(file=>'sample',repeat=>3,pause=>2);
В качестве параметров команды play может выступать либо имя проигрываемого файла, либо набор значений (имя файла, количество воспроизведений, пауза между воспроизведениями)
Для выполнения agi скрипта необходимо воспользоваться командой agi: agi('name_script.agi'). В качестве возращаемого значения (номера нажатой клавиши) agi-скрипт должен возвратить
Для установки переменных для agi скрипта используется команда set: set(var=value)
Для установки случайного значения переменной для agi скрипта используется команда random. Список значений, которые будут случайным образом выбираться для установки значения перечисляются через запятую: random(var_rnd=value1,value2,value3)
Команда goto необходима для безусловного перехода меду блоками: goto(block_name)
Команда return используется для возврата в предыдущий блок из которого перешли в исполняемый блок.
Команда pause задает паузу в секундах. Если командой press задана таблица переходов, pause будет ожидать нажатия клавиши и осуществит переход, если клавиша из таблицы переходов была нажата.
Команда dial - набрать номер. Пример: dial(SIP/1003) После набора номера осуществляется переход к текущему меню (из которого происходил набор)
Команда call - переход на определенный extension в Asterisk. Пример: call(incoming_calls,s,2) После перехода программа IVR завершает свою работу (иначе переход не осуществится).
Команда hangup служит для обрыва текущей связи.

После того, как правила ivr будут написаны, есть возможность проверить его на ошибки.
В проверке отлавливаются 3 типа ошибок и 2 типа предупреждений:
ERROR: No data or main menu block in 'file' - Нет данных в файле
ERROR: block 'block' has dublicates - Дубликат названий блоков
ERROR: Link to unknown block 'block1' in 'command' command of 'block' block - Ссылка на неизвестный блок
WARNING: Unknown command 'command' in 'block' block - Неизвестная команда
WARNING: Unknown key 'key' in 'command' command of 'block' block - Неизвестный ключ в команде.
Если во время проверки обнаружена ошибка, выполнение ivr не производится.
При обнаружении предупреждений, ivr выполняется, ошибки игнорируются.

Вся информация о звонившем и его действиях заносятся в базу данных.
Сообщения программы и информация о звонках записываются в log-файлы.

Использование в asterisk:
[ivr-main]
exten => s,1,agi(openivr.pl,main) ;main - имя ivr-файла
exten => s,n,Hangup()
exten => h,1,DeadAGI(openivr.pl)

Пример ivr-файла:
[main_menu]
play('ru/happy_ny_2010'); //remove this after 01/15/10
press(
1=>weather, //go to "weather" block if 1 was pressed
2=>time, //go to "time" block if 2 was pressed
#=>repeat, //repeating if isnt "repeat" block
0=>main_menu, //repeating too
);
play(
file=>'audio-content/index', //file to play
repeat=>3, //count of playing
pause=>2, //pause in sec between plays
);
press; //nothing to press
play('ru/sorry_you_havent_chose');
hangup;

//run agi time
[time]
press(#=>repeat,0=>return);
agi('time.agi');
pause(2);
return();

//run agi weather
[weather]
press(#=>repeat,0=>return,1=>_set.voice1,2=>_set.voice2,3=>_set.random_voice);
agi('weather.agi');
play(file=>'ru/return_or_change_voice',repeat=>3,pause=>2);
return;

// set of voice variables
[_set.voice1]
set(voice=v1);return;
[_set.voice2]
set(voice=v2);return;
[_set.random_voice]
random(voice=v1,v2);return;

Система распределения звонков openACD
Система распределяет звонки между операторами согласно уровню доступа оператора к службе.
Система автоматического распределения звонков
openACD

Используем: perl, postgresql, php

Система автоматического распределения звонков (openACD - Automatic Call Distributor) позволяет распределять входящие звонки из ТСОП (телефонной службы общего пользования) между операторами колл-центра.

Во время входящего вызова из свободных операторов выбирается один оператор, которому этот вызов перенаправляется. Если оператор в течении 15 секунд не принимает звонок, осуществляется перенаправление звонка на другого оператора. Если оператор платной службы долго отвечает на входящий звонок, на экране оператора появляется текстовое сообщение "долгий разговор. предложите смс"

Со звонком, оператору отправляется текстовое сообщение — приветствие, которое он должен произнести. Так же оператор может получить сообщение о начале перерыва. Кроме приветственного сообщения, openACD отправляет техническую информацию о звонке (номер телефона, оператор, служба и т. п.). Эта информация предназначается для внешних приложений.

В случае занятости всех операторов, входящие вызовы ставятся в очередь. Во время ожидания в очереди, абоненту воспроизводится информация о приблизительном времени ожидания свободного оператора. Это позволило увеличить среднее время ожидания и уменьшить потери звонков, когда абонент вешает трубку раньше, чем дождется связи с оператором. В свою очередь, это позволило сократить количество отказов, когда клиент вешает трубку раньше, чем дождется оператора.

Отличительной особенностью программы является её децентрализация. Мы имеем возможность объединить колл-центры на основе openACD. Главное, что необходимо для объединения — наличие доступа в Интернет. Таким образом, мы можем объединить колл-центры территориально расположенные в разных городах.

Зачем это нужно? Рассмотрим пример удаленной обработки звонков. При поступлении вызова, в первый колл-центр, когда все операторы первого колл-центра заняты, это вызов может быть перенаправлен на любого другого свободного оператора из другого колл-центра. Также, для удаленной обработки звонков, мы можем изначально указать, что поиск свободного оператора происходит в удаленном колл-центре.

Если произошел обрыв канала связи с удаленным колл-центром, то этот колл-центр не участвует в схеме приема удаленных звонков. Но, тем не менее, этот колл-центр осуществляет отработку локальных звонков своей ТСОП.

Рассмотрим доступ операторов к службам. Для примера, у нас есть две службы. Используя таблицу доступа операторов к службам, мы можем запретить первому оператору отвечать на вторую службу, третьему запретить первую службу. Таким образом, на входящие звонки первой службы могут ответить первый и второй оператор, на звонки второй службы — второй и третий.

Основываясь на таблице доступа оператора к службам, мы можем ввести приоритеты распределения вызовов по операторам. Определим правило, по которому оператор получает звонок, если его приоритет на службу выше, чем у других операторов. Согласно схеме, если все операторы свободны и мы получаем звонок из первой службы, то его примет второй оператор (приоритет по первой службе у него выше, чем у других)

Рассмотрим ситуацию, когда у всех операторов одинаковый доступ к службам. В таком случае, первый оператор, который получит звонок будет тот, который дольше всех не отвечал на звонки. В системе openACD предусмотрены пять стратегий распределения: случайный выбор, справедливый(распределение между операторами по количеству принятых звонков), простаивающий(по времени простоя), по квалификации(у кого выше квалификация на службу), менее загруженный(по суммарному времени ответов на звонок).

В системе предусмотрены приоритеты для служб. В случае, когда в очереди окажутся две службы с разным приоритетом, распределение звонка на оператора первой получит служба с более высоким приоритетом.

В openACD реализован механизм «черных списков». Телефон бесплатной службы, если он есть в черном списке, получит сигнал «занято» без соединения с оператором. Все звонки в системе записываются.

Сейчас посмотрим действующую систему колл-центра. Любой звонок, поступивший на оператора, может быть перенаправлен как внутри колл-центра, так и на любой телефон ТСОП.

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

Стоит отметить, что кроме представленных служб, в системе есть служба IVR (система предварительно записанных сообщений с функцией переходя между сообщениями при помощи тонального набора) и автообзвонщик (система автоматического обзвона списка номеров с воспроизведением аудио-информации).
Если оператор зеленого цвета, он свободен и готов принимать звонки. Если оператор красного цвета, в данный момент он ведет прием звонка. Мы можем определить, по какой службе отвечает оператор в данный момент, номер телефона абонента и время текущего соединения занятого оператора (или время простоя свободного оператора). Если в этой таблице на пересечении оператора и службы не стоит символ точки, значит у оператора нет доступа к этой службе. Дополнительно указываются языки, которыми владеет оператор.

Чуть правее, указана нагрузка на службы. Если в нагрузка 100% и красная полоса сплошная, значит нет свободных операторов для ответа по этой службе. В этом случае все входящие звонки поступают в очередь, которая отображается тут же.

Справа мы видим короткую статистику принятых звонков с указанием номера телефона, службы, номера оператора, времени ответа и времени поступления звонка в систему. Если звонок будет пропущен оператором, строка с этой информацией подсветится темно-синим цветом, потерянный звонок будет подсвечен красным цветом, внутренний звонок — желтым цветом.

При помощи веб-интерфейса мы можем управлять операторами, службами, доступом оператора на службу, редактировать приветственные сообщения, черный список.
Система автоматического распределения звонков openACD ведет детальную статистику по каждому звонку и по событиям каждого оператора.

В статистике по операторам мы имеем возможность просмотреть события оператора за определенную смену. В такого рода статистике предоставлена подробная информация о входах и выходах оператора, о принятых и пропущенных звонках, о локальных разговорах, временные параметры каждого вызова, а так же кто первый положил трубку — оператор или абонент. Мы можем скачать и прослушать любой из звонков, поступивших в систему. Так же, чуть выше представлена сводная статистика по оператору (количество принятых звонков, среднее время ответа, средняя реакция и т.п)

Так же мы можем просмотреть сводную статистику по всем операторам за определенный день или за период.

Можно ограничить все виды статистики определенной службой или просмотреть статистику операторов для любого коуча.

Кроме этого реализован поиск по номеру звонившего абонента, а так же выборка случайным образом из статистики за любой период.

Перейдем к статистике по звонкам. Различие этой статистики и статистики по операторам в том, что в систему мог поступить звонок, который не дождался свободного оператора. Тогда мы его не увидим в статистике по операторам. Так же, в статистике по операторам записаны входы-выходы оператора и его локальные звонки — эта информация уже не представлена в статистике по звонкам.

Итак, в общей статистике мы можем вывести данные по звонкам за любой период по любой службе. Если мы выводим общую статистику за день, информация группируется по часам. Иначе — по дням.

В таблице операторов мы можем видеть данные о звонках с мобильных телефонов каждого из четырех мобильных операторов, а так же информацию с городских телефонов. Здесь представлена статистика по количеству звонков и по их общей продолжительности.

В таблице трансферов мы видим информацию о переадресованных звонках — количество и суммарное время. Здесь представлена информация о переадресациях на КийАвиа, юриста, внутренние звонки.

Информер погоды в Киеве
Клиент звонит и слышит текущую погоду в Киеве ("Сегодня в Киеве температура воздуха плюс девять плюс одиннадцать градусов цельсия, малооблачно, без осадков, ветер северный два метров в секунду").

Используем: Asterisk v 1.2 и старше, perl, Internet
Модули perl: LWP::Simple

Информация берется из rss gismeteo


Аудио-контент
Клиенту, согласно голосовому меню, предоставляется выбор категории (1-анекдоты, 2-цитаты из кинофильмов и т.п.)
После выбора, проигрываются аудио-файл соответствующей категории. Аудио-ролик выбирается из условия "случайный уникальный файл для этого номера телефона". Если всё аудио из выбранной категории проигралось, условие выборки следующего ролика меняется на "случайный файл, количество воспроизведений которого меньше, чем у других файлов для этого номера".


Используем: Asterisk v 1.2 и старше, perl, postgresql
Модули perl: DBI

Клиент имеет возможность пропустить аудио-ролик либо выйти в главное меню (информация об этом однократно проигрывается после первого и после третьего аудио-ролика.

Администрирование системы.
1. Для добавления категории достаточно создать папку в /var/lib/asterisk/sounds/audio-content и наполнить её wav - файлами. После этого, в основном голосовом меню вводим добавочный номер - 99 (можно переопределить). Система автоматически добавит информацию о категории и файлах в базу данных. Желательно добавить файл /var/lib/asterisk/sounds/audio-content/info-<ИМЯ_КАТЕГОРИИ>.gsm, в котором будет содержаться информация о том, как пропустить воспроизведение аудио-файла.

2. Для добавления или удаления аудио-контента из категории достаточно добавить или удалить wav-файлы из соответствующей папки и затем в основном голосовом меню ввести добавочный номер - 99. Система автоматически добавит или удалит информацию об этих файлах из базы данных.


Автообзвон по списку
Система обзванивает номера и проговаривает определенный текст.

Используем: Asterisk v 1.4 и старше, perl, php, postgresql
Модули perl: Class::Date, Proc::Daemon, Proc::PID::File, DBI

Управление через веб-интерфейс.
В веб-интерфейсе добавляем новый проект (имя проекта, дата начала/конца, префикс для обзвона (например SIP/), номер звонящего, количество попыток за один подход, общее количество попыток, время ожидания поднятия трубки, время ожидания между звонками при неоднократной попытке дозвона, контекст в extension.conf)
После добавления выставляем время, в которое будет совершаться обзвон для каждого дня недели. Система не осуществляет обзвон в т.н. "красное" время, прописанное в конфигурации.
Далее, импортируем телефоны. Телефоны прописаны в текстовом файле и отделены друг от друга символом перевода строки (\n)
В веб-интерфейсе есть возможность просмотреть статистику по обзвонам (имя проекта, количество успешных звонков, количество звонков по времени более 18 секунд, от 9 до 18 и менее 9 секунд, количество не успешных дозвонов - занято или не взяли трубку)
Ограничение доступа к веб интерфейсу позволяет ограничить управление прозвоном, в частности пользователь stat имеет доступ только к просмотру информации и полный доступ к изменению времени прозвона.

Сама программа прозвона написана на perl и запускается как daemon в ос linux.
В конфигурации указываем параметры БД, "красное" время, количество каналов, паузу ожидания и путь к папке outgoing

Программа автообзвона по списку протестирована на 2 млн. номерах.


Сервис будильник/напоминание.
Клиент заказывает, в какой день и в какое время ему позвонить с напоминанием "Это служба будильник. Спасибо, что воспользовались нашей услугой".

Используем: Asterisk v 1.2 и старше, perl
Модули perl: Class::Date, Time::Local, DBI

Данные сохраняются в базе с указанием точного времени и языка голосового напоминания (русский, украинский, английский). Каждые 10 минут запускается программа для проверки базы и создания файла для исходящего вызова (программа-прием заявок находится на компьютерах операторов и нет возможности с каждого компьютера создавать этот файл и выкладывать в outgoing).

Отличительная особенность программы - это один файл, который отвечает как за просмотр информации о новых напоминаниях, так и за выполнение AGI.


служба точного времени
Клиент звонит и слышит точное время ("13 часов 59 минут, сегодня среда, май, 13").
После этого проигрывается какая-нибудь мелодия, соответствующая текущему времени.


Используем: Asterisk v 1.2 и старше, perl
Модули perl: Class::Date, IO::Handle

Префикс имени файла состоит из приоритета и промежутка времени, когда можно воспроизводить файл. Например,
1000-1030-2-file1.wav - файл воспроизводится с 10:00 до 10:30
10x5-10x5-1-file1.wav - файл воспроизводится в 10:05, 10:15, 10:25, 10:35, 10:45, 10:55
xx00-xx00-1-file1.wav - файл воспроизводится каждый час, ноль ноль минут
xxxx-xxxx-3-file1.wav - файл воспроизводится в любое время

Приоритет - цифра от 1 до 100 - указывается после промежутка. Самый высокий приоритет обозначается цифрой 1, самый низкий - цифрой 100. В определенном промежутке времени проигрывается файл с приоритетом большим, чем у других файлов, разрешенных к воспроизведению в данный промежуток времени.

Таким образом, из примера видно, что если звонок поступил в 10:05, будет воспроизведен файл 10x5-10x5-1-file1 т.к. у него приоритет (равный 1) выше, чем у других файлов, которые могут быть проиграны в это время (1000-1030-2-file1 - приоритет 2 и xxxx-xxxx-3-file1 - приоритет 3)

Если несколько мелодий могут быть проиграны и их приоритеты совпадают, мелодия выбирается случайным образом.


English Russkiy Ukrainska Deutsch Franzosisch Spanisch

Asterisk


На этой странице описание моих разработок для системы Asterisk.
Исходники являются собственностью компании, в которой работаю. Но проконсультировать смогу.

Веб-сайты
Графика
Другое
e-mail