Asterisk AGI IVR
набралось по немногу готовых частей кода на PHP, которые я почистил и соединил
в проекте http://sourceforge.net/projects/phpivr/.
Интересующихся темой создания многоуровневого IVR на базе Asterisk приглашаю к использованию и обсуждению возможностей.
Задачи, которые стояли передо мной, текущим проектом покрыты. Все новшества будут реализовываться по надобности и возможности.
Баги, замечания, предложения и прочее можно постить непосредственно в этот топик, но лучше в соответствующие разделы проекта на SF.net
Желающих принять участие в разработке прошу обращаться в личку.
Кстати этот же IVR я интегрировал в Asterisk2Billing на входящие вызовы для тех у кого есть прямые входящие номера.
Основное нововведение - конфигурация в формате JSON
Предположим что нам необходимо сделать интерактивный автоответчик, который вкратце скажет в какую компанию
поступил звонок и переадресовать вызов на отдел (1001) продаж если нажать 1, отдел копоративных клиентов (1002) по нажатию 2.
Ну и как обычно бывает - соединить с секретарем (1000) если нажать 0 или дождаться окончания сообщения. Также предусмотрим
случай, когда с терминала введут dtmf не предусмотренный меню - сообщим о том чтобы еще раз прослушали меню
и проиграем его заново.
Для реализации этой простой задачи нам потребуется:
1) звуковой файл приветствия - welcome.gsm
2) звуковой файл описывающий доступное меню (его можно совместить с приветствием) - main-menu.gsm
3) звуковой файл с просьбой прослушать меню еще раз и сделать свой выбор - please-make-your-choice.gsm
Записанные файлы положим в папку /var/lib/asterisk/sounds/ivr, установим на них соответствующие права
в phpivr.conf пишем:
| Код: |
| { "common" : { "name" : "Main menu of my company IVR" ,"options" : "say=ivr/welcome|say=ivr/main-menu,prompt,loop=1|transfer=1000" ,"inputs" : { "0" : "transfer=1000" ,"1" : "transfer=1001" ,"2" : "transfer=1002" } ,"inputnotfound_act" : "say=ivr/please-make-your-choice|menu=common" } } |
Здесть надо отметить, что во время проигрывания welcome нажатие любой клавиши приведет к его завершению, и
сразу же будет проигрываться main-menu. И можно опустить опцию loop=1 поскольку количество проигрываний по
умолчанию равно 1, но дописано мной для лучшего понимания написанного.
Вот и все настройки. Сделали и забыли. Через время скачали новую версию, порадовались, поддержали проект )))
Added after 1 minutes:
В процессе написания примера был обнаружен баг:
Завершалось меню если небыло введено ни одного dtmf в случае ожидания по команде transfer или prompt
Собственно вышел новый bugfix release 0.9.5
Уже пробую. Сама концепция очень хорошая. Меньше телодвижений, меньше исправлений, меньше ошибок, но нужный результат.
Очень удобно ! Единственное чего не хватает, такого же удобного веб-интерфейса.
Механизм в превую очередь находит применение в организации пауз между проигрыванием сообщений.
| Код: |
| say=some-wav|*=Wait 5|say=another-wav |
собственно сам релиз http://sourceforge.net/project/platformd ... _id=285035
Так если были нажаты клавиши (1, 4, 3, 0, 3,
| Код: |
| ->1->4->3->0->3->8 |
Глядя в конфигурационный файл phpivr.conf можно запросто восстановить последовательность прохождения меню.
Дальше дело за аналитическим складом ума.
Монитор с промежутками в 5 секунд показывает звонки которые обслуживаются IVR-ом
ссылка та же))
если под web интерфейсом понимается то в чем можно конфигурацию редактировать
вообщем интерес есть, ждем результатов
- - открываем phpagi.php
- переходим на строчку 1184
- перименовываем function goto($context, $extension='s', $priority=1) в function ast_goto($context, $extension='s', $priority=1)
http://asteriskforum.ru/viewtopic.php?p= ... pAgi#38743
Added after 2 minutes:
а есть какие то новости по PHPIVR ?
| bartram писал(а): |
| Как сделать, чтобы не бросало трубку, после окончания проигрывания файла и ожидания нажатия, как сделать чтобы ожидание нажатия было долгим? |
phpivr.conf в студию
Added after 12 minutes:
| fabi писал(а): |
| является ли параметр "name" обязательным ? |
Нет, он используется только для вывода в консоли в строке
| Код: |
| Разбираем опции меню NAME=Bla bla bla' |
| busc писал(а): |
| phpivr.conf в студию |
| Код: |
| "common" : { "name" : "1st menu" ,"options" : "say=ivr/main,prompt" ,"inputs" : { "1" : "menu=main-1-q" ,"0" : "menu=common" } ,"inputnotfound_act" : "menu=common" } |
Здесь проигрываний будет 3, а потом бросит трубку
| Код: |
| ,"options" : "say=ivr/main,prompt,loop=3" |
Здесь проигрываний будет пока абонент не бросит трубку ))
| Код: |
| ,"options" : "say=ivr/main,prompt|menu=common" |
| Код: |
| { "common" : { "name" : "Common IVR menu" ,"options" : "*=WAIT 2|say=ivr/0,prompt,loop=1|menu=welcome_short" ,"inputs" : { "3" : "transfer=351" ,"1" : "menu=time_work" ,"2" : "menu=services" } ,"inputnotfound_act" : "say=ivr/invalid|menu=welcome_short" } } |
подскажите почему не набирает номер по transfer=351, нажимаю "3" сразу же короткие гудки
Added after 2 minutes:
вот лог
[code]
[Jul 29 18:17:29] IVR.php,common: Class.IVR.php:243 - Пытаемся получить IVR меню ID='common'
[Jul 29 18:17:29] IVR.php,common: Class.IVR.php:82 - Разбираем опции меню NAME='Common IVR menu' | ID='common'
[Jul 29 18:17:29] IVR.php,common: Class.IVR.php:83 - Array
[Jul 29 18:17:29] IVR.php,common: (
[Jul 29 18:17:29] IVR.php,common: [name] => Common IVR menu
[Jul 29 18:17:29] IVR.php,common: [options] => *=WAIT 2|say=ivr/0,prompt,loop=1|menu=welcome_short
[Jul 29 18:17:29] IVR.php,common: [inputs] => Array
[Jul 29 18:17:29] IVR.php,common: (
[Jul 29 18:17:29] IVR.php,common: [3] => transfer=351
[Jul 29 18:17:29] IVR.php,common: [1] => menu=time_work
[Jul 29 18:17:29] IVR.php,common: [2] => menu=services
[Jul 29 18:17:29] IVR.php,common: )
[Jul 29 18:17:29] IVR.php,common:
[Jul 29 18:17:29] IVR.php,common: [inputnotfound_act] => say=ivr/invalid|menu=welcome_short
[Jul 29 18:17:29] IVR.php,common: )
[Jul 29 18:17:29] IVR.php,common:
[Jul 29 18:17:29] IVR.php,common: Class.IVR.php:250 - IVR меню ID='common' успешно получено
[Jul 29 18:17:29] IVR.php,common: Class.IVR.php:252 - Выполняем меню ID='common'
[Jul 29 18:17:29] IVR.php,common: Class.IVR.php:135 - Опции обработчика : '*=WAIT 2|say=ivr/0,prompt,loop=1|menu=welcome_short'
[Jul 29 18:17:31] IVR.php,common: Class.IVR.php:94 - Устанавливаем счетчик проигрывания сообщения loop='1'
[Jul 29 18:17:31] IVR.php,common: Class.IVR.php:99 - Проигрываем сообщение 'ivr/0' с ожиданием нажатия
[Jul 29 18:17:31] IVR.php,common: Class.IVR.php:100 - Максимальное количество символов для ввода prompt_count='1'
[Jul 29 18:17:33] IVR.php,common: Class.IVR.php:274 - Была нажата кнопка '3'
[Jul 29 18:17:33] IVR.php,common: Class.IVR.php:281 - История ввода:->3
[Jul 29 18:17:33] IVR.php,common: Class.IVR.php:284 - Обработчик последовательности '3'
[Jul 29 18:17:33] IVR.php,common: Class.IVR.php:135 - Опции обработчика : 'transfer=351'
[Jul 29 18:17:33] IVR.php,common: Class.IVR.php:201 - Переадресовываем вызов на '351'
[Jul 29 18:17:33] IVR.php,common: IVR.php:25 - Array
[Jul 29 18:17:33] IVR.php,common: (
[Jul 29 18:17:33] IVR.php,common: [code] => 200
[Jul 29 18:17:33] IVR.php,common: [result] => 0
[Jul 29 18:17:33] IVR.php,common: [data] =>
[Jul 29 18:17:33] IVR.php,common: )
[Jul 29 18:17:33] IVR.php,common:
[/code]
| koqep писал(а): |
| подскажите почему не набирает номер по transfer=351, нажимаю "3" сразу же короткие гудки |
Dialplan настроен?
extensions.conf
Переименовал функцию PHPAGI goto в agigoto
Переписана ф-ция json_decode. Добавлена замена `имени файла` на его содержимое. Допускаются переносы строк в блоках команд.
Пара ошибок поправлено.
http://sites.google.com/site/grygoriim/devel/phpivr
Внимание !!!!
С версии 0.12.0 таг inputnotfount_act был заменен на invalidinput_act.
Заметил только сейчас, что кругом была ошибка в конфигах.
При вводе dtmf, которого небыло в меню, ничего не происходило. т.е проигрывалось меню заново.