artem
26.11.2018
558

Очереди астериска и AddressBook

Наверное каждый сталкивался с ситуацией потери Важного клиента. Когда клиент звонит в компанию попадает в очередь без высшего приоритета и ожидает на линии 5, а то и больше минут. Чтобы исправить такую ситуацию было решено разработать систему. Которая будет определять насколько важен клиент. Если такой находится, то вызов будет направляться в очередь с высшим приоритетом.

Установка и настройка приложения Addressbook

Поискав на просторах интернета, был найден простой и удобный интерфейс телефонной книги, реализованный на базе php>= 5.2 и Mysql

Установка Addressbook

1.Приступим к установке веб приложения:

      Перейдем в корневую директорию Apache, в нашем примере — это

/var/www/html

cd /var/www/html/

    2.Скачаем архив найденного приложения Addressbook и распакуем его

wget -O addressbook.zip https://sourceforge.net/projects/php-addressbook/files/latest/download
unzip addressbook.zip && cd addressbook && rm -rf ../addressbook.zip

Теперь необходимо настроить распакованное приложение

Для начала перейдем в директорию конфигурационных файлов и откроем файл cfg.db.php.

Отредактируем наше подключение к Mysql:

Подключение к базе Mysql

dbserver – адрес нашего Mysql сервера

dbname – имя базы данных, где будут находиться таблицы приложения

dbuser – имя пользователя для подключения к Mysql

dbpass – пароль для подключения к Mysql

Настройка доступа в Addressbook

Далее необходимо установить пароль администратора для доступа в систему:

Установка пароля администратора

$userlist[‘admin’][‘pass’] — указывается пароль администратора

admin – логин администратора

Интерфейс Addressbook

После того как мы попадаем на веб интерфейс добавим контакты ВИП клиентов, выбрав ссылку «Добавить контакт».

Добавление контактов

После добавления нас переносит на главную страницу с отображением контактов

Список контактов

Настройка диалплана

Необходимо перед вызовом в очередь проверять существует ли внесенный номер в базе, для это используется agi скрипт, написанный на Python.

#!/usr/bin/env python3.5
#-*- coding: utf-8 -*-
import MySQLdb,sys,re

 

def CIDnum(num):
    if re.match(r’^[8](d{11})$’, num):
        return num[1:10],”from-internal”

 

    if re.match(r’^(d{11})$’, num):
        return num,”from-internal”

 

    if re.match(r’^+7(d{11})$’, num):
        return num[2:12],”local-city-mobile”

 

    if re.match(r’^[78]9(d{9})$’, num):
        return num[1:11],”local-city-mobile”

 
    if re.match(r’^[9](d{9})$’, num):
        return num,”local-city-mobile”

 
    return num,”default”

 
def agi(cmd):
    print (cmd)
    sys.stdout.flush()
    return sys.stdin.readline().strip()

 

def mysqlconnect(sql):

    db=MySQLdb.connect(host=”127.0.0.1″,port=3306,user=”freepbxuser”,passwd=”fpbxpasswd”,db=”asterisk”)
    cursor = db.cursor()
    cursor.execute(sql)
    sql = “””SELECT FOUND_ROWS(); “””
    cursor.execute(sql)
    row = cursor.fetchone()
    db.close()
    return row[0]

 

def main():
    number, typeofnumber = CIDnum(sys.argv[1])
    if typeofnumber == “from-internal” or typeofnumber == “default”:
        sql = “””select SQL_CALC_FOUND_ROWS * from addressbook where  mobile= ‘””” + number + “””‘ or home= ‘””” + number + “””‘ or  work= ‘””” + number +  “””‘ or fax='””” + number + “””‘ limit 1;”””

 
    if typeofnumber == “local-city-mobile” or typeofnumber == “another-town”:
        sql = “””select SQL_CALC_FOUND_ROWS * from addressbook where mobile like ‘%””” + number + “””‘ or home like ‘%””” + number + “””‘ or  work like ‘%””” + number +  “””‘ or fax like ‘%””” + number + “””‘ or  mobile like ‘””” + number + “””‘ or home like ‘””” + number + “””‘ or  work like ‘””” + number +  “””‘ or fax like ‘””” + number + “””‘ limit 1;”””

 

    result = mysqlconnect(sql)
    if result == 0:
        response = agi(“EXEC Set QUEUE_PRIO=5”)

 
    if result > 0:
        response = agi(“EXEC Set QUEUE_PRIO=10”)

 

    sys.exit(0)

if __name__ == “__main__”:
    main()

Для настроек в freepbx откроем файл extensions_additional.conf, найдем контекст ext-queues и скопируем содержимое этого контекста в файл extensions_override_freepbx.conf.

Extensions_override_freepbx.conf

Контекст мы заменили, теперь необходимо добавить выполнение нашего скрипта. Поэтому перед вызовов в очередь добавим несколько строк:

exten => 200,n,AGI(vip.py,${CALLERID(num)})
        same => n,Set(__CALLFROMNUM=${CALLERID(num)})
        same => n,Set(ARRAY(AGENT,DATE,NUMBER)=${ODBC_GET_DATA(${CALLERID(num)})})
        same => n,GosubIf($[“${NUMBER}”!=””]?sub-agent,s,1)
        same => n,NoOp(== IF THE NUMBER DOESN’T EXIST IN DB ==)

 

Следующим пунктом добавим в файл /etc/asterisk/func_odbc.conf следующие строки:

[GET_DATA]
dsn=asteriskcdrdb
readsql=SELECT agent, date, number FROM asteriskcdrdb.numbers_remember WHERE number=’${ARG1}’
[SET_DATA]
dsn=asteriskcdrdb
writesql=INSERT INTO asteriskcdrdb.numbers_remember (number,date,agent) VALUES (‘${SQL_ESC(${VAL1})}’,’${SQL_ESC(${VAL2})}’, ‘${SQL_ESC(${VAL3})}’)
[UPDATE_TIME]
dsn=asteriskcdrdb
writesql=UPDATE asteriskcdrdb.numbers_remember SET date=’${SQL_ESC(${VAL1})}’ WHERE number=’${SQL_ESC(${VAL2})}’
[DELETE_DATA]
dsn=asteriskcdrdb
writesql=DELETE FROM asteriskcdrdb.numbers_remember WHERE number=’${SQL_ESC(${VAL1})}’ AND date=’${SQL_ESC(${VAL2})}’

Теперь сделаем, так что если вызов ранее был отвечен, чтобы в дальнейшем вызовы шли на того же оператора. Добавим дополнительный контекст.

[sub-agent]
exten => s,1,NoOp(== IF CALLER NUMBER IS NOT “NULL”  ==)
        same => n,Set(DATERES=${MATH(${EPOCH}-${DATE},i)})
        same => n,GotoIf($[${DATERES}<${TIMEOUT_OF_NUMBER}]?low:higher)
        same => n,NoOp(== IF THE NUMBER DOESN’T EXIST IN DB ==)
        saem => n,Return

 

 

        same => n(low),NoOp(== IF ${DATERES} < ${TIMEOUT_OF_NUMBER} ==)
        same => n,Set(_NUM_TO_DEL=${CALLERID(NUM)})
        same => n,Dial(Local/${AGENT}@ext-local,2,Ttrg)
        same => n,GotoIf($[“${DIALSTATUS}”!=”ANSWER”]?agent_no_answer)
        same => n,Set(ODBC_UPDATE_TIME()=${EPOCH},${NUMBER})
        same => n,Return

 
        same => n{higher},NoOp(== IF ${DATERES} > ${TIMEOUT_OF_NUMBER}  ==)

        same => n,Set(ODBC_DELETE_DATA()=${NUMBER},${DATE})
        same => n,Return

        same => n(agent_no_answer),Return

Из части диалплана, что мы добавили в контексте ext-queues виден переход в указанный выше контекст.

GosubIf($[“${NUMBER}”!=””]?sub-agent,s,1)

Это проверяет есть ли номер в базе или нет. Если существует то сравниваем дату звонка клиента, если она меньше указанной в файле globals_custom.conf

TIMEOUT_OF_NUMBER=86400

то отправляем звонок в очередь и заносим в базу оператора, который общался с клиентом.

[ext-queues]
exten => h,1,Set(AGENT=${CUT(MEMBERINTERFACE,/,2)})
        same => n,Set(ODBC_DELETE_DATA()=${NUMBER},${DATE})
        same => n,Set(ODBC_SET_DATA()=${CALLFROMNUM},${EPOCH},${AGENT})
        same => n,Macro(hangupcall,)

WARNING
Запись в базу производится только по событию h (hangup)

Чтобы была доступна переменная MEMBERINTERFACE необходимо в параметры каждой очереди добавить setinterfacevar=yes

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Кондрашин Игорь, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices