Простейшая реализация интерфейса управления авто обзвоном.

Для инициации автообзвона используется Asterisk Spool (Call File).

Общее описание и схема работы

  • MySQL
  • Bach Shell Script
  • PHP

Номера хранятся в общей таблице MySQL.
Call файлы генерируются bash скриптом на основании выборки из БД.
Управление кампаниями производится при помощи веб интерфейса (Bootstrap3 + PHP).

При создании новой кампании (автообзвона) в БД создается строка - манекен, например:

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

+--------+----------------+----------------+----------------+--------+----------------+--------------+-------+-------+---------+-------------+-------+------+------+------+-----------+-----------+
| id     | number         | name           | camp           | status | trunk          | chan_context | retry | pause | timeout | ext_context | exten | var  | app  | data | concurent | timestamp |
+--------+----------------+----------------+----------------+--------+----------------+--------------+-------+-------+---------+-------------+-------+------+------+------+-----------+-----------+
| 163842 | test_campaign1 | test_campaign1 | test_campaign1 | NOANS  | test_campaign1 | NULL         | NULL  | NULL  | NULL    | NULL        | NULL  | NULL | NULL | NULL | NULL      | NULL      |
+--------+----------------+----------------+----------------+--------+----------------+--------------+-------+-------+---------+-------------+-------+------+------+------+-----------+-----------+
1 row in set (0.01 sec)

Далее интерфейс считает кампанию созданной, пока существует данная запись в БД.

После этого появляется страница с параметрами кампании. где можно загрузить информационное сообщение кампании и добавить номера обзвона, по одному или импортировать из CSV файла.

CSV файл должен содержать каждый номер в новой строке.

79211234567
79207654321
...

При добавлении номеров им присваивается статус 'NOANS' в поле status и имя кампании в поле camp.

Когда кампания создана, можно добавить голосовое приветствие. Приветствие сохраняется в директории /var/lib/asterisk/sounds/custom.
Ему присваивается имя кампании, например - test_campaign1.wav.
Файл должен быть в формате - 'wav', MONO 8000Hz 16-bit PCM По умолчанию интерфейс ориентирован под обзвон с голосовым оповещением. В дальнейшем это легко изменить в диалпалане asterisk и сделать точкой обзвона любую сущность asterisk.

Затем надо добавить номера для обзвона, после чего кампания готова к работе.

При запуске кампании, веб интерфейс передает bash скрипту следующие параметры:

  • Имя кампании, используется как идентификатор для выборки номеров данной кампании из бд
  • Параметры call файла
    • MaxRetries - кол-во попыток вызоыва уникального номера
    • RetryTime - время между попытками, если MaxRetries больше чем ) (0 значит, что попытка будет только ОДНА)
    • WaitTime - время вызова номера
  • Concurrent Calls - параметр bash скрипта, кол-во call файлов копируемых в директорию /var/spool/asterisk/outbound одновременно.
    Т.е. по сути кол-во одновременных вызовов.

Кнопка Start запускает bash скрипт c выбранными параметрами.
Кнопка Stop останавливает кампанию.
Кнопка Del - удаляет все записи из БД, где camp = имя текущей кампании.

Статус кампании и кол-во обработанных номеров отображаются в параметрах кампании. Для обновления информации требуется обновить страницу.

Установка и настройка

MySQL

/etc/mysql/my.cnf

[mysqld]
secure-file-priv = ""

Создадим БД приложения.

 create database autodialer;
 grant all privileges on autodialer.* to DBUSER@localhost identified by 'DBPASS';
 grant file on *.* to DBUSER@localhost identified by 'DBPASS';
 flush privileges;

где DBUSER и DBPASS ваши данные.

Создадим таблицу dialer:

CREATE TABLE `dialer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` varchar(16) DEFAULT NULL,
  `name` varchar(1024) DEFAULT NULL,
  `camp` varchar(32) DEFAULT NULL,
  `status` varchar(32) DEFAULT 'NOANS',
  `trunk` varchar(16) DEFAULT NULL,
  `chan_context` varchar(16) DEFAULT NULL,
  `retry` varchar(16) DEFAULT NULL,
  `pause` varchar(4) DEFAULT NULL,
  `timeout` varchar(16) DEFAULT NULL,
  `ext_context` varchar(16) DEFAULT NULL,
  `exten` varchar(8) DEFAULT NULL,
  `var` varchar(16) DEFAULT NULL,
  `app` varchar(16) DEFAULT NULL,
  `data` varchar(16) DEFAULT NULL,
  `concurent` varchar(16) DEFAULT NULL,
  `timestamp` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `number` (`number`,`camp`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

html

Скачайте и распакуйте в директорию веб сервера.

wget https://asterisk-pbx.ru/downloads/dialer23.zip

Отредактируйте данные подкл. к MySQL в файле index.php:

  $mysqli = new mysqli("localhost", "DBUSER", "DBPASS", "autodialer");

создайте мягкую ссылку на директорию, где будут храниться аудио файлы - /var/lib/asterisk/sounds/custom в корне приложения:

 cd /var/www/html/dialer
 ln -s /var/lib/asterisk/sounds/custom/ upload

измените права на директорию csv

  chmod -R 777 /var/www/html/dialer/csv

Bash Скрипт

Скопируйте скрипт dummy.sh из архива в директорию /var/spool/asterisk

Отредактируйте данные для подключения MySQL в скрипте:

user="DBUSER"
pass="DBPASS"
db="autodialer"

Задайте права на файл скрипта и сделайте его исполняемым.

сhown asterisk. /var/spool/asterisk/dummy.sh
chmod a+x /var/spool/asterisk/dummy.sh

Диалплан Asterisk

В bash скрипте заданы контексты которые

  1. from-dialer - Вызывает номера из списка.
  2. dialer-message - в нашем случае, воспроизводится звуковой файл.

dummy.sh:

Channel: Local/$number@from-dialer
Callerid: $camp
MaxRetries: $retry
RetryTime: $pause
WaitTime: $timeout
Context: dialer-message
Extension: $number
Priority: 1

Например:

[from-dialer]
exten => _X.,1,Dial(PJSIP/${EXTEN}@trunk,,)

[dialer-message]
exten => _X.,1,Answer()
exten => _X.,n,set(number=${EXTEN})
exten => _X.,n,Playback(custom/${CALLERID(name)})
;название кампании передается call файлом, как callerid (Callerid: $camp), звуковой файл сохраняется тоже под именем кампании
;таким образом, мы воспроизводим звуковой файл кампании
exten => _X.,n,Hangup
;установим статус номера, которому было проиграно сообщение,как ANSWERED. ддля этого используйте func_odbc, например.
exten => h,1,Set(ODBC_ANSWER(${CALLERID(name)})=${number})

Чтобы пометить номера, которым было проиграно сообщение, в данном примере использовано func_odbc /etc/asterisk/func_odbc.conf

[ANSWER]
dsn=dialer
writesql=UPDATE dialer SET status='ANSWERED' WHERE camp='${ARG1}' and number='${VAL1}'

Дополнительно

Bash скрипт.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

#!/bin/bash

campaign=$1
retry=$2
pause=$3
timeout=$4
concurrent=$5
limit=$6
d=$campaign
s=$(date +%d-$m%y_%H:%M:%S)
rm -f  "$campaign"
echo "$d"

user="DBUSER"
pass="DBPASS"
db="autodialer"
sqlread="select concat(number,',',camp) from dialer where camp = '$campaign' and status = 'NOANS' order by RAND() limit $limit"
RES=`mysql -h127.0.0.1 -u $user -p$pass --skip-column-names $db -e "$sqlread"`

printf "$RES" >> $d
echo "" >> $d

while IFS="," read number camp; do

cat <<EOF  >  /var/spool/asterisk/$camp-$number

Channel: Local/$number@from-dialer
Callerid: $camp
MaxRetries: $retry
RetryTime: $pause
WaitTime: $timeout
Context: dialer-message
Extension: $number
Priority: 1
EOF
    chown asterisk:asterisk /var/spool/asterisk/$camp-$number
    mv /var/spool/asterisk/$camp-$number  /var/spool/asterisk/outgoing

    echo "$number"

    number=`expr $number + 1`

    while [ "$?" -eq "0" ]

    do
count_files ()

{

    count_f=`ls /var/spool/asterisk/outgoing | wc -l`

        if [ "$count_f" -eq "$concurrent" ]; then

            sleep 10

            return 0

        else

            return 1

        fi

}

    count_files

    done

done < $d
  • soft/call_center/asterisk_autodialer.txt
  • Последние изменения: 2018/04/10