Pull to refresh

Пишем скрипт голосового меню для Asterisk

Reading time3 min
Views4.7K
Всем привет!
Решил написать небольшую заметку как у нас в компании организовал голосовое меню для Asterisk. Тема наиболее актуально для новичков в IP-телефонии. Так что, товарищи хабравчане, не минусуйте сильно, я же стрался помочь новичкам.

Что нам для этого потребуется: заранее записать 4 приветственных сообщения:
1. Здравствуйте, вы позвонили в компанию Рога и Копыта. Для соединения с сотрудником наберите его внутренний номер или оставайтесь на линии.
2. Секретарь не может вам ответить, но вы можете связаться с интересующим вас отделом. Нажмите 1 — отдел ТС, 2 — 1С-программирования и т.д.
3. К сожалению, сотрудник не может вам ответить. Будет сделана переадресация на его сотовый телефон.
4. К сожалению, сотрудники отдела не можут вам ответить. Вы можете оставить голосовое сообщение руководителю отдела.

Схема выглядит следующим образом[Зараннее прошу прощения за художественную часть :) не силен]
image

В нашем примере голосовое меню срабатывает при наборе номера 100.

Итак сам php-agi скрипт:

#!/usr/bin/php -q
<?php
require('phpagi.php');
function auth($agii)
{
$phones = array(
"79521111111" => "101", // Сотрудник 1
"79112222222" => "102", // Сотрудник 2
"79213333333" => "901" // Сотрудник 901
);
$buffer='';
$dtmfwait=3000; // Сколько времени дать клиенту на принятие решения в меню
$result=$agii->fastpass_get_data($buffer,"1",$dtmfwait,3);
$digits=$result['result'];
//Набран внутренний номер если длинна 3
if(strlen($digits)==3)
{
if (($a=$agii->exec('Dial',"SIP/$digits,20,t"))!=0)
{
$status = $agii->get_variable("DIALSTATUS");
$agii->exec('NoOp',':::::::::::'.$status['data']);
// Если нет ответа или не включен телефон делаем переадресацию на сотовый
if ( ($status['data'] == "NOANSWER") or ($status['data'] == "CHANUNAVAIL"))
{
$agii->stream_file("3");
foreach ($phones as $phone_1 => $phone_2) {
if($phone_2==$digits)
{
$agii->exec('Set',"_NUMBER=$phone_1");
$agii->exec('Dial','H323/9999999@prov,,M(bubble),m');
}
}
}
}
return;
}
// Вы
// Если клиент нажал 0, ничего не нажал или ошибся

if((strlen($digits)==0) or ($digits=='0') or (strlen($digits)!=3)){
// Записывам звонок
$path='/home/shares/asterisk/in/'.date("d.m.y.H.i").'.wav';
$agii->exec('MixMonitor',$path.',b');
//Вызываем секретаря 15 секунд
if ($agii->exec('Dial',"SIP/000,15,t")!=0)
{
// Если секретарь не ответил, выключаем голосовое меню на выбор отдела
$result=$agii->fastpass_get_data($buffer,"2",$dtmfwait,3);
$digits=$result['result'];
switch ($digits) {
case 1:
$agii->exec('Dial',"SIP/101&SIP/102&SIP/103&SIP/104&SIP/105,,tT");
break;
case 2:
// Если из отдела 2 никто не ответил то включаем возможность оставить почту руководителю отдела. В данном случае это 201. Для остальных отделов по аналогии
if($agii->exec('Dial',"SIP/201&SIP/202&SIP/203,,tT")!=0)
{
$agii->exec('Voicemail','201');
}
break;

case 3:
$agii->exec('Dial',"SIP/301&SIP/302&SIP/303&SIP/304&SIP/305&SIP/306&SIP/307&SIP/308&SIP/309,,tT");
break;

case 4:
$agii->exec('Dial',"SIP/401&SIP/402&SIP/403&SIP/405&SIP/407&SIP/408,,tT");
$agii->break;
case 5:
$agii->exec('Dial',"SIP/005&SIP/006,,tT");
break;
case 6:
$agii->exec('Dial',"SIP/404,,tT");
break;
case 7:
$agii->exec('Dial',"SIP/009,,tT");
break;
default:
$agii->exec('Dial',"SIP/000,,tT");
}
}
}
// $agii->stream_file("2");
$agii->exec('Hangup');
return 0;
}
// Начало СКРИПТА
$agi = new AGI();
$agi->answer();
$agi->exec('NoOp','Starting main module AGI script');
//Запуск основного модуля
auth($agi);
?>

Пусть в переадресации на сотовый вас не пугает:
$agii->exec('Set',"_NUMBER=$phone_1");
$agii->exec('Dial','H323/9999999@prov,,M(bubble),m');


Просто дело в том, что наш Voip провайдер не может по другому предоставлять выход на «город». Статья по настройке Манго -офиса (Наш провайдер Voip) тут

PS Не нашел как красиво оформить <«Code»>.
PS2 Честно не хватило кармы перенсети в другой блог.
Tags:
Hubs:
+6
Comments5

Articles

Change theme settings