Web интерфейс прослушивания записей звонков Asterisk

в 2:15, , рубрики: Apache, asterisk, ip-телефония, linux, voip, системное администрирование, метки: , , ,

Web интерфейс прослушивания записей звонков Asterisk
Поисковые системы выдают огромное количество результатов разной полезности на запрос вынесеный в заголовок.
На Хабрахабре такой статьи не нашел, а значит её нужно написать!
За основу я взял проект asterisk cdr viewer.
Перевел язык web интерфейса на великий могучий и «озвучил» его, т.е. добавил возможность прослушивать файлы записей разговоров в браузере, а так же скачивать их.
Количество полей фильтра сокращено до минимума, остались только самые необходимые.
Скриншоты, сорцы и подробное описание инсталяции уютно разместились под хабракатом.

Скриншоты web интерфейса

Логотип и ссылка на донат разработчикам остались на своих местах.
Поля переведены все, если потребуется вывести какое-либо поле как в оригинале, просто раскомментируйте его в templates/form.tpl.php
Web интерфейс прослушивания записей звонков Asterisk

А так выглядит результат поиска по фильтру.
Каждый разговор можно скачать, либо прослушать через flash плеер.
Web интерфейс прослушивания записей звонков Asterisk

Готовим MySQL

CDR нашего Asterisk должны писаться в MySQL базу, о том как это настроить можно прочесть здесь например ;).
Имя файла записи разговора пишется в поле file таблицы CDR.
Добавим его:

mysql -uroot -p -e "alter table  `cdr` add column `filename` varchar(120)  after `userfield`;"  asterisk
Диалплан

Для настройки диалплана Asterisk я пользуюсь extensions.ael.

extensions.ael

globals {
    WAV=/records/wav; //Временный каталог с WAV
    MP3=/records/mp3; //Куда выгружать mp3 файлы
    RECORDING=1; // Запись, 1 - включена.
};

macro recording (calling,called) {
        if ("${RECORDING}" = "1"){
              Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
              Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}/${fname}.wav"  "${MP3}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${fname}.mp3");
              Set(CDR(filename)=${fname}.mp3);
              Set(CDR(realdst)=${called});
              MixMonitor(${WAV}/${fname}.wav,b,${monopt});

       }; 
};

_XXXXXX => {
        &recording(${CALLERID(number)},${EXTEN});
        Dial(SIP/rtk/${EXTEN});
        Hangup();
        }

Глобальные переменные определяют пути к файлам, а так же позволяют включить/выключить запись разговора.
Макрос recording принимает в качестве параметров номер звонящего и номер куда происходит вызов. Если запись включена, то пишется временный wav файл, перекодируется в mp3, а в MySQL табличку CDR падает имя файла.
Имя файла состоит из uniqueid-дата_время-ОтКогоВызов-КомуВызов, например:

1392597899.17572-2014-02-17-07_44-83843ZZZХХХ-32ХХZZ.mp3 

mp3 файлы за текущий день складываются в /records/mp3/
Каждую ночь скрипт в кроне распределяет записи разговоров в соответствующие дате папки

1 0 * * * /root/sh/mvrecords.sh

#!/bin/bash
ym=`date +%Y-%m -d "-1 day"`
ymd=`date +%Y-%m-%d -d "-1 day"`
mkdir -p /records/mp3/$ym/$ymd/
mv /records/mp3/*$ymd* /records/mp3/$ym/$ymd/

Скриншоты структуры папок.
Web интерфейс прослушивания записей звонков Asterisk
Web интерфейс прослушивания записей звонков Asterisk
Web интерфейс прослушивания записей звонков Asterisk

PHP

В файле include/functions.php прописана логика вывода кнопочки «скачать файл с разговором» и flash плеера в поле «Файл».

часть include/functions.php

	$recorded_file = $row['filename'];
	$mycalldate = substr("$calldate",0,10);
	$mycalldate_ym = substr("$calldate",0,7);
	$mydate = date("Y-m-d");
	

if ($mycalldate<$mydate){
if (file_exists("records/$mycalldate_ym/$mycalldate/$recorded_file")) {
echo " <td class="record_col"><a href="downloads.php?audio=records/$mycalldate_ym/$mycalldate/$recorded_file" title="Скачать файл с разговором"><img src="templates/images/sound.png"</a>
				<object type="application/x-shockwave-flash" data="include/player_mp3_maxi.swf" width="150" height="20">
                                <param movie=include/player_mp3_maxi.swf/> 
                                <param name=FlashVars value=mp3=records/$mycalldate_ym/$mycalldate/$recorded_file />     </td>n";
}
else {echo "    <td class="record_col">запись отсутствует</td>n"; }
}
else {
if (file_exists("records/$recorded_file")) {
echo " <td class="record_col"><a href="downloads.php?audio=records/$recorded_file" title="Скачать файл с разговором"><img src="templates/images/sound.png"</a>
				<object type="application/x-shockwave-flash" data="include/player_mp3_maxi.swf" width="150" height="20">
                                <param movie=include/player_mp3_maxi.swf/> 
				<param name=FlashVars value=mp3=records/$recorded_file />     </td>n";
}
else {echo "    <td class="record_col">запись отсутствует</td>n";}

}
}

В этом коде определяется в какой папке нужно искать файл записи разговора.
За текущий день ищем в /records/mp3, а за предыдущие в /records/mp3/ГОД-МЕСЯЦ/ГОД-МЕСЯЦ-ДЕНЬ/
Если файл найден не был, то мы увидем «запись отсутствует» в поле «Файл».

Так же не забываем указать реквизиты подключения к MySQL в include/config.inc.php

Занавес

На этом все!
Буду рад если мой труд окажется полезен.

ps
Сорцы доступны по ссылкам 1 и 2

Автор: FessAectan

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js