479 просмотров
от (460 баллов) в категории Тонкая настройка

Добрый день!

Подскажите, пожалуйста, как получить в php-приложении диалплана номер, который звонящий ввел при донаборе? Хочу все варианты донабора отправить на одно и то же php-приложение, которое будет всё разруливать.

Спасибо.

1 Ответ

от (122 тыс. баллов)
Через кастомизацию это не сделать.

Проще на php-agi реализовать IVR.
от (460 баллов)
Спасибо за ответ! Тогда у меня запасной вариант, сделаю несколько php-приложений по одному на каждый добавочный номер, мне просто нужно предварительно разные действия выполнять перед отправкой вызова на специалиста, благо, что их совсем не много.
от (700 баллов)
Добрый день, а нет ли примера хоть какого-нибудь?
от (460 баллов)
Могу рассказать, как я сделал, хорошо подходит если немного операторов.

Входящие вызовы попадают на php-приложение, в котором производится предварительная регистрация звонка, т.е. в 1С звонок зарегистрирован еще до приветствия, но оператор пока не выбран.

<?php

    use MikoPBX\Core\Asterisk\AGI;

    require('phpagi.php');

    require_once 'Globals.php';

    $agi = new AGI();

    $agi_callerid = $agi->request['agi_callerid'];   

    // вызываю функцию регистрации звонка в опубликованной 1С

    $url = "http://192.168.0.25/MyCRM/hs/mikopbx/CallEvReg?phone=$agi_callerid";    

    $ch = file_get_contents($url);

    if (substr($ch,0,3)=="ok-") {      

        $agi->set_variable('CALLERID(name)', substr($ch,3));

        // регистрация прошла. отправляем на IVR с приветствием и донабором

        $agi->exec_goto("internal", "2200103", "1");

    }

    else {

// на всякий случай, если 1С не будет работать, отправляем вызов просто на очередь вызовов всех операторов, даже без приветствия, т.к. это «на всякий случай», которого быть не должно

        $agi->exec_goto("internal", "2200102", "1");      

    }    

?>

IVR (2200103) – это приветсвтвие с предложением донабора: голос говорит, что вызов зарегистрирован, выможете набрать добавочный номер…

Для каждого оператора  у меня создано php-приложение (пример будет ниже).

Вызовы переходят на php-приложение, соответствующее нужному оператору.

Текст php-приложения оператора с внутенним номером 1250:

<?php

    use MikoPBX\Core\Asterisk\AGI;

    require('phpagi.php');

    require_once 'Globals.php';

    $agi = new AGI();    

    $agi_callerid = $agi->request['agi_callerid'];  

    $url = "http://192.168.0.25/MyCRM/hs/mikopbx/CallEvReg?phone=$agi_callerid&dopnumber=1250";    

    $ch = file_get_contents($url);

        $agi->exec_goto("internal", "1250", "1");    

?>

Текст php-приложения оператора с внутенним номером 1240:

<?php

    use MikoPBX\Core\Asterisk\AGI;

    require('phpagi.php');

    require_once 'Globals.php';

    $agi = new AGI();  

    $agi_callerid = $agi->request['agi_callerid'];

    $url = "http://192.168.0.25/MyCRM/hs/mikopbx/CallEvReg?phone=$agi_callerid&dopnumber=1240";    

    $ch = file_get_contents($url);

        $agi->exec_goto("internal", "1240", "1");    

?>

Аналогичные приложения для каждого оператора.

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

Думаю понятно обрисовал.
от (700 баллов)
редактировать от

Спасибо за ответ, Ваш подход понятен. 

У меня задача немного другая - мне нужно "поймать" номер донабора и в зависимости от него выполнить действие: перевести звонок на очередь из сотрудников и в случае недозвона до них сформировать письмо с определенным текстом. Пока я остановился на том, что не могу отловить DTMF-набор абонента во время прослушивания приветствия - переход на следующее действие происходит после нажатия одной кнопки и поэтому отрабатывает оператор по метке default - вызов дежурного оператора. По логу вроде понятно, что не хватает времени на ввод 4 символов - 100мс. Т.е. задача такая, что во время проигрыша приветствия на заднем плане нужно  отловить 4 символа донабора.

ПС заранее прошу прощения за возможную криворукость кода - рыскал по разным форумам - нашел только getData('silence/1',6000,1);.

    $agi = new AGI();
    $agi->exec("Background","/storage/usbdisk1/mikopbx/media/custom/greeting_support");
    $press1 = $agi->getData('silence/1',6000,1);
    $keys = $press1['result'];
    switch ($keys) {
            case '4801':
            {
                $agi->exec_goto("internal", "2200111", "1");
                break;
            }
            case '4802':
            {
                $agi->exec_goto("internal", "2200114", "1");
                break;
            }
            case '4803':
            {
                $agi->exec_goto("internal", "2200118", "1");
                break;
            }
            default:
                $agi->exec_goto("internal", "2200115", "1");
        }
от (460 баллов)
С этим я помочь не смогу... Если на форуме не удается найти информацию по этому поводу, думаю, лучше создать новую тему именно по вашей проблеме.
от (122 тыс. баллов)

Вот пример по работе с IVR через php-agi

https://habr.com/ru/post/580676/

Мб поможет. 

Вот тут еще пример:

https://github.com/mikopbx/ModuleSmartIVR/blob/b39faf33ee4701630db4912e0aa6a70ae4264de3/Lib/AGICallLogic.php#L147

от (122 тыс. баллов)

вместо "file_get_contents" лучше использовать "GuzzleHttp", в нем хоть таймаут на запрос выставить можно.

Вот тут есть примеры

от (700 баллов)

Спасибо за ответ. Все получилось. Если кому нужно выкладываю:

<?php
    use MikoPBX\Core\Asterisk\AGI;
    require_once 'Globals.php';
    $agi = new AGI();
    $ivr_msg = '/storage/usbdisk1/mikopbx/media/custom/greeting_support';
    $agi->set_variable('AGIEXITONHANGUP', 'yes');
    $agi->set_variable('AGISIGHUP', 'yes');
    $agi->set_variable('__ENDCALLONANSWER', 'yes');
    $agi->Answer();
    $press1 = $agi->getData($ivr_msg,15000,4);
    $keys = $press1['result'];
    $agi->set_variable("id_supp", $keys);
//код сохраняю в БД, чтобы в дальнейшем использовать его в другом скрипте по отправке почты
    $agi->databasePut('support','id',$keys);
    switch ($keys) {
            case '4801':
            {
                $agi->exec_goto("internal", "2200111", "1");
                break;
            }
            case '4802':
            {
                $agi->exec_goto("internal", "2200114", "1");
                break;
            }
            default:
                $agi->exec_goto("internal", "2200115", "1");
        }
?>
На этом сайте можно бесплатно задать вопрос разработчикам MikoPBX и другим членам сообщества. Время ответа не регламентированно, но мы стараемся несколько раз в день заглядывать сюда. Для срочного решения проблем обращайтесь на платную линию поддержки

Популярные теги

askozia входящие-вызовы настройка исходящие маршрутизация провайдер запись-разговоров входящие ivr исходящие-звонки обновление ошибка очередь провайдеры битрикс24 очередь-вызовов переадресация запись установка маршрут история-звонков mikopbx транк панель-телефонии-1с перевод-вызова перевод askozia7 askozia6 битрикс callerid интеграция голосовая-почта логи перехват-вызова ростелеком нерабочее-время факс модуль nat docker запись-разговора веб-интерфейс bitrix24 goip настройка-провайдер история диалплан почта журнал-звонков релиз gsm вызовы звонок внешние-номера web-интерфейс zabbix маршруты cdr sip панель pjsip переадресация-мобильный voicemail ascozia телефонная-книга аон мобильный звонков лицензирование вызовов редактор номер asterisk лицензия ami регистрация оповещения провайдеров время голосовая fax trunk разговоров группы-пользователей #mikopbx пропущенные-звонки донабор beeline monitoring тишина smtp cisco мобильные мультифон мегафон шлюз не-работает электронная-почта не-слышно-звук

2.8 тыс. вопросов

2.4 тыс. ответов

6.7 тыс. комментариев

465 тыс. пользователей

...