Asterisk AMI: получить список свободных операторов, php скрипт

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

Как выяснилось, такую тривиальную задачу мне было трудно реализовать сходу. Пробовал разные команды AMI/AGI, пытался передавать данные из дайлплана, но все это не работало так как нужно.

В итоге для себя нашел самый простой способ: cоздаем очередь со всеми нужными нам агентами. Далее через CLI команду queue show получаем список всех операторов и их статусы. После получения списка, нам нужно всего-лишь оставить операторов со статусом "Not in use" и распарсить строчки так, чтобы на выходе остались только внутренние номера агентов разделенные знаком ";".

Приступим. Открываем /etc/asterisk/manager.conf и добавляем вниз секцию примерно следующего содержания:
[status]
secret=password
read=system,agent,command
write=system,agent,command
displayconnects = no
Далее перезапускаем астериск, пишем и публикуем скрипт следующего содержания:
<?php
    /* подключаемся по AMI */
    $socket = fsockopen('127.0.0.1', 5038, $errno, $errstr, 30);
    fputs($socket, "Action: Login\r\n");
    fputs($socket, "UserName: status\r\n");
    fputs($socket, "Secret: password\r\n\r\n");
    /* выполняем команды */
    fwrite($socket, "Action: Command\r\n");
    fwrite($socket, "Command: queue show \r\n\r\n");
    fputs($socket, "Action: Logoff\r\n\r\n");
    /* получаем результат */ 
    $wrets="";
    $delstr='Output:       SIP/'; /* эту часть уберем в начале строки */
    while (!feof($socket)) {
       $tmpstr=fread($socket, 8192);
    /* начинаем парсить строчки как нам нужно */
        if(strpos($tmpstr,"Not in use") !== false) {
            /* оставляем только Not in use */
            $tmpstrout = str_replace($delstr, '', $tmpstr);
            /* тут до первого пробела оставим номер */
            $tmpstrout = stristr ($tmpstrout , ' ',TRUE );
            $wrets .= $tmpstrout.';';
       }
    }
    echo $wrets;
    fclose($socket);
?>
По сути скрипт выполняет CLI команду через AMI, затем обрезает вывод до необходимых номеров.

Комментариев нет:

Отправить комментарий