Perl AGIを使用したアスタリスクの音声ツリー

こんにちは、読者の皆様。

Perl AGIを使用してアスタリスクの音声メニューを作成する私の例を共有したいと思います。

アスタリスクに関するVoice Treeの記事を自分の手で読んだ後、この記事で提案した音声メニューを実装する方法についていくつかコメントしました。
私の主な不満は、発信者がメニューを最後まで聞くことを余儀なくされ、それから提案されたキーの1つを押すようにすることです。 間違ったキーを押して間違えた場合は、メニューをもう一度聞く必要があります。
加入者はすぐに飽きてしまうようです。

また、従業員の内部番号をすでに知っている人は、しばしば会社に電話をかけます。 音声メニューの終了を待たずに番号をダイヤルする機会を提供する必要があります。

さらに、ゼロキーを押して秘書を呼び出すことはほぼ標準です。
加入者がメニューを聞きたくないが、すぐに秘書と話をしたい場合-私たちは彼に許可することができると思います。

上記の例で残りを説明します。


My AsteriskはFreeBSD上で動作します。 したがって、今後私が示す道はあなたと異なるかもしれません。

すでにアスタリスクがインストールされていると思います。
PerlとAsteriskモジュールのインストールも必要です:AGI

ここでのインストールについては長い間説明しません。Perlが既にインストールされている場合は、Asterisk:AGIを1つのコマンドでインストールするだけです。
cpan -i Asterisk:AGI 

その後、スクリプトで使用できます。

したがって、アスタリスク構成ファイルのフラグメントは次のとおりです。
extensions.conf
 [default] exten => 84951223344,1,Macro(call-in,${EXTEN}) ;      call-in exten => _X.,1,Hangup ; 

マクロを使用して、接続する前に着信コールをさらに処理します。 それなしでもできます。

 [macro-call-in] exten => s,1(agi),AGI(ivr.pl) ;       Perl-. 

/usr/local/share/asterisk/agi-bin/ivr.pl
 #!/usr/bin/perl use Asterisk::AGI; $AGI = new Asterisk::AGI; %input = $AGI->ReadParse(); $timeout = 1300; #    .   . #         . #    $AGI->answer(); #        #     $key1 = $AGI->stream_file(["ivr"], "0123456789"); #   ,     . #    ,  *  # (     ). $key2 = $AGI->wait_for_digit($timeout); $key3 = $AGI->wait_for_digit($timeout); $key4 = $AGI->wait_for_digit($timeout); #     (     ). $num = join ('', chr($key1), chr($key2), chr($key3), chr($key4)); #     ,    . #    ,   . $num = $num + 0; #      . if ( $key1 == 0 ) { $num = 0 } #      ,     ,    . #   . #     Asterisk (  ). $AGI->verbose("IVR number is $num"); #     -     . if (length($num) = 4) { $AGI->exec("Macro","call-local,Local/$num\@office"); #       office.   call-local .  $AGI->hangup(); } #     ,    . #       ,     . elsif (length($num) > 1) { $num = 0; } #      if ($num == 0) { $AGI->exec("Macro", "operator"); } if ($num == 1) { $AGI->exec("Macro", "sale"); } if ($num == 2) { $AGI->exec("Macro", "accounting"); } if ($num == 3) { $AGI->exec("Macro", "marketing"); } if ($num == 4) { $AGI->exec("Macro", "fax"); } 

次に、呼び出しは対応するマクロにルーティングされます。

マクロの例:

コールマーケティング:
extensions.conf
 [macro-marketing] exten => s,1,Dial(SIP/1008,20,tTm) 

電話番号表示オプション:
extensions.conf
 [macro-call-local] exten => s,1,Dial(${ARG1},25,tTm) 

以上です。

たぶん、提案された方法はあなたにとって不必要に複雑に思えます。
ただし、すべてのIVRロジックを別のファイルに保存するのが好きです。
また、メニューを簡単に補足し、サブメニューを追加できます(追加のスクリプトを作成することにより)。

さらに、AGIはいくつかの追加のスクリプト(不在着信の処理、モバイルへの転送など)で使用しているため、音声メニューに使用すると便利でした。

ご清聴ありがとうございました。

Source: https://habr.com/ru/post/J172561/


All Articles