AutoDialer - автообзвон, автоинформатор Asterisk
- Создание необходимых баз данных
- Настройка сервера Mysql
- Настройка веб-сервера (apache)
- Развертывание веб-приложения
- Настройка сценария управления Bash
- Настройка плана набора Asterisk
- Скачать: ad.tar.gz
Это базовая версия с минимальным функционалом и простейшим интерфейсом.
Тем не менее,
это комплексное решение, которое может быть адаптировано для решения самых разных задач и позволяет создавать массовые кампании обзвона.
В свободно-распространяемой версии может быть запущена только одна кампания одновременно.
Нежелательно кол-во строк в импортируемом через интерфейс файле более 50000 (но ничто не мешает импортировать прямо в БД).
Установка и настройка данного ПО требует базовых навыков администрирования - Linux, MySQL и Asterisk.
- Множество одновременных кампаний.
- Запуск кампаний по расписанию.
- Предиктивный набор.
- Кампании на миллионы номеров.
- Роботизированный колл-центр.
- Сотни одновременных вызовов.
Создание базы данных для AutoDialer
Приложение AutoDialer использует одну таблицу для всех кампаний.
mysql> select * from campaign; +----+----------+--------------+-------+-------+---------+-------------+-------+------+------+------+------------+-----------+--------+ | id | campname | chan_context | retry | pause | timeout | ext_context | exten | var | app | data | concurrent | timestamp | active | +----+----------+--------------+-------+-------+---------+-------------+-------+------+------+------+------------+-----------+--------+ | 2 | test_02 | from-dialer | 0 | 15 | 45 | from-agents | 555 | | NULL | NULL | 1 | NULL | NULL | +----+----------+--------------+-------+-------+---------+-------------+-------+------+------+------+------------+-----------+--------+ 1 row in set (0.00 sec)
Создание базы данных 'autodialer'
Введите root пароль, если задан.
mysql -p
Создайте базу данных от root пользователя mysql.
Установите привилегии для базы данных.
Замените YOUR_USER
& YOUR_PASSWORD
на свои значения.
create database autodialer; grant all privileges on autodialer.* to YOUR_USER@localhost identified by 'YOUR_PASSWORD'; flush privileges;
MySql 8
CREATE USER 'YOUR_USER'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD'; GRANT ALL PRIVILEGES ON autodialer.* TO 'YOUR_USER'@'localhost'; ALTER USER 'YOUR_USER'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YOUR_PASSWORD';
Создайте таблицу 'campaign'
use autodialer
CREATE TABLE `campaign` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `campname` VARCHAR(64) 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, `concurrent` VARCHAR(8) DEFAULT NULL, `timestamp` VARCHAR(16) DEFAULT NULL, `active` VARCHAR(8) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `camp` (`campname`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Создайте таблицу 'admin'
CREATE TABLE `admin` ( `username` VARCHAR(255) NOT NULL, `password_sha1` VARCHAR(64) NOT NULL, PRIMARY KEY (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Установите пользователя по умолчанию admin/admin(sha1).
insert into admin set `username`='admin', `password_sha1`='d033e22ae348aeb5660fc2140aec35850c4da997';
Настройка сервера Mysql
FILE
, т.к. используется метод LOAD DATA INFILE
.
/etc/mysql/my.cnf
[mysqld] secure-file-priv = ""
Перезапустите Mysql сервер.
# systemctl restart mysql
Установите привилегии FILE
Подключитесь к командной строке Mysql.
mysql -p
Установите привилегии.
grant file on *.* to YOUR_USER@localhost identified by 'YOUR_PASSWORD';
Проверьте привилегии каталога.
mysql> SHOW VARIABLES LIKE "secure_file_priv"; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_file_priv | | +------------------+-------+ 1 row in set (0.00 sec)
Настройка веб-сервера
Установите директорию:
- Для Debian: /etc/apache2/apache2.conf
- Для Centos: /etc/httpd/conf/httpd.conf
Добавьте следующий код в конфигурацию apache, где '/var/www/html/ad' ваш веб-каталог для приложения:
<Directory /var/www/html/ad> Options -Indexes AllowOverride All Require all granted </Directory>
Перезапустите apache.
systemctl restart apache2
Или для Centos.
systemctl restart httpd
Развертывание веб-приложения
Загрузите веб-приложение и распакуйте в корневой каталог Вашего веб-сервера:
tar zvxf ad.tar.gz
Настройте учетные данные mysql, заданные при создании базы данных.
./config.php
... $mysqli = new mysqli("localhost", "YOUR_USER", "YOUR_PASSWORD", "$conndb"); ...
./auth.php
... $mysqli = new mysqli("localhost", "YOUR_USER", "YOUR_PASSWORD", "$conndb"); ...
Измените владельца на asterisk. В этом сценарии предполагается, что Asterisk и веб-сервер запускаются из-под пользователя asterisk.
chown -R asterisk. /var/www/html/ad/ chmod -R 777 /var/www/html/ad/res/dialer/csv/
Настройка управляющего Bash скрипта
Он берет телефонные номера из базы данных и создает
call files
для оригинации вызовов.
Asterisk должен быть загружен с модулем pbx_spool.so:
CLI> module show like spool Module Description Use Count Status Support Level pbx_spool.so Outgoing Spool Support 0 Running core 1 modules loaded
Переместите скрипт в /var/spool/asterisk
mv /var/www/html/ad/campy.sh /var/spool/asterisk/
Сделайте asterisk владельцем и разрешите выполнение.
chown asterisk. /var/spool/asterisk/campy.sh chmod a+x /var/spool/asterisk/campy.sh
Настройте учетные данные БД.
./campy.sh
user="YOUR_USER" pass="YOUR_PASSWORD" db="autodialer"
Запуск Веб-Приложения
На этом установка завершена. Теперь откройте веб-приложение в браузере: http://ip_address/ad и авторизуйтесь admin/admin (значение по умолчанию,устанавливается во время создания базы данных).
Что бы добавить новую кампанию, просто введите ее название и укажите номер назначения (расширение диалплана) для отвеченных вызовов.
- Campaign name - используйте
a-z
,A-Z
,0-9
и_
- Answer Destination - расширение диалплана для отвеченных вызовов
- Max retry - количество попыток набора одного номера, где 0 - одна попытка
- Pause - пауза между попытками
- Wait - время вызова
- Concurrent - количество одновременных вызовов
- Channel context - контекст для набора телефонных номеров
- Exten context - контекст для ответа на удачный вызов. Вы можете перенаправить отвеченный вызов на любую сущность (очередь, абонент, звуковой файл, телеконференцию и т.д.).
Пример
555 in: exten ⇒ _555,1,queue(queue_name)
Пример простого диалплана.
[from-dialer] exten => _X.,1,Dial(PJSIP/${EXTEN}@sip_trunk,,) same => n,hangup [from-agents] exten => _555,1,Noop same => n,queue(queue_name) exten => _1XX,1,noop same => n,set(CALLERID(num)=${CALLERID(num)}) same => n,dial(SIP/${EXTEN})
Запуск кампании
Формат файлов csv:
1234 1235 1236
или, если необходимо имя:
1234,name1 1235,name2 1236,name3
Имя может быть передано как CALLERID(name) из call file
и отображаться агенту, который получил вызов.
Флажок unix
необходим если вы создаете csv из Linux или Mac где формат новой строки - \n
По умолчанию используется формат Windows - \r\n
В случае если csv-файл с номерами загружается, но в список номеров ничего не добавляется, нужно в config.php после:
$mysqli = new mysqli("localhost", "YOUR_USER", "YOUR_PASSWORD", "$conndb");
добавить следующую строку:
mysqli_options($mysqli, MYSQLI_OPT_LOCAL_INFILE, true);
Такое возможно в последних версиях mysql.
Проверьте список номеров
Взаимодействие с диалпланом
Что бы изменить статус вызова в базе данных телефонных номеров, необходимо использовать func_odbc
в диалплане.
Основная задача - передать название кампании (оно же имя таблицы) в b-leg вызова.
Файл вызова может передавать заданные переменные в диалплан, но они попадают в канал a-leg, а агенты отвечают в b-leg.
/etc/asterisk/func_odbc.conf
Пример конфигурации func_odbc
.
[ANSWER] dsn=dialer writesql=UPDATE ${VAL2} SET status='${VAL3}', timestamp='${VAL4}' WHERE camp='${VAL2}' and number='${VAL1}'
example диалплана
[form-dialer] exten => _X.,1,Dial(PJSIP/${EXTEN}@sip_trunk,,) exten => _X.,n,set(_time=${STRFTIME(${EPOCH},GMT+3,%y%m%d%H%M)}) exten => h,1,set(ODBC_ANSWER(1,2,3,4)=${dnumber},${campaign},${DIALSTATUS},${time}) exten => h,n,Hangup
Вы должны передать следующие данные:
- Название кампании
- Вызываемый номер
- Статус вызова и дату
- и другие данные, если требуется.
Эти данные должны быть добавлены из переменных диалплана.
Таблицы номеров обзвона автоматически создаются при импорте csv и называются аналогично названию кампании.
Основной целью этих таблиц является предоставление управляющему скрипту телефонных номеров для оригинации вызовов.
Чтобы не звонить повторно на уже обработанные номера, хорошая идея изменить статус вызова в таблице обзвона для удачных оригинаций.
Сценарий вызова файла получает номера телефонов с истинным статусом, например: 'NOANS', 'BUSY', 'NOANSWER', 'CONGESTION'
.
Статус можно получить, например, из переменной asterisk - ${DIALSTATUS}.
cat /var/spool/asterisk/campy.sh | grep sqlread
sqlread="select concat(number,',',camp) from autodialer.$campaign where status in ('NOANS', 'BUSY', 'NOANSWER', 'CONGESTION') order by RAND() limit $limit"
Пример кампании, обратите внимание на столбец status
NOANS - статус по умолчанию, который задается при создании таблицы:
MariaDB [autodialer]> select id, number, last_name, camp, status, timestamp from million1 limit 10; +----+-------------+--------------------+----------+-------------+-----------+ | id | number | last_name | camp | status | timestamp | +----+-------------+--------------------+----------+-------------+-----------+ | 1 | 78967634025 | МАВЛОНОВ | million1 | NOANSWER | 16-10-18 | | 2 | 78982656081 | СИТДИКОВ | million1 | NOANS | NULL | | 3 | 78982695621 | БУШМАНОВА | million1 | CHANUNAVAIL | 18-10-18 | | 4 | 78987292184 | ГАЛИЕВ | million1 | NOANSWER | 05-10-18 | | 5 | 79000411500 | КОРБОЛИНА | million1 | CHANUNAVAIL | 19-09-18 | | 6 | 79000411555 | ЛАНЦОВА | million1 | ANSWER | 19-10-18 | | 7 | 79000411593 | НАБИЕВ | million1 | NOANS | NULL | | 8 | 79000412264 | ВАХИТОВ | million1 | CHANUNAVAIL | 14-09-18 | | 9 | 79000412700 | КАРПОВА | million1 | BUSY | 14-09-18 | | 10 | 79000412932 | СТРУГОВА | million1 | NOANS | NULL | +----+-------------+--------------------+----------+-------------+-----------+ 10 rows in set (0.00 sec) |