В этой заметке расскажу как создать небольшой IVR. Для этого используется интерфейс Asterisk-AGI и знание любого языка.
Рассмотрим на основе Perl, на CPAN-е есть хороший модуль для этого – Asterisk::AGI. Ставить будем через “CPAN”. В консоле вводим команду “cpan”, если вы первый раз запускаете, то он попросит сконфигурировать его в ручную или автоматически, выбираем автоматически. Я его запускаю не впервые поэтому у меня будет такой вывод

[root_test]# cpan

cpan shell -- CPAN exploration and modules installation (v1.7602)
ReadLine support enabled

cpan>

Установка, если в процессе понадобится установить дополнительные модули, соглашаемся

cpan> install Asterisk::AGI
CPAN: Storable loaded ok
Going to read /root/.cpan/Metadata
  Database was generated on Mon, 27 Dec 2010 20:45:25 GMT
CPAN: LWP::UserAgent loaded ok
Fetching with LWP:
  <a href="ftp://ftp.perl.org/pub/CPAN/authors/01mailrc.txt.gz">ftp://ftp.perl.org/pub/CPAN/authors/01mailrc.txt.gz</a>
Going to read /root/.cpan/sources/authors/01mailrc.txt.gz
Fetching with LWP:
..................
Asterisk::AGI is up to date.
cpan> quit
Lockfile removed.
[root_test]#

Добавляем в “/etc/asterisk/extensions.conf” строчки, вместо 89XXXX вставьте свой номер.

exten => _89XXXX,1,NoOP(--------------AGI start from ${CALLERID(number)} to ${EXTEN}-----------------------)
exten => _89XXXX,n,AGI(/var/lib/asterisk/agi-bin/IVR/IVR_89XXXX.pl)
exten => _89XXXX,n,Hangup()

Не забываем заставить Asterisk перечитать конфигурацию dialplan

dialplan reload

Файл “/var/lib/asterisk/agi-bin/IVR/IVR_89XXXX.pl” имеет следующий вид

#!/usr/bin/perl

use warnings;
use strict;
use Asterisk::AGI;

my $AGI = new Asterisk::AGI;
my  %input = $AGI->ReadParse();

my $work_dir = "/var/lib/asterisk/agi-bin/IVR";
my $sound_dir = "/var/lib/asterisk/sounds/en";

my $timeout = 2000;
my $manager = "1001";
my $reception = "1002";

##START
$AGI->answer();
$AGI->exec('Wait','1');

my $loop = 0;
while ($loop <= 5) {
    my $user_press = $AGI->get_data("$sound_dir/my_intro","$timeout",'1');
    if      ($user_press == 1) {
        $AGI->exec('Dial','SIP/'.$manager.',60,r');

    } elsif ($user_press == 2) {
        $AGI->exec('Dial','SIP/'.$reception.',60,r');

    }

    ++$loop;
}

$AGI->hangup();

exit();
#END