Оценка работы операторов на Asterisk

    Добрый день, %habrauser%

    Пару дней назад ко мне обратился руководитель тех отдела интернет магазина. Как у всех больших инет магазинов, у них есть свой Колл-центр, построенный на базе Elastix. Перед ним стояла задача сделать на Elastixе возможность оценки оператора.

    Задача:


    Требуется дописать дополнительный модуль для Астериска (elastix):

    Для работы горячей линии необходимо голосовое меню со сбором статистики.
    Вопрос: «Помогли ли вам специалисты Горячей линии?»
    Варианты ответа: Нет — кнопка «0» и Да — кнопка «1»

    Решение



    Все шло к тому, чтобы после разговора с оператором клиент попадал в IVR где смог бы проголосовать, но меня потянуло дальше и я решил эту задачу так:

    1) Приготовление mysql ДБ:
    По умолчанию asterisk ведет запись CDR в базу asteriskcdrdb, для нашей дополнительной статистике добавим туда новую таблицу.

    DROP TABLE IF EXISTS `opinion`;
    CREATE TABLE IF NOT EXISTS `opinion` (
      `id` int(11) NOT NULL auto_increment,
      `callerid` varchar(15) NOT NULL default '',
      `exten` varchar(15) NOT NULL default '',
      `queues` varchar(7) NOT NULL,
      `opinion` char(1) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    


    2) Готовим Макро
    В /etc/asterisk/extensions_custom.conf добавим:

    [macro-press-1]
    exten => s,1,MYSQL(Connect connid localhost ВАШ_ЮЗЕР ВАШ_ПАСС asteriskcdrdb)
    exten => s,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${CDR(dst)}, ${CDR(src)}, 1))
    exten => s,n,MYSQL(Clear ${resultid})
    exten => s,n,MYSQL(Disconnect ${connid})
    
    [macro-press-0]
    exten => s,1,MYSQL(Connect connid localhost ВАШ_ЮЗЕР ВАШ_ПАСС asteriskcdrdb)
    exten => s,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${CDR(dst)}, ${CDR(src)}, 0))
    exten => s,n,MYSQL(Clear ${resultid})
    exten => s,n,MYSQL(Disconnect ${connid})
    


    Юзер и пароль к базе asteriskcdrdb обычно есть в файле /etc/asterisk/cdr_mysql.conf

    3) Добавим Feature Application
    В features_applicationmap_custom.conf добавляем нужные нам цифры и привязываем к выполнения макро

    press1 => 1,peer/caller,Macro,press-1
    press0 => 0,peer/caller,Macro,press-0
    


    для того чтобы feature application сработал надо еще добавить его в глобальную переменную в диалпалне.
    в /etc/asterisk/extensions_override_freepbx.conf добавим

    [globals]
    DYNAMIC_FEATURES = apprecord#press0#press1
    
    


    apprecord обычно уже используется в Freepbx его тоже оставим.

    Результат



    В момент разговора с оператором у клиента есть возможность оценить его нажатием 0 или 1

    Лог успешной оценки:
        --  Feature Found: press1 exten: press1
        -- Executing [s@macro-press-1:1] MYSQL("Local/299@from-queue-56b8;1", "Connect connid localhost root 123 asteriskcdrdb") in new stack
        -- Executing [s@macro-press-1:2] MYSQL("Local/299@from-queue-56b8;1", "Query resultid 1 INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, +74993462198, 299, 1234, 1)") in new stack
    


    смотрим что в базе

    mysql> SELECT * FROM opinion;
    +----+-------------+-------+--------+---------+
    | id | callerid    | exten | queues | opinion |
    +----+-------------+-------+--------+---------+
    |  8 | 74993462198 | 299   | 1234   | 1       | 
    |  9 | 74993462198 | 299   | 1234   | 1       | 
    +----+-------------+-------+--------+---------+
    2 rows in set (0.00 sec)
    


    UPDATE:



    Можно ИВР для оценки прикрутить и после того как оператор повесил трубку:

    Настройки очереди нужно делать в ВЕБ интерфейсе, если версия FreePbx разрешает в Members указать LOCAL/999@opinion-ivr/n то первый пункт можно пропустить, если нет то Members добавлять в вебе не надо, их добавим в queues_post_custom.conf

    member=Local/299@opinion-ivr/n
    member=Local/999@opinion-ivr/n
    


    В extensions_custom.conf

    [opinion-ivr]
    exten => _.,1,NoOp(Statrt IVR)
    exten => _.,n,DIAL(SIP/${EXTEN},,trg) ;опция g позволяет звонку пройти далее по диалплану 
    exten => _.,n,Goto(opinion,,1)
    
    [opinion]
    exten => _X.,1,NoOp(Statrt IVR)
    exten => _X.,n,Background(Plese_press_0_or_1,m)  ; заменить на свой голосовой файл 
    exten => _X.,n,Set(TIMEOUT(absolute)=2)
    
    exten => 0,1,MYSQL(Connect connid localhost root 123 asteriskcdrdb)
    exten => 0,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${DIALEDPEERNUMBER}, ${NODEST}, 0))  
    exten => 0,n,MYSQL(Disconnect ${connid})
    
    exten => 1,1,MYSQL(Connect connid localhost root 123 asteriskcdrdb)
    exten => 1,n,MYSQL(Query resultid ${connid} INSERT INTO opinion (`id`, `callerid`, `exten`, `queues`, `opinion`) VALUES (NULL, ${FROMEXTEN}, ${DIALEDPEERNUMBER}, ${NODEST}, 1))  
    exten => 1,n,MYSQL(Disconnect ${connid})
    


    Всем позитивных оценок!!!
    Поделиться публикацией

    Комментарии 25

      +2
      >В момент разговора с оператором у клиента есть возможность оценить его нажатием 0 или 1
      А после, нет?
        0
        Можно и после
          0
          Если я своим коллцентрам предложу это, профсоюз меня просто пристрелит ;)
          Так держать, отличный пример как можно быстро добавить функционал.
          0
          Для того чтобы после завершения звонка отправить вызов в ИВР с оценкой оператора надо использовать опцию g в команде DIAL, но совместить это с FREEPBX мне не хватило терпения.
          0
          А DTMF будет слышен оператору?
            0
            relaxdtmf=yes — и ничего не услышит
          0
          Наши телефоны постоянно DDoS-ят звонками.

          Можно ли как-то решить задачу «блокировать звонящего если его callerid позвонил чаще 4 раз за минуту» без использования базы?
            +2
            такие решения есть, я видел чуть-ли не в вики по астериску.
            Метод записи номера звонящего во временную таблицу мускула и сравнения на каждый входящий звонок.
            Проблема в том что чаще всего для телефонного ддос используются IP-операторы, которые не парятся за передачу номера звонящего или вообще с виртуальных номеров со странными рандомными кодами. А против этого лома приёмов ещё не придумано, вроде.

            Можно попробовать договориться со своим провайдером, чтобы они блокировали звонки с определённых операторов, если они их могут как-то идентифицировать.
              0
              Если можно пожертвовать звонящими со скайпа, то можно просто составить таблицу реально-существующих кодов, оставить «нужные», а остальных просто дропать.
                0
                А что со скайпа звонки приходят с несуществующих кодов?
                  0
                  Если не куплена услуга предоставления входящего номера, то звонки приходят либо с многих восьмёрок, либо «номер неизвестен».
                0
                Мне интересна данная задача, свяжитесь через личку для уточнения требований, я готов это реализовать и выложить на Хабр.
                  0
                  А как сделаешь без использование ДБ?
                    +2
                    AstDB? Проверка/изменение счётчика на номере при поступлении нового вызова в зависимости от текущего времени и времени поступления предыдущих вызовов, которое (время) проще добавлять в ту же AstDB.
                    Я бы как-то так сделал, в общем.
                      0
                      Ну это конечно некорректно назвать «без ДБ», но с использованием только встроенных инструментов.
                      +2
                      Ну… Не совсем без БД.
                      Просто вместо внешней MySQL будет внутренняя встроенная в Asterisk DB на базе SQLite, в которую будут писаться звонки CDR.
                      Правило «блокировать звонящего если его callerid позвонил чаще 4 раз за минуту» достаточно просто реализуется, достаточно в диалплане анализировать собственную статистику.
                      Кстати, какие еще правила могут быть?
                      — если набранный номер за день повторяется больше, чем за месяц (типа звонки на Кубу Чпошли)
                      — Что еще ???
                        0
                        есть еще вариант использовать fail2ban, но я застрял в момент когда fail2ban переделывает мой CALLERID 4952323999 в 0.0.207.5 :)
                  0
                  Добавил UPDATE: с настройками для оценки после того как оператор повесил трубку.
                    +1
                    К 1.4 версии нам реализовать голосование во время разговора не удалось
                      0
                      в 1.4 не реализовано в features.conf возможность создавать свой приложения, попробуйте после разговора это сделать, опция g должна быть в 1.4
                        0
                        чей то оно не `реализвано`? applicationmap и макросы в них в 1.4 вполне себе работали и работают.
                        0
                        Напишите в личку и покажите лог.
                        0
                        Я бы не рекомендовал использовать функцию MYSQL() в принципе. Используйте модуль func_odbc.
                        А в данном случае можно использовать поле Userfield в CDR:
                        Set(CDR(userfield)=${SCORE})
                          +1
                          Спасибо. Мне лично статья интересна тем, что в ней немного описано, как в сгенерированный еластиксом конфиг прикрутить кастомный сценарий.
                          Обычно при настройках каких-то сценариев дальше extensions_custom.conf дело не идёт :), хотя, как я понимаю, система позволяет достаточно гибко манипулировать любыми событиями

                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                          Самое читаемое