お客様のプッシュフォン(DTMF)入力によって数字を取得し、それに応じて処理を行う一例です。
この例では、あらかじめ設定リスト(テキスト)を準備しておき、該当する数字列があるかどうかを判断するようにしています。
#!/usr/bin/perl
#
# 2012 Communication Business Avenue, Inc.
# User Input Check Script
#
use strict;
use Asterisk::AGI;
$|=1;
#
# Settings
#
my $DIGITS = 4; #USER Input DIGITS
my $userid_list = "/var/lib/asterisk/agi-bin/id_list.txt";
my $log = "/var/log/asterisk/checkid.log";
#
# Setup some variables
#
my %AGI; my $tests = 0; my $fail = 0; my $pass = 0;
use vars qw($astagi $astman);
$astagi = new Asterisk::AGI;
#$astman = new Asterisk::Manager;
while(<stdin>) {
chomp;
last unless length($_);
if (/^agi_(\w+)\:\s+(.*)$/) {
$AGI{$1} = $2;
}
}
#Variables Check
#while( (my $name, my $value) = each %AGI ){
# $astagi->verbose("$name, $AGI{$name}");
#}
#
# Announcement
#
$astagi->verbose("Start Announcemnet.");
#
# get DTMF
#
my $DTMF=0;
my $myres=0;
my $myres = $astagi->exec("BACKGROUND", "announce_1");
#First One Push
if($myres == 48){ $DTMF=0; }
if($myres == 49){ $DTMF=1; }
if($myres == 50){ $DTMF=2; }
if($myres == 51){ $DTMF=3; }
if($myres == 52){ $DTMF=4; }
if($myres == 53){ $DTMF=5; }
if($myres == 54){ $DTMF=6; }
if($myres == 55){ $DTMF=7; }
if($myres == 56){ $DTMF=8; }
if($myres == 57){ $DTMF=9; }
if(length($DTMF)<4){
$DTMF.=get_dtmf($DIGITS-length($DTMF));
}
$astagi->verbose("DTMF=".$DTMF);
#no input
if(length($DTMF)<$DIGITS || checklist($DTMF)==0)
{
#$astagi->exec("PLAYBACK","type_again");
$astagi->exec("PLAYBACK","announce_2");
#$astagi->exec("PLAYBACK","announce_3");
$DTMF=0;
$myres=0;
$myres = $astagi->exec("BACKGROUND","announce_3");
#First One Push
if($myres == 48){ $DTMF=0; }
if($myres == 49){ $DTMF=1; }
if($myres == 50){ $DTMF=2; }
if($myres == 51){ $DTMF=3; }
if($myres == 52){ $DTMF=4; }
if($myres == 53){ $DTMF=5; }
if($myres == 54){ $DTMF=6; }
if($myres == 55){ $DTMF=7; }
if($myres == 56){ $DTMF=8; }
if($myres == 57){ $DTMF=9; }
if(length($DTMF)<4){
$DTMF.=get_dtmf($DIGITS-length($DTMF));
}
if(length($DTMF)<$DIGITS|| checklist($DTMF)==0){
#$astagi->exec("PLAYBACK","couldnotfind");
#Hangup Version
#$astagi->hangup();
#exit 0;
#Goto Next IVR Steps Version
$DTMF="";
}
}
#
# Finished! GOAL
#
#$astagi->hangup();
#ここで、ユーザの入力したデータを MY_USERIDに格納しています。
$astagi->set_variable("MY_USERID", $DTMF);
#
# Sub
#
sub checklist {
#Check the userid text file list
my ($id) = @_;
open MYFILE, "$userid_list";
while(my $line = <myfile>){
my $tmp=trim($line);
if($tmp==$id){
#Found!
close MYFILE;
return 1;
}
}
#didn't find!
close MYFILE;
return 0;
}
sub checkresult {
my ($res) = @_;
my $retval;
$tests++;
chomp $res;
if ($res =~ /^200/) {
$res =~ /result=(-?\d+)/;
if (!length($1)) {
$astagi->verbose("FAIL ($res)\n");
$fail++;
} else {
$astagi->verbose("PASS ($1)\n");
$pass++;
}
} else {
print STDERR "FAIL (unexpected result '$res')\n";
$fail++;
}
}
sub trim($)
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
sub get_dtmf {
my $getdigits = shift;
my $DTMF = "";
my $digit_loop = 0;
my $digits_being_entered = 1;
my $POUND = ord('#');
$astagi->verbose("DTMF Input start....");
while (($digits_being_entered) && ($digit_loop < $getdigits))
{
my $digit = chr($astagi->wait_for_digit('10000'));
if($digit =~ /\d/){
$DTMF = "$DTMF$digit";
#this makes input so slow
#$astagi->say_alpha($digit);
undef $digit;
} else {
$digits_being_entered = 0;
}
$digit_loop++;
}
$astagi->verbose("end of DTMF Input ...");
#mylog("DTMF:".$DTMF);
#$astagi->say_alpha($DTMF);
return $DTMF;
}
sub mylog
{
my ($mes) = @_;
$mes =~ s/\n/ /gm;
$mes =~ s/\r/ /gm;
open(my $out_fh, ">>", $log) or die "Cannot open $log for write: $!";
print $out_fh scalar(localtime) . " $mes\n";
close $out_fh;
return $mes;
}
</myfile></stdin>
| 画像 0 | ||
|---|---|---|
| ギャラリーに表示すべき画像はありません。 |