...

понедельник, 17 февраля 2014 г.

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



Поисковые системы выдают огромное количество результатов разной полезности на запрос вынесеный в заголовок.

На Хабрахабре такой статьи не нашел, а значит её нужно написать!

За основу я взял проект asterisk cdr viewer.

Перевел язык web интерфейса на великий могучий и «озвучил» его, т.е. добавил возможность прослушивать файлы записей разговоров в браузере, а так же скачивать их.

Количество полей фильтра сокращено до минимума, остались только самые необходимые.

Скриншоты, сорцы и подробное описание инсталяции уютно разместились под хабракатом.
Скриншоты web интерфейса



Логотип и ссылка на донат разработчикам остались на своих местах.

Поля переведены все, если потребуется вывести какое-либо поле как в оригинале, просто раскомментируйте его в templates/form.tpl.php


А так выглядит результат поиска по фильтру.

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


Готовим 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/


Скриншоты структуры папок.






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


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


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

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