Поисковые системы выдают огромное количество результатов разной полезности на запрос вынесенный в заголовок.
На Хабрахабре такой статьи не нашел, а значит её нужно написать!
За основу я взял проект asterisk cdr viewer.
Перевел язык web интерфейса на великий могучий и «озвучил» его, т.е. добавил возможность прослушивать файлы записей разговоров в браузере, а так же скачивать их.
Количество полей фильтра сокращено до минимума, остались только самые необходимые.
Скриншоты, сорцы и подробное описание инсталляции уютно разместились под хабракатом.
UPDATE_2016
Готов новый интерфейс.
Небольшой видео-гайд:
Подробнее здесь
Скриншоты web интерфейса
Логотип и ссылка на донат разработчикам остались на своих местах.
Поля переведены все, если потребуется вывести какое-либо поле как в оригинале, просто раскомментируйте его в templates/form.tpl.php
А так выглядит результат поиска по фильтру.
Каждый разговор можно скачать, либо прослушать через flash плеер.
Готовим MySQL
CDR нашего Asterisk должны писаться в MySQL базу, о том как это настроить можно прочесть здесь например ;).
В конец файла cdr_mysql.conf, в секцию [columns] добавим
alias realdst => realdst
alias filename => filename
Имя файла записи разговора пишется в поле 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
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
y=`date +%Y -d "-1 day"`
ym=`date +%Y-%m -d "-1 day"`
ymd=`date +%Y-%m-%d -d "-1 day"`
mkdir -p /records/$y/$ym/$ymd/
mv /records/mp3/*$ymd* /records/mp3/$y/$ym/$ymd/
В папке, где размещены файлы web интерфейса, необходимо создать симлинк на папку /records/mp3/
/var/www# ls -l
total 60
-rw-r--r-- 1 fessae fessae 182 Nov 19 2011 callrates.csv
drwxr-xr-x 3 fessae fessae 4096 Sep 26 2012 contrib
-rw-r--r-- 1 fessae fessae 1986 Dec 22 2012 download.php
-rw-r--r-- 1 fessae fessae 246 Sep 6 2013 downloads.php
drwxr-xr-x 4 fessae fessae 4096 Apr 15 20:48 include
-rw-r--r-- 1 fessae fessae 30384 Dec 2 20:21 index.php
lrwxrwxrwx 1 root root 13 Apr 15 20:48 records -> /records/mp3/
drwxr-xr-x 2 fessae fessae 4096 Feb 13 2013 style
drwxr-xr-x 3 fessae fessae 4096 Feb 18 21:07 templates
Скриншоты структуры папок.
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
UPD
Если нет аккаунта на Хабре, могу помочь на форуме — sysadminz.ru/index.php?topic=6592.0
UPD 2
Обнаружился небольшой глюк, если запись по каким-либо направлениям отключена(т.е. не пишется файл и не заполняется поле filename в базе), то флеш плеер все равно отображается, как-будто файл есть.
Для исправления нужно внести изменения в таблицу CDR, для поля filename выставить значение по умолчанию:
mysql -p
mysql> alter table cdr alter filename set default 'none';
mysql> describe cdr;
+-------------+-----------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------+------+-----+---------------------+----------------+
| id | int(9) unsigned | NO | PRI | NULL | auto_increment |
| calldate | datetime | NO | MUL | 0000-00-00 00:00:00 | |
| clid | varchar(80) | NO | | | |
| src | varchar(80) | NO | MUL | | |
| dst | varchar(80) | NO | MUL | | |
| dcontext | varchar(80) | NO | | | |
| channel | varchar(80) | NO | | | |
| dstchannel | varchar(80) | NO | | | |
| lastapp | varchar(80) | NO | | | |
| lastdata | varchar(80) | NO | | | |
| duration | int(11) | NO | | 0 | |
| billsec | int(11) | NO | | 0 | |
| disposition | varchar(45) | NO | | | |
| amaflags | int(11) | NO | | 0 | |
| accountcode | varchar(20) | NO | MUL | | |
| uniqueid | varchar(32) | NO | MUL | | |
| userfield | varchar(255) | NO | | | |
| filename | varchar(120) | YES | | none | |
+-------------+-----------------+------+-----+---------------------+----------------+
18 rows in set (0.00 sec)
mysql> \q
Bye
UPD 3(из шапки поста)
Камрад profiton (aka prog-it) существенно допилил тему.
Скрины:
Фичи:
Основные особенности
Полностью русский интерфейс
Обновленный дизайн
Всплывающие подсказки
Корректный экспорт записей в CSV файл
Правильный подсчет стоимости звонков (плагин)
Просмотр стоимости каждого звонка (плагин)
Возможность указать нетарифицируемый интервал для правильного подсчета стоимости
Возможность указать доп. тариф. Например: Стоимость первой минуты 1 руб., далее по 10 коп. (доп. тариф)
Имя файла записи звонка хранится в базе
Возможность прослушивания записи звонка через веб-интерфейс
На номер телефона можно нажать и получить о нем информацию
Плеер для прослушивания звонка подгружается через javascript, так что ничего не тормозит
Если записи звонков архивируются, будет предложено скачать запись
Если поступил факс, его также можно скачать
Файлы для скачивания отдаются скриптом с возможностью докачки
Папка для хранения записей может находиться в любой директории вашего сервера
И еще много всего...
Линк — prog-it.github.io/Asterisk-CDR-Viewer-Mod