Дмитрий Барышников
20.02.2019
638

Редактирование полей CDR при помощи скриптов

Довольно часто мы сталкиваемся с моментами, когда необходимо интегрировать телефонию с CRM системами или системами статистики. Эти сервисы зачастую берут данные из CDR. Но бывают случаи, когда CDR может заполняться некорректно. Это может быть связано с неверным настройками диалплана или даже вынужденная мера. Сегодня мы поговорим как раз о вынужденной мере. Представим себе ситуацию, когда […]

Довольно часто мы сталкиваемся с моментами, когда необходимо интегрировать телефонию с CRM системами или системами статистики. Эти сервисы зачастую берут данные из CDR. Но бывают случаи, когда CDR может заполняться некорректно. Это может быть связано с неверным настройками диалплана или даже вынужденная мера. Сегодня мы поговорим как раз о вынужденной мере.

Настройки проводились на Asterisk 13 и FreePBX 13.

Представим себе ситуацию, когда у нас недобросовестный оператор предоставляет транк с регистрацией, но не умеет самостоятельно подставлять А номер и это приходится делать на стороне FreePBX. Это повлечет за собой нежелательные последствия, а именно, в поле src в Mysql будет записываться не внутренний номер, а наш городской номер.

В MySql мы увидим следующее

Некорректное заполнение полей

На скриншоте мы видим, что некорректно  заполняется поле src, а интегрированная система salesman считает этот вызов входящим, хотя сам вызов был исходящий.
Данная проблема возникнет тогда, когда на FreePBX выполнены следующие настройки:

Когда вы создаете транк с регистрацией и в строке Outbound CallerID указан ваш городской номер

Пример настройки

Чтобы в дальнейшем нам спокойно работать, нам как-то необходимо редактировать нашу CDR. Из диалплана в явном виде это сделать невозможно, т.к. данные поля предназначены только для чтения.

Существуют 2 способа решения данной задачи.

1 способ. Использовать ODBC коннектор и alias в нём, но нам понадобиться создавать много переменных в диалплане для корректной записи необходимых полей.

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

Мы будем использовать второй способ.

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

Напишем скрипт следующего вида:

<?php
        $ip = "127.0.0.1";
        $db_user = "имя пользователя";
        $db_pass = "пароль";
        $db_name = "asteriskcdrdb";
        $db_con = mysqli_connect($ip,$db_user,$db_pass,$db_name);
        mysqli_query($db_con,"set names 'utf8'");
        $i=0;
        //вытаскиваем исходящие
        $cdr_sql = "select * from asteriskcdrdb.cdr where  LENGTH(cnum)=3 and src in(select outcid from asterisk.trunks where disabled = 'off')";
        //$cdr_sql="select * from cdr where recordingfile like 'out-%'";
        $cdr_rs= mysqli_query($db_con,$cdr_sql);
        while($cdr_row= mysqli_fetch_array($cdr_rs)) {
            $uniqueid = $cdr_row["uniqueid"];
            $cnum = $cdr_row["cnum"];
            //проверяем есть ли запись в БД SALESMAN
            $is_sm_exists = false;
            $is_sm_exists_sql = "select id from salesman.salesman_callhistory where uid=".$uniqueid;
            $is_sm_exists_rs= mysqli_query($db_con,$is_sm_exists_sql);
            while($is_sm_exists_row= mysqli_fetch_array($is_sm_exists_rs)) {
                $is_sm_exists = true;
            }
      //если есть тогда апдейтим CDR и SALESMAN
            if($is_sm_exists){
                $i++;
                //CDR UPDATE
                mysqli_query($db_con, "update cdr set src = '" . $cnum . "' where uniqueid=" . $uniqueid);
                //SALESMAN UPDATE
                $iduser="0";
                $salesman_sql = "select iduser from salesman.salesman_user where phone_in = '".$cnum."'";
                $salesman_rs = mysqli_query($db_con, $salesman_sql);
                $salesman_row = mysqli_fetch_array($salesman_rs);
                $iduser=$salesman_row['iduser'];
                mysqli_query($db_con, "update salesman.salesman_callhistory set src = '".$cnum."' , direct='outcome',iduser = '".$iduser."' where uid=". $uniqueid);
                echo $i.")".$uniqueid." UPDATED \n";
            }
        }
        echo "total ".$i." rows updated\n";
Скрипт обновления значений переменных
Необходимое значение мы берем из поля cnum

Делаем скрипт исполняемым

Chmod +x /usr/local/bin/updatesrc.php

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

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
php /usr/local/bin/updatesrc.php

Вспомогательный скрипт updatesrc.sh, тоже сделаем исполняемым

Chmod +x /usr/local/bin/updatesrc.sh

Выполняем crontab –e и вносим туда наш вспомогательный скрипт:

*/1 * * * * /usr/local/bin/updatesrc.sh
Если у ваш сервер со слабыми характеристиками, то в дальнейшем прогон всей базы может занимать длительное время и вызывать подвисания.
Исполнение скрипта по расписанию

Теперь данные в MySQL будут отображаться корректно

Правильное отображение данных
avatar
  Подписаться  
Уведомление о

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

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

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

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

ближайшие Вебинары

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.