Это старая версия документа.


Call Center

Настройка ASTERISK

/etc/asterisk/sip.conf

[general]
Language=ru
transport=udp
qualify=yes
nat=yes
;#######################
;Подключаем конфиги
;#######################
;Конфиг для строк регистраций SIP транков
#include sip_register.conf
;Конфиг для создания и настройки SIP транков
#include sip_trunk.conf
;Конфиг для создания и настройки SIP клиентов
#include sip_users.conf

/etc/asterisk/sip_register.conf

;#######################
;Прописываем строки регистраций для транков
;#######################
;register = trunk_num:pass_for_trunk_num@ip_voip_provider/trunk_num

/etc/asterisk/sip_trunk.conf

;#######################
;Глобальные настройки
;#######################
[trunk](!)
 type = friend
 canreinvite=no
 qualify=yes
 disallow=all
 allow=ulaw
 allow=alaw

;#######################
;Настройки транков
;#######################
[trunk_num](trunk)
username=trunk_num
secret=pass_for_trunk_num
nat=yes
insecure=invite
host=ip_voip_provider
fromuser=trunk_num
fromdomain=ip_voip_provider
dtmfmode=info
context=from-office

extensions

В extensions.conf добавить

/etc/asterisk/extensions.conf

[out-calls]
exten => s,1,Answer
exten => s,2,Playback(${RECORD})
;exten => s,n,Set(CHOICE="")
;exten => s,n,Read(CHOICE,,1,,1,10)
;exten => s,n,GotoIf($["${CHOICE}" = "0"]?s,2)
exten => s,n,Hangup

Три закомментированные строки добавляют повтор сообщения для клиента после нажатия им кнопки 0 на телефоне. Это если повтор понадобится.

Скрипт обзвона

out-calls.pl

#!/usr/bin/perl -w

use strict;
use DBI;

my $dbname='abills';                    # Настройки подключения к базе
my $login='root';
my $passwd='pass';

my $voice_file='ru/demo-instruct';      # файл для проигрывания в директории /var/lib/asterisk/sounds
my $caller='111';                       # Номер звонящего
my $max_retries=4;                      # Количество попыток дозвона, если звонок не был принят
my $retry_pause=36;                     # Интервал между попытками в секундах
my $debug=1;                            # режим отладочных сообщений

my $filedir='/var/spool/asterisk/outgoing';
my $tmpdir='/tmp';
my $internal_pause=10;

my %MOBILE_PREFS=(                      # для префиксов мобильщиков автоматически в начале добавляется 0   если   его нет
'50' => 1,
'63' => 1,
'67' => 1,
'93' => 1,
'96' => 1,
'97' => 1,
'98' => 1,
);

my $default_trunk='SIP/111';            # Исходящий транк asterisk по умолчанию

my %TRUNKS=(                            # транки для для отдельных направлений
'067' => 'DAHDI/g0',
'097' => 'DAHDI/g0',
'096' => 'Dongle/i:359124037702136',
);

out_call('0964742263');         # убрать после тестов
exit 0;                 # убрать после тестов

my $dbh = DBI->connect("DBI:mysql:$dbname", $login, $passwd) || die "Could not connect to database:   $DBI::errstr";

my $sql="SELECT phone FROM users_pi as a join bills as b on (a.uid=b.uid) WHERE deposit<0";
my $sth = $dbh->prepare($sql);
$sth->execute();
while (my $result = $sth->fetchrow_hashref())
{
    my $phone=$result->{phone};
    $phone=~s/\+/00/g;
    $phone=~s/\D//g;
    $phone=~s/^00380/0/g;
    if ((length($phone)==9) and (substr($phone,0,1) ne '0') and ($MOBILE_PREFS{substr($phone,0,2)} ne ''))
    {
        $phone='0'.$phone;
    }
    if ((length($phone)>5) and (length($phone)<11) and (substr($phone,0,2) ne '00')) {
        print "Calling $phone\n" if $debug;
        out_call($phone);
        print "Sleeping $internal_pause s\n" if $debug;
        sleep $internal_pause;
    }
    else {
      print STDERR "Invalid number: '$result->{phone}'\n" if $debug;
    }
}

$dbh->disconnect();
 
exit 0;

sub out_call
{
    my $phone=$_[0];
    my $trunk=$default_trunk;
    foreach my $i (keys %TRUNKS) {
        if ($phone=~/^$i/) {
            $trunk=$TRUNKS{$i};
        }
    }
    open F,">$tmpdir/call-$phone";
    print F <<EOT;
Channel: $trunk/$phone
Callerid: $caller
MaxRetries: $max_retries
RetryTime: $retry_pause
WaitTime: 25
Context: out-calls
Extension: s
Priority: 1
Setvar: RECORD=$voice_file
EOT
    close F;
    rename "$tmpdir/call-$phone","$filedir/call-$phone";
}