В этой заметке расскажу как создать небольшой 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