お客様のプッシュフォン(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 | ||
---|---|---|
ギャラリーに表示すべき画像はありません。 |