Форум системных администраторов

IT => Телефония => Тема начата: FessAectan от 13 Февраля 2013, 11:30:14

Название: Статистика и прослушивание звонков asterisk
Отправлено: FessAectan от 13 Февраля 2013, 11:30:14
UPDATE - 0
Готов новый интерфейс

Подробнее - https://habrahabr.ru/post/310988/
https://habrahabr.ru/post/315910/

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Sgeon от 10 Марта 2013, 22:17:08
Напишите, плиз, как сделано. И главное, где можно раздобыть русский интерфейс? Спасибо.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 11 Марта 2013, 08:06:12
Sgeon, переводил я прямо в исходниках, сегодня причешу немного, выложу и расскажу как настроено.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Sgeon от 11 Марта 2013, 19:23:07
Вот спасибо, буду ждать. :good:
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Марта 2013, 06:02:18
Asterisk у меня на машине 192.168.0.18, эта web морда на 192.168.0.25.
Папка /records/mp3, с записями на машине с Asterisk, монтируется по nfs на web в /var/www/asterisk-cdr-viewer/records  (ro)
Структура папки на скриншотах ниже
Новые записи Asterisk кладет прямо в корень /records/mp3, далее скрипт в кроне растаскивает их как видно на скриншотах
(http://habrastorage.org/files/87f/da1/d08/87fda1d080084285aab104f7a6de1b98.png)
(http://habrastorage.org/files/8f1/43d/68f/8f143d68f12846c7aa9b9fbc4c5e54ff.png)(http://habrastorage.org/files/7bd/8ab/680/7bd8ab680bf845889622d23274e858d7.png)
код asterisk-cdr-viewer'а я переписал именно под такую структуру папок
если что-то не понятно будет спрашивай.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Sgeon от 12 Марта 2013, 19:15:11
Большое спасибо! Глянул по-быстрому, вроде пока все более-менее ясно. Сегодня-завтра попробую.  :beer:
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Марта 2013, 19:26:23
Большое спасибо!
спасибо говорить сюда :)
*картинку приаттачил )
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: jara от 14 Апреля 2013, 18:57:48
Уважаемый FessAectan, а можно поподробнеей расписать
что в extentions.conf и вашем скрипте править ?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 15 Апреля 2013, 07:09:58
jara, да в скрипте то ничего, если как у меня будете делать.
Я юзаю 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();
        }




Updated: 15 April 2013, 08:22:03

в сравнении со скринами выше я кое-что изменил, теперь еще юникайди пишется в название файла
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: buhta от 29 Октября 2013, 17:55:40
Добрый день.
а не могли бы подсказать , я к сожалению не профи....
как поправить конфиги, чтоб работало прослушивание при такой структуре каталогов
/var/spool/asterisk/monitor/ а тут по годам, месяцам, дням т.е.
/var/spool/asterisk/monitor/
/var/spool/asterisk/monitor/2013/
/var/spool/asterisk/monitor/2013/10/
/var/spool/asterisk/monitor/2013/10/29/
а структура имени файла 1383049597.974-time-15.26-from-11-to-15.wav

Большое СпасибО!!!!!!
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 30 Октября 2013, 06:20:49
buhta, на скорую руку исправил functions.inc.php
если что пиши
зы
переименовать в functions.inc.txt в functions.inc.php не забудь


Updated: 30 October 2013, 07:23:33

еще учти, что в dialplan'е должно писаться в CDR имя файла с записью разговора
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: buhta от 30 Октября 2013, 12:22:51
Добрый День!
огромное спасибо!

такой вопрос - имя в базу писаться должно полным? или только uniqueid
я у себя сделал чтоб писало   в таблицу - monfile  в таком формате
/var/spool/asterisk/monitor/2013/10/30/1383124577.4-time-13.16-from-793-to-666.wav

скрипт будет подхватывать?

и еще - сам плеер может воспроизводить wav файлы или он только mp3 кушает

Огромное спасибо за труды!
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 30 Октября 2013, 13:29:37
buhta, у меня вот такая запись в базу падает -
1382864334.714773-2013-10-27-15_58-507-89130ХХХХХХ.mp3
в поле filename,
т.е.
uniqueid-год_месяц_день-час_минута_кто-куда.mp3

выложи select из таблицы, типо такого
 select * from cdr where calldate like '2013-10%'  limit 1;
если время будет подправлю, но проще как у меня сделать  :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: buhta от 30 Октября 2013, 14:08:35
привел к виду как у Вас, в базу пишется,  скрипт подхватывает имя файла. сделал перекодировку налету в мп3...
вопрос- что не так делаю)))
если посмотреть что в браузер выдает - там полный путь к файлу с правильным именем.
но из браузера же не выдаст
<param name=FlashVars value=mp3=/var/spool/asterisk/monitor/2013/10/30/1383130793.0-2013-10-30-15_00-793-666.mp3 />
?
или я уже совсем запутался 



если кому интересно, как и мне было - сделал макрос перекодировки на лету, формирования имени файла и записи в базу... в базе надо добавить колонку filename, и в cdr_mysql добавить тоже.   у меня папки создает в кроне скрипт каждый день на день новую папку
[macroStartRecord]
exten => s,1,NoOp
same => n,Set(fname=/var/spool/asterisk/monitor/${STRFTIME(${EPOCH},,%Y/%m/%d/${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)})
same => n,Set(CDR(filename)=${STRFTIME(${EPOCH},,${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)}.mp3)
same => n,Set(MONITOR_OPT=nice -n 19 /usr/bin/lame -b 16 --silent "${fname}.wav" "${fname}.mp3" && rm -f "${fname}.wav")
same => n,MixMonitor(${fname}.wav,b,${MONITOR_OPT})
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 01 Ноября 2013, 18:49:09
завтра выходной, смогу глянуть поподробнее...
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 03 Ноября 2013, 10:55:37
но из браузера же не выдаст
эт почему не выдаст?
У меня же работает :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: celestes от 20 Января 2014, 11:30:07
добрый день. нужна помощь

у меня есть настроенный на запись разговоров в мп3 астериск, пишет в каталог /records/mp3
формат имени файла
Цитата
CALLFILENAME=${STRFTIME(${EPOCH},,%d-%m-%Y_%H:%M)}-${CALLERID(number)}-${EXTEN}-${UNIQUEID}
как должен выглядеть скрипт в functions.inc.php чтобы всё заработало?

у меня получилось сделать только если давать имя файлу по его uniqeid.

и еще у меня не проигрывается файл. кнопка play есть, а "бегунок" не идет.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 20 Января 2014, 11:43:13
добрый день. нужна помощь

у меня есть настроенный на запись разговоров в мп3 астериск, пишет в каталог /records/mp3
формат имени файла
Цитата
CALLFILENAME=${STRFTIME(${EPOCH},,%d-%m-%Y_%H:%M)}-${CALLERID(number)}-${EXTEN}-${UNIQUEID}
как должен выглядеть скрипт в functions.inc.php чтобы всё заработало?

у меня получилось сделать только если давать имя файлу по его uniqeid.

и еще у меня не проигрывается файл. кнопка play есть, а "бегунок" не идет.

Прицепи свой  functions.inc.php, покажи вывод результата запроса
select * from cdr where calldate like '2014-01-20%' limit 1;

+ в приложеном файле немного допиленная версия(добавил кнопочку рядом с плеером, для возможности скачать файл)



Updated: 20 January 2014, 12:53:57

ну и попробуй скачать свой файл и проиграть обычным проигрывателем )
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: celestes от 20 Января 2014, 12:52:44
а в какой файл там добавлена сама кнопка? у меня не появилась.
вот кусок из functions.inc для файлов с именем = uniqeid
Цитата
$recorded_file = $row['uniqueid'];
$mycalldate = substr("$calldate",0,10);
$mycalldate_ym = substr("$calldate",0,7);
$mydate = date("Y-m-d");
$from1 = $row['src'];
$to1 = $row['dst'];
/* ============================================================================ */


if (file_exists("mp3/$recorded_file.mp3"))

результат запроса
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 20 Января 2014, 16:04:41
Обрати внимание на
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});

       };
};
я пишу в отдельный столбец имя файла

и


buhta, у меня вот такая запись в базу падает -
1382864334.714773-2013-10-27-15_58-507-89130ХХХХХХ.mp3
в поле filename,
т.е.
uniqueid-год_месяц_день-час_минута_кто-куда.mp3

выложи select из таблицы, типо такого
 select * from cdr where calldate like '2013-10%'  limit 1;
если время будет подправлю, но проще как у меня сделать  :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 20 Января 2014, 17:40:25
Более подробно постараюсь объяснить.
В functions.inc.php есть строки
        $recorded_file = $row['filename'];
        $mycalldate = substr("$calldate",0,10);
        $mycalldate_ym = substr("$calldate",0,7);
        $mydate = date("Y-m-d");
1. $recorded_file = $row['filename'];
присваевает переменной recorded_file значение возвращенное запросом из базы(читай имя файла, ибо именно имя я пишу в поле filename таблицы cdr)
2. $mycalldate = substr("$calldate",0,10);
присваевает переменной mycalldate  дату  в формате Y-m-d, наприемр 2014-01-20($calldate берется из формы, там где вводишь date range)
3. $mycalldate_ym = substr("$calldate",0,7);
тоже самое что и п.2, но в формате Y-m
4. $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";}

}
}


этот кусок кода разжевывать не буду
суть в том что если дата введенная в форме меньше текущей, то ищем записи в уже отсортированных скриптом в кроне папках
crontab -l|grep -v "^#"
1 0 * * * /root/sh/mvrecords.sh
cat /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/
иначе ищем файлы в текущей папке(в records/)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: celestes от 28 Января 2014, 10:33:58
я в скрипте разобрался, но в силу слабого знания синтаксиса языка были проблемы с допиливанием)
сейчас всё сделал, спасибо за помощь
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: ck80 от 28 Января 2014, 14:12:12
FessAectan, помогите добавить кнопку скачивания. Я ваш конфиг немного кастомизировал, т.к. у меня пути до файлов другие. Но вот как добавить кнопочку не соображу:

Я так понимаю её код вот сюда нужно добавить:
if (file_exists("/var/spool/asterisk/monitor/$mydate_y/$mydate_m/$mydate_d/$recorded_file")) {
echo " <td class="record_col"><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=/var/spool/asterisk/monitor/$mydate_y/$mydate_m/$mydate_d/$recorded_file />
                                                                asdf </td>n";
                                                                }
                                                                else {echo "    <td class="record_col"></td>n"; }
                                                                }
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 28 Января 2014, 17:40:26
ck80, в первом сообщении треда файлик прикреплен, скачайте его, там уже все добавлено.


Updated: 28 January 2014, 18:40:47

celestes, пожалуйста.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: ck80 от 29 Января 2014, 05:13:57
В архиве нет файла functions.inc.php
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 29 Января 2014, 05:56:31
ck80, да, промахнулся немного.
Обновил первый пост, перекачайте оттуда.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 29 Января 2014, 05:59:53
сюда тоже выложу
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 06 Марта 2014, 16:41:13
Всем доброго времени суток!

Помогите пожалуйста!

взял за основу:
Цитата
[macroStartRecord]
exten => s,1,NoOp
same => n,Set(fname=/var/spool/asterisk/monitor/${STRFTIME(${EPOCH},,%Y/%m/%d/${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)})
same => n,Set(CDR(filename)=${STRFTIME(${EPOCH},,${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)}.mp3)
same => n,Set(MONITOR_OPT=nice -n 19 /usr/bin/lame -b 16 --silent "${fname}.wav" "${fname}.mp3" && rm -f "${fname}.wav")
same => n,MixMonitor(${fname}.wav,b,${MONITOR_OPT})

Не работает запись. Конфигурация:
GoIP4(101) -> asterisk -> SIP-телефон(200).
GoIP настроен так, чтоб звонить на номер 200.

extensions.conf
Цитата
[night]
exten => 200,1,Macro(StartRecord,200,SIP/200)
exten => 200,n,Hangup

[from-goip4]
include => day,09:00-19:59,mon-fri,*,*
include => night

[macro-StartRecord]
exten => s,1,NoOp
same => n,Set(fname=/records/mp3/${STRFTIME(${EPOCH},,%Y-%m/%Y-%m-%d/${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)})
same => n,Set(CDR(filename)=${STRFTIME(${EPOCH},,${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)}.mp3)
same => n,Set(MONITOR_OPT=nice -n 19 /usr/bin/lame -b 16 --silent "${fname}.wav" "${fname}.mp3" && rm -f "${fname}.wav")
same => n,MixMonitor(${fname}.wav,b,${MONITOR_OPT})

В итоге, при поступлении звонка с goip соединение происходит и тут же обрывается(астериск ложит трубку), лог:
Цитата
== Using SIP RTP CoS mark 5
    -- Executing [200@from-goip4:1] Answer("SIP/101-0000007d", "") in new stack
    -- Executing [200@from-goip4:2] Macro("SIP/101-0000007d", "StartRecord,200,SIP/200") in new stack
    -- Executing [s@macro-StartRecord:1] NoOp("SIP/101-0000007d", "") in new stack
    -- Executing [s@macro-StartRecord:2] Set("SIP/101-0000007d", "fname=/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200") in new stack
    -- Executing [s@macro-StartRecord:3] Set("SIP/101-0000007d", "CDR(filename)=1394112398.125-2014-03-06-20_26-73832269756-200.mp3") in new stack
    -- Executing [s@macro-StartRecord:4] Set("SIP/101-0000007d", "MONITOR_OPT=nice -n 19 /usr/bin/lame -b 16 --silent "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav" "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.mp3" && rm -f "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav"") in new stack
    -- Executing [s@macro-StartRecord:5] MixMonitor("SIP/101-0000007d", "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav,b,nice -n 19 /usr/bin/lame -b 16 --silent "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav" "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.mp3" && rm -f "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav"") in new stack
    -- Executing [200@from-goip4:3] Hangup("SIP/101-0000007d", "") in new stack
  == Spawn extension (from-goip4, 200, 3) exited non-zero on 'SIP/101-0000007d'
  == Begin MixMonitor Recording SIP/101-0000007d
  == Executing [nice -n 19 /usr/bin/lame -b 16 --silent "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav" "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.mp3" && rm -f "/records/mp3/2014-03/2014-03-06/1394112398.125-2014-03-06-20_26-73832269756-200.wav"]
  == End MixMonitor Recording SIP/101-0000007d

Помогите победить?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 06 Марта 2014, 17:32:25
lamobot, попробуй без макроса сперва, напрямую в екстеншен вставь строки для записи
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 06 Марта 2014, 20:34:49
Эммм... Что именно в экстеншн вставить? Содержимое макроса?
Ник соответствует познаниям в астериске.))
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 06 Марта 2014, 21:25:28
lamobot, сразу не глянул что-то.
Так у тебя так и прописано - трубку класть после макроса записи.
[night]
exten => 200,1,Macro(StartRecord,200,SIP/200)
exten => 200,n,Hangup
у тебя
[from-goip4]
include => day,09:00-19:59,mon-fri,*,*
include => night
А в приведенном выше листинге видно, что звонишь ты как раз после 19:59
Поэтому и ложится трубка
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 07 Марта 2014, 07:03:39
Для таких же ботов как и я - после макроса нужно вписать диал и т.д.

Теперь другой вопрос, cdr viewer не видит файлы записи.
Путь к файлам
Цитата
/records/mp3/2014-03/2014-03-07
Файлы есть, в базе имена вида 1394163720
Сайт
Цитата
<tr class="record">
    <td class="record_col"><abbr title="UniqueID: 1394163720.150">2014-03-07 10:42:00</abbr></td>
    <td class="record_col">запись отсутствует</td>
    <td class="record_col"><abbr title="Caller*ID: &quot;73832699849&quot; &lt;73832699849&gt;">73832699849</abbr></td>
    <td class="record_col"><abbr title="Destination Context: from-goip4">200</abbr></td>
    <td class="record_col"><abbr title="Application: Dial(SIP/200,60,tTm(manual))">Dial</abbr></td>
    <td class="record_col"><abbr title="Channel: SIP/101-00000096">SIP</abbr></td>
    <td class="record_col"><abbr title="AMA Flag: DEFAULT">ANSWERED</abbr></td>
    <td class="record_col"><abbr title="Billing Duration: 02:07">02:18</abbr></td>
    <td class="record_col"></td>
    <td class="record_col"></td>
    <td></td>

Полное название файла
Цитата
1394163720.150-2014-03-07-10_42-73832699849-200.mp3

Файлы по указанному пути лежат, проигрываются нормально(на винде).

Что опять не так?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Марта 2014, 07:28:33
asterick cdr viewer взят с офф сайта или с моими изменениями(файл приаттачен в первом посте)?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 07 Марта 2014, 07:37:38
Твой.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Марта 2014, 07:41:50
Теперь другой вопрос, cdr viewer не видит файлы записи.
пишет:
Цитата
запись отсутствует
?
Если в браузере по пути пройти - ip_твоего_сервера/records/mp3/2014-03/2014-03-07, то видно файлы?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 07 Марта 2014, 08:12:53
Теперь да, но толку - нуль!

У меня WEB интерфейс висит на ип_адрес_сервера/asterisk-cdr
Создал сим линки на ип_адрес_сервера/asterisk-cdr/records и ип_адрес_сервера/records.
Что именно создать надо было не понял, создал обе линки.

Полный путь
/var/www/asterisk-cdr/records/mp3/2014-03/2014-03-07
ну и
/var/www/records/mp3/2014-03/2014-03-07
оба работают.

Напомню, а по факту пишется в /records/mp3/2014-03/2014-03-07
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Марта 2014, 09:07:23
покажи вывод команды ls -la из /var/www/asterisk-cdr/


Updated: 07 March 2014, 10:12:02

кстати, статью из первого поста читал?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 07 Марта 2014, 09:31:35
Цитата
root@asterisk:~# ls -la /var/www/asterisk-cdr/
итого 64
drwxr-xr-x 6 root root  4096 марта  7 12:09 .
drwxr-xr-x 4 root root  4096 марта  7 12:09 ..
-rwxr-xr-x 1 root root   182 нояб. 19  2011 callrates.csv
drwxr-xr-x 3 root root  4096 марта  6 18:58 contrib
-rwxr-xr-x 1 root root   246 сент.  6 12:28 downloads.php
drwxr-xr-x 4 root root  4096 марта  7 11:09 include
-rwxr-xr-x 1 root root 30384 дек.   2 20:21 index.php
lrwxrwxrwx 1 root root     9 марта  7 12:09 records -> /records/
drwxr-xr-x 2 root root  4096 марта  6 18:58 style
drwxr-xr-x 3 root root  4096 марта  6 18:58 templates

Не очень внимательно, пробежал глазами и пошел на этот форум.))
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Марта 2014, 10:48:31
симлинк смотрит
records -> /records/
а должен на /records/mp3
ps
how-to пишут, чтобы их читали  ;)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: lamobot от 07 Марта 2014, 11:05:51
Прочитал внимательно про include/functions.php, теперь понятно.
Исправил симлинк и все равно не поддаётся...(((((

Есть еще идеи?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Марта 2014, 11:28:39
идей пока нет.
если не получится исправить самостоятельно, могу помочь через тимвьювер, например
но не сегодня
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: yur4ik от 17 Марта 2014, 15:21:33
Добрый день .
А возможно ли добавить функцию "скачать запись" и "прослушать запись" к готовой сборке FreePBX 2.11 ? Дело в том что значок записи в CDR существует , вот только работает "каряво" , то модуль загрузить не удалось , то еще что то и возможности скачать файл вообще нет .
Заранее спасибо .   
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 17 Марта 2014, 17:07:58
yur4ik, добрый.
Думаю возможно, только вот мне это делать неинтересно.
Опишите если получится.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: morgoved от 09 Апреля 2014, 15:34:47
не получается заставить такое - нужно просто копировать звонки на шару - при записи туда напрямую несрабатывает
где я накосячил?
[macro-StartRecord]
exten => s,1,NoOp
same => n,Set(fname=/var/tmp/h/RCDFL/${STRFTIME(${EPOCH},,%Y-%m/%Y-%m-%d/${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)})
same => n,Set(catname=/mnt/asterisk/RCDFL/${STRFTIME(${EPOCH},,%Y-%m/%Y-%m-%d/))
same => n,Set(fnamenew=/mnt/asterisk/RCDFL/RCDFL/${STRFTIME(${EPOCH},,%Y-%m/%Y-%m-%d/${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)})
same => n,Set(CDR(filename)=${STRFTIME(${EPOCH},,${CDR(uniqueid)}-%Y-%m-%d-%H_%M)}-${CALLERID(num)}-${CDR(dst)}.mp3)
same => n,Set(MONITOR_OPT=nice -n 19 /usr/bin/lame -b 16 --silent "${fname}.wav" "${fname}.mp3" && mkdir -p  "${catname}" && cp  "${fname}.mp3"  "${fnamenew}.mp3" && rm -f "${fname}.wav" && rm -f "${fname}.mp3")
same => n,MixMonitor(${fname}.wav,b,${MONITOR_OPT})

ВЫВОД
"SIP/8173-00000048", "MONITOR_OPT=nice -n 19 /usr/bin/lame -b 16 --silent "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav" "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3" && mkdir -p  "/mnt/asterisk/RCDFL/2014-04/2014-04-09/" && cp  "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3"  "/mnt/asterisk/RCDFL/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3" && rm -f "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav" && rm -f "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3"") in new stack
    -- Executing [s@macro-StartRecord:7] MixMonitor("SIP/8173-00000048", "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav,b,nice -n 19 /usr/bin/lame -b 16 --silent "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav" "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3" && mkdir -p  "/mnt/asterisk/RCDFL/2014-04/2014-04-09/" && cp  "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3"  "/mnt/asterisk/RCDFL/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3" && rm -f "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav" && rm -f "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3"") in new stack
    -- Executing [84952211111@call045:2] Dial("SIP/8173-00000048", "IAX2/ServerUAkiev/84952211111,,r") in new stack
    -- Called IAX2/ServerUAkiev/84952211111
  == Begin MixMonitor Recording SIP/8173-00000048
    -- Call accepted by 192.168.128.22 (format ulaw)
    -- Format for call is (ulaw)
    -- IAX2/ServerUAkiev-2342 is ringing
    -- IAX2/ServerUAkiev-2342 is ringing
    -- IAX2/ServerUAkiev-2342 answered SIP/8173-00000048
    -- Hungup 'IAX2/ServerUAkiev-2342'
  == Spawn extension (callua045, 84952211111, 2) exited non-zero on 'SIP/8173-00000048'
  == MixMonitor close filestream (mixed)
  == Executing [nice -n 19 /usr/bin/lame -b 16 --silent "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav" "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3" && mkdir -p  "/mnt/asterisk/RCDFL/2014-04/2014-04-09/" && cp  "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3"  "/mnt/asterisk/RCDFL/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3" && rm -f "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.wav" && rm -f "/var/tmp/h/RCDFL/2014-04/2014-04-09/1397060689.95-2014-04-09-20_24-8173-84952211111.mp3"]
  == End MixMonitor Recording SIP/8173-00000048
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 09 Апреля 2014, 23:02:52
morgoved, в тег code заверни выхлоп, читать неудобно =(


Updated: 10 April 2014, 00:04:12

сходу могу предположить что с правами напутано что-то
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: morgoved от 10 Апреля 2014, 10:42:48
справами все ок ибо отдельно в впапки все пишется..
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 10 Апреля 2014, 13:27:31
не совсем понял, сначала пишешь -
при записи туда напрямую несрабатывает
потом -
справами все ок ибо отдельно в впапки все пишется..

Может не стоит в диалплане такие конструкции пользовать и скриптом в кроне переносить куда нужно файлы?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: SoH от 11 Мая 2014, 23:09:34
Вечер добрый.

Столкнулся с такой проблемой. Вроде бы все настроил. Имя файла корректно пишется в базу "1399836811.32-2014-05-11-23_33-7004-7000.mp3" и из вебморды есть кнопочка проиграть файл.
(http://s1.ipicture.ru/uploads/20140512/JSVTFnRL.jpg)
 Вот только есть проблема, при нажатии кнопки проиграть ничего не происходит, как-будто флеша нет, хотя он есть. В чем грабли? Что я не так делаю?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Мая 2014, 06:06:59
SoH, привет.
Судя по скрину у тебя не самая последняя версия веб интерфейса.
Скачай из первого сообщения последнюю.
Если открыть в браузере http://IP_ASTERISK/records то файлы видно?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: SoH от 12 Мая 2014, 09:45:21
Я не совсем понял, как расшаривать эти записи? Через samba или при помощи Apache?
Я думал, что ничего расшаривать не надо, думал, что просто укажу полный путь в
<param name=FlashVars value=mp3=/var/records/mp3/$recorded_file />
if (file_exists("/var/records/mp3/$recorded_file"))

Видимо я не знаток php. Подскажите, куда копать?
Что и где расшарить?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Мая 2014, 09:50:10
SoH, а статью на хабре внимательно читал ? =)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: SoH от 12 Мая 2014, 10:48:28
Блин. То ли я слепой, то ли еще что-то. В упор не вижу в статье ничего про шару /records  :dash: Ткните пальцем пожалуйста.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Мая 2014, 10:58:16
SoH, В папке, где размещены файлы 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

ps
моя неправда, забыл это в статье указать


Updated: 12 May 2014, 11:59:36

статью так же обновил
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: SoH от 12 Мая 2014, 12:30:20
Все! Спасибо. Все заработало, скачал более новую версию.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Мая 2014, 13:44:04
SoH, плюсани тогда уж, ради приличия =)
* палец вверх под ником, на зеленом фоне
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: serg_1984 от 16 Мая 2014, 09:44:07
Добрый день. Возникла следующая проблема:
Вроде как все работает. И файлы пишутся в базу. И структура папок совпадает.
Но на веб выводит кнопки скачивания и прослушивания там где их быть не должно.
То есть файла нет и он должен выдать что запись отсутствует, но все равно предлагает его скачать и прослушать.
В чем может быть проблема?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 16 Мая 2014, 11:01:54
serg_1984, приветствую.
Посмотри в базе, соответствует ли поле filename совершенному звонку, т.е. правильный ли uniqueid, src, dst...
Так же нужен вывод ls -la /path_to_acdr_web_interface/records
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: serg_1984 от 20 Мая 2014, 11:05:27
Добрый день. По базе посмотрел, информация по звонкам (поля в БД) совпадает.
Вывод ls -la /var/www/asterisk-cdr-viewer/records
lrwxrwxrwx 1 root root 13 мая   16 11:29 /var/www/asterisk-cdr-viewer/records -> /records/mp3/


Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 20 Мая 2014, 12:49:02
serg_1984, если в браузере вбить http://192.168.1.7/acdr/records
то файлы видать?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: serg_1984 от 20 Мая 2014, 12:54:11
Да открывается. Файлы видно.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 20 Мая 2014, 17:35:07
Завтра буду в скайпе, стучи, будет возможность - разберемся.
А так мы еще неделю переписываться будем, потом просто сюда решение выложишь, для тех кто еще придет.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: serg_1984 от 20 Мая 2014, 20:39:17
Ок. Спасибо.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 22 Мая 2014, 07:09:03
Обнаружился небольшой глюк, если запись по каким-либо направлениям отключена(т.е. не пишется файл и не заполняется поле 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
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: serg_1984 от 22 Мая 2014, 07:42:22
Огромное спасибо.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: dmfox00 от 11 Ноября 2014, 09:05:55
Доброго.

Не понимать, как установить данное действие :)

Не могли бы привести мануал?

Благодарю.

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 11 Ноября 2014, 14:21:32
dmfox00,
Все подробности читайте на Хабре, таки запилил хау-ту
[url]http://habrahabr.ru/post/212815/[/url]

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: dmfox00 от 12 Ноября 2014, 11:55:32
dmfox00,
Все подробности читайте на Хабре, таки запилил хау-ту
[url]http://habrahabr.ru/post/212815/[/url]





Половина инфо устарела и не открывается.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: vitaliy от 12 Ноября 2014, 18:47:37
Добрый день!
Возник вопрос - файлы пишутся, даже если NOANSWER

-rw-r--r-- 1 root root 10944 Nov 12 18:40 1415806847.45-2014-11-12-18_40-1556-5001.mp3
-rw-r--r-- 1 root root   864 Nov 12 18:42 1415806949.47-2014-11-12-18_42-1556-5000.mp3
-rw-r--r-- 1 root root   864 Nov 12 18:42 1415806972.48-2014-11-12-18_42-1556-5001.mp3
-rw-r--r-- 1 root root 15552 Nov 12 18:43 1415807032.50-2014-11-12-18_43-1556-5010.mp3
-rw-r--r-- 1 root root   864 Nov 12 18:44 1415807058.52-2014-11-12-18_44-1556-5010.mp3

3 файла по 864 - пустые
Как от этого избавиться?


Логи астера при звонке

  == Using SIP RTP CoS mark 5
    -- Executing [5001@spb_lomo_inc:1] Gosub("SIP/SPB_Lomo-00000037", "recording,~~s~~,1(1556,5001)") in new stack
    -- Executing [~~s~~@recording:1] MSet("SIP/SPB_Lomo-00000037", "LOCAL(calling)=1556") in new stack
    -- Executing [~~s~~@recording:2] MSet("SIP/SPB_Lomo-00000037", "LOCAL(called)=5001") in new stack
    -- Executing [~~s~~@recording:3] GotoIf("SIP/SPB_Lomo-00000037", "1?4:9") in new stack
    -- Goto (recording,~~s~~,4)
    -- Executing [~~s~~@recording:4] Set("SIP/SPB_Lomo-00000037", "fname=1415807474.55-2014-11-12-18_51-1556-5001") in new stack
    -- Executing [~~s~~@recording:5] Set("SIP/SPB_Lomo-00000037", "monopt=nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav"  "/records/mp3/1415807474.55-2014-11-12-18_51-1556-5001.mp3" && rm -f "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav" && chmod o+r "/records/mp3/1415807474.55-2014-11-12-18_51-1556-5001.mp3"") in new stack
    -- Executing [~~s~~@recording:6] Set("SIP/SPB_Lomo-00000037", "CDR(filename)=1415807474.55-2014-11-12-18_51-1556-5001.mp3") in new stack
    -- Executing [~~s~~@recording:7] Set("SIP/SPB_Lomo-00000037", "CDR(realdst)=5001") in new stack
    -- Executing [~~s~~@recording:8] MixMonitor("SIP/SPB_Lomo-00000037", "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav,b,nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav"  "/records/mp3/1415807474.55-2014-11-12-18_51-1556-5001.mp3" && rm -f "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav" && chmod o+r "/records/mp3/1415807474.55-2014-11-12-18_51-1556-5001.mp3"") in new stack
    -- Executing [~~s~~@recording:9] NoOp("SIP/SPB_Lomo-00000037", "Finish if_recording_20") in new stack
    -- Executing [~~s~~@recording:10] Return("SIP/SPB_Lomo-00000037", "") in new stack
    -- Executing [5001@spb_lomo_inc:2] Dial("SIP/SPB_Lomo-00000037", "SIP/5001") in new stack
  == Begin MixMonitor Recording SIP/SPB_Lomo-00000037
  == Using SIP RTP CoS mark 5
    -- Called SIP/5001
    -- SIP/5001-00000038 is ringing
    -- SIP/5001-00000038 is ringing
  == Spawn extension (spb_lomo_inc, 5001, 2) exited non-zero on 'SIP/SPB_Lomo-00000037'
  == MixMonitor close filestream (mixed)
  == Executing [nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav"  "/records/mp3/1415807474.55-2014-11-12-18_51-1556-5001.mp3" && rm -f "/records/wav/1415807474.55-2014-11-12-18_51-1556-5001.wav" && chmod o+r "/records/mp3/1415807474.55-2014-11-12-18_51-1556-5001.mp3"]
  == End MixMonitor Recording SIP/SPB_Lomo-00000037
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: vitaliy от 13 Ноября 2014, 13:35:19
Добрый день!

Возник еще один вопрос.
Ситуация - номер 1444 звонит на 5000, они разговаривают, после чего 5000 переводит разговор на 5001.

Результат:
в вэб-интерфейсе появляются 2 записи:
1) звонок 1444 -> 5000
2) звонок 5000 -> 5001

Записи перепутаны местами, т.е. в п.1 запись 5000 -> 5001, а в п.2 1444 -> 5000

база CDR:
92	2014-11-13 13:23:58	"1444" <1444>	1444	5000			1415874238.79		1415874254.81-2014-11-13-13_24-5000-5001.mp3
93 2014-11-13 13:24:14 "5000" <5000> 5000 5001 1415874254.81 1415874238.79-2014-11-13-13_23-1444-5000.mp3
здесь видно, что макрос перепутал имена записей.

Логи астериска:

 == Using SIP RTP CoS mark 5
    -- Executing [5000@spb_lomo_inc:1] StopMixMonitor("SIP/SPB_Lomo-0000004f", "") in new stack
    -- Executing [5000@spb_lomo_inc:2] Gosub("SIP/SPB_Lomo-0000004f", "recording,~~s~~,1(1444,5000)") in new stack
    -- Executing [~~s~~@recording:1] MSet("SIP/SPB_Lomo-0000004f", "LOCAL(calling)=1444") in new stack
    -- Executing [~~s~~@recording:2] MSet("SIP/SPB_Lomo-0000004f", "LOCAL(called)=5000") in new stack
    -- Executing [~~s~~@recording:3] GotoIf("SIP/SPB_Lomo-0000004f", "1?4:9") in new stack
    -- Goto (recording,~~s~~,4)
    -- Executing [~~s~~@recording:4] Set("SIP/SPB_Lomo-0000004f", "fname=1415874238.79-2014-11-13-13_23-1444-5000") in new stack
    -- Executing [~~s~~@recording:5] Set("SIP/SPB_Lomo-0000004f", "monopt=nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav"  "/records/mp3/1415874238.79-2014-11-13-13_23-1444-5000.mp3" && rm -f "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav" && chmod o+r "/records/mp3/1415874238.79-2014-11-13-13_23-1444-5000.mp3"") in new stack
    -- Executing [~~s~~@recording:6] Set("SIP/SPB_Lomo-0000004f", "CDR(filename)=1415874238.79-2014-11-13-13_23-1444-5000.mp3") in new stack
    -- Executing [~~s~~@recording:7] Set("SIP/SPB_Lomo-0000004f", "CDR(realdst)=5000") in new stack
    -- Executing [~~s~~@recording:8] MixMonitor("SIP/SPB_Lomo-0000004f", "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav,b,nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav"  "/records/mp3/1415874238.79-2014-11-13-13_23-1444-5000.mp3" && rm -f "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav" && chmod o+r "/records/mp3/1415874238.79-2014-11-13-13_23-1444-5000.mp3"") in new stack
    -- Executing [~~s~~@recording:9] NoOp("SIP/SPB_Lomo-0000004f", "Finish if_recording_23") in new stack
    -- Executing [~~s~~@recording:10] Return("SIP/SPB_Lomo-0000004f", "") in new stack
    -- Executing [5000@spb_lomo_inc:3] Dial("SIP/SPB_Lomo-0000004f", "SIP/5000") in new stack
  == Using SIP RTP CoS mark 5
    -- Called SIP/5000
  == Begin MixMonitor Recording SIP/SPB_Lomo-0000004f
    -- SIP/5000-00000050 is ringing
    -- SIP/5000-00000050 answered SIP/SPB_Lomo-0000004f
    -- Started music on hold, class 'default', on SIP/SPB_Lomo-0000004f
  == Using SIP RTP CoS mark 5
    -- Executing [5001@internal:1] StopMixMonitor("SIP/5000-00000051", "") in new stack
    -- Executing [5001@internal:2] Gosub("SIP/5000-00000051", "recording,~~s~~,1(5000,5001)") in new stack
    -- Executing [~~s~~@recording:1] MSet("SIP/5000-00000051", "LOCAL(calling)=5000") in new stack
    -- Executing [~~s~~@recording:2] MSet("SIP/5000-00000051", "LOCAL(called)=5001") in new stack
    -- Executing [~~s~~@recording:3] GotoIf("SIP/5000-00000051", "1?4:9") in new stack
    -- Goto (recording,~~s~~,4)
    -- Executing [~~s~~@recording:4] Set("SIP/5000-00000051", "fname=1415874254.81-2014-11-13-13_24-5000-5001") in new stack
    -- Executing [~~s~~@recording:5] Set("SIP/5000-00000051", "monopt=nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav"  "/records/mp3/1415874254.81-2014-11-13-13_24-5000-5001.mp3" && rm -f "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav" && chmod o+r "/records/mp3/1415874254.81-2014-11-13-13_24-5000-5001.mp3"") in new stack
    -- Executing [~~s~~@recording:6] Set("SIP/5000-00000051", "CDR(filename)=1415874254.81-2014-11-13-13_24-5000-5001.mp3") in new stack
    -- Executing [~~s~~@recording:7] Set("SIP/5000-00000051", "CDR(realdst)=5001") in new stack
    -- Executing [~~s~~@recording:8] MixMonitor("SIP/5000-00000051", "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav,b,nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav"  "/records/mp3/1415874254.81-2014-11-13-13_24-5000-5001.mp3" && rm -f "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav" && chmod o+r "/records/mp3/1415874254.81-2014-11-13-13_24-5000-5001.mp3"") in new stack
    -- Executing [~~s~~@recording:9] NoOp("SIP/5000-00000051", "Finish if_recording_23") in new stack
    -- Executing [~~s~~@recording:10] Return("SIP/5000-00000051", "") in new stack
    -- Executing [5001@internal:3] Dial("SIP/5000-00000051", "SIP/5001") in new stack
  == Using SIP RTP CoS mark 5
    -- Called SIP/5001
  == Begin MixMonitor Recording SIP/5000-00000051
    -- SIP/5001-00000052 is ringing
    -- SIP/5001-00000052 is ringing
    -- SIP/5001-00000052 answered SIP/5000-00000051
    -- Stopped music on hold on SIP/SPB_Lomo-0000004f
  == Spawn extension (spb_lomo_inc, 5000, 3) exited non-zero on 'SIP/5000-00000051<ZOMBIE>'
  == MixMonitor close filestream (mixed)
  == Spawn extension (internal, 5001, 3) exited non-zero on 'SIP/SPB_Lomo-0000004f'
  == MixMonitor close filestream (mixed)
  == Executing [nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav"  "/records/mp3/1415874254.81-2014-11-13-13_24-5000-5001.mp3" && rm -f "/records/wav/1415874254.81-2014-11-13-13_24-5000-5001.wav" && chmod o+r "/records/mp3/1415874254.81-2014-11-13-13_24-5000-5001.mp3"]
  == Executing [nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav"  "/records/mp3/1415874238.79-2014-11-13-13_23-1444-5000.mp3" && rm -f "/records/wav/1415874238.79-2014-11-13-13_23-1444-5000.wav" && chmod o+r "/records/mp3/1415874238.79-2014-11-13-13_23-1444-5000.mp3"]
  == End MixMonitor Recording SIP/5000-00000051
  == End MixMonitor Recording SIP/SPB_Lomo-0000004f


Как можно это поправить? Заранее спасибо
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 14 Ноября 2014, 05:17:59
Половина инфо устарела и не открывается.
И что же там устарело и не открывается?



Updated: 14 November 2014, 05:19:14

Добрый день!
Возник вопрос - файлы пишутся, даже если NOANSWER
Покажите Ваш диалплан.


Updated: 14 November 2014, 05:21:05

Как можно это поправить? Заранее спасибо
Спасибо за багу, отпишусь когда появится возможность потестить.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: vitaliy от 14 Ноября 2014, 15:19:54
Покажите Ваш диалплан.

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});

       }
}


context Local {
        _5XXX => {
                 &recording (${CALLERID(number)},${EXTEN});
                 Dial(SIP/${EXTEN});
                 Hangup ();
                }
}
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: dmfox00 от 19 Ноября 2014, 12:25:36
Половина инфо устарела и не открывается.
И что же там устарело и не открывается?


Не туда на автомате написал  :D  :beer:
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: RusLanR от 25 Ноября 2014, 09:02:05
Прочитал статью на хабре, к сожалению ссылка на "CDR нашего Asterisk должны писаться в MySQL базу, о том как это настроить можно прочесть здесь например ;)." мёртвая. Можно как то обновить?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 25 Ноября 2014, 10:16:13
RusLanR, поправил ссылку.
http://blog.thecall.ru/page/asterisk-18-cdr-v-mysql-cdr_adaptive_odbc
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: RusLanR от 02 Декабря 2014, 12:25:00
[url]http://blog.thecall.ru/page/asterisk-18-cdr-v-mysql-cdr_adaptive_odbc[/url]

Спасиб.

Сделал немного подругому - Апач пишет напрямую в Mysql минуя odbc.  А вот с Веб мордой понять не могу можно получать данные минуя odbc или не получится?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 03 Декабря 2014, 02:07:58
Сделал немного подругому - Апач пишет напрямую в Mysql минуя odbc.  А вот с Веб мордой понять не могу можно получать данные минуя odbc или не получится?
Не понятно, что у Вас Апач пишет в MySQL ?
А вот веб морда, как раз таки, получает доступ к MySQL без odbc, через php-mysql ЕМНИП
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: RusLanR от 03 Декабря 2014, 07:02:15
С Апачем отпечатался :), Астериск конечно.
По ссылке смотрел настройки, там вроде через odbc, у меня фряха и таких библиотек нет -
/etc/odbcinst.ini
[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout =
CPReuse =



Updated: 03 December 2014, 14:19:13

Можно как то подробнее описать настройки, что нужно сделать чтобы форма php брала данные из mysql?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 04 Декабря 2014, 02:03:16
Можно как то подробнее описать настройки, что нужно сделать чтобы форма php брала данные из mysql?
да там делать то особо нечего, в конфиг в папке include прописать доступы к базе и все
у меня фряха и таких библиотек нет -
не подскажу, на FreeBSD Asterisk поднимал, но он был исключительно для звонков, без каких-либо обвесов
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: RusLanR от 04 Декабря 2014, 08:13:18
и ещё как поправить php-шку чтобы он всегда искал файлы в отсортированных папках, т.к. у меня сортируются сразу.


Updated: 04 December 2014, 11:26:14

Отвечу сам, т.к. файлы у меня сжимаются в mp3 сразу и раскладываются по папочкам то возникла необходимость отредактировать файл - functions.inc.php

было
 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";
        }
    }

стало
        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="movie" value="include/player_mp3_maxi.swf"/>
                    <param name="FlashVars" value="mp3=records/$mycalldate_ym/$mycalldate/$recorded_file" /></object>     </td>n";
        } else {echo "    <td class="record_col">запись отсутствует</td>n";
        }
Дополнительно пофиксили ошибку при просмотре из IE :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 04 Декабря 2014, 14:31:42
Дополнительно пофиксили ошибку при просмотре из IE
так делитесь =)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: RusLanR от 04 Декабря 2014, 14:57:41
Выше ведь написал
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 05 Декабря 2014, 05:29:12
RusLanR, ок
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: RusLanR от 08 Декабря 2014, 12:19:03
Обнаружил косячок такой - если выбрать "Количество строк" меньше чем их отображается в детализации то он просто остальные скрывает и не показывает :(
К примеру пишу Количество строк:5, соответственно - "Детализация звонков - найдены 5 из 10 звонков " как посмотреть остальные непонятно.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 09 Декабря 2014, 06:59:31
Обнаружил косячок такой - если выбрать "Количество строк" меньше чем их отображается в детализации то он просто остальные скрывает и не показывает :(
К примеру пишу Количество строк:5, соответственно - "Детализация звонков - найдены 5 из 10 звонков " как посмотреть остальные непонятно.
Это не бага, это фича.
Сказали показать только 5 строк - он Вам и показал.
При поиске какого-то звонка фильтруйте вывод по дополнительным критериям.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: vitaliy от 25 Декабря 2014, 16:22:20
FessAectan,
а по поводу перемены файлов записей, о которой я писал выше, ни к какому результату не пришли?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 26 Декабря 2014, 08:56:46
vitaliy, к сожалению я совсем не располагаю временем для этого (
возможно в новом году займусь, так как планирую допилить несколько фич
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: sommer-80 от 08 Января 2015, 14:05:49
Всех с праздниками.  Помогите пару дней назад решил обновить  ::) Elastix и теперь в Calls Recordings появились + возле номеров тел. и они теперь не скачуют пишет 404 File not found! а номера бес + скачуют. Подскажите где что править, и где искать.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 14 Января 2015, 00:46:26
sommer-80, покажите как выглядят сами файлы в каталоге.
Возможно проще всего будет переименовывать их скриптом, удаляя +
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 14 Января 2015, 17:48:36
все круто, все поставилось, но зараза из базы не делает выборку почему то... при том в предыдущий раз на другом сервере настроил, работает до сих пор. Есть подозрения, что связано все с использованием 64-битной системы и т.д...
суть в том, что интерфейс видно, однако при нажатии на поиск ничего не происходит. На оригинальном тоже самое... есть идеи куда копать что б исправить?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 14 Января 2015, 17:50:29
да и в принципе, надо сделать будет инструкцию пошаговую по установке... ничего сложного, но может есть пара моментов, про которые забываешь, если ставить астериск на голый centos...


Updated: 14 January 2015, 17:54:26

все круто, все поставилось, но зараза из базы не делает выборку почему то... при том в предыдущий раз на другом сервере настроил, работает до сих пор. Есть подозрения, что связано все с использованием 64-битной системы и т.д...
суть в том, что интерфейс видно, однако при нажатии на поиск ничего не происходит. На оригинальном тоже самое... есть идеи куда копать что б исправить?
Вопрос снимаю, надо было доставить php-mysql
все же надо инструкцию с зависимостями.
P.S. спасибо за vmware+ adaptec =)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 14 Января 2015, 20:21:48
Вопрос снимаю, надо было доставить php-mysql
все же надо инструкцию с зависимостями.
да как-то всегда ./configure подсказывает чего ему не хватило
что до php-mysql, то это как бы само сабой разумеющееся  :pardon:
 
P.S. спасибо за vmware+ adaptec =)
пожалуйста, для спасибо у нас тут еще кнопочка под ником с аватаркой есть (Рейтинг)  :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 14 Января 2015, 22:29:52
Убрать + в начале имен файлов можно таким вот костылем:
#!/bin/bash
for i in $(find ./ -name "+*");
 do  x=$(echo $i |cut -c 4-)
     mv $i $x
done
листинг работы:

fessae@workbook ~/4sommer $ ls -la
total 12
drwxr-xr-x  2 fessae fessae 4096 янв.  15 02:20 .
drwxr-xr-x 60 fessae fessae 4096 янв.  15 02:20 ..
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 +79130751120.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 +79130751121.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 +79130751124.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:19 +79130751127.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 +79130751128.mp3
-rw-r--r--  1 fessae fessae   92 янв.  15 02:20 test.sh
fessae@workbook ~/4sommer $ bash ./test.sh
fessae@workbook ~/4sommer $ ls -la
total 12
drwxr-xr-x  2 fessae fessae 4096 янв.  15 02:20 .
drwxr-xr-x 60 fessae fessae 4096 янв.  15 02:20 ..
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 79130751120.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 79130751121.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 79130751124.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:19 79130751127.mp3
-rw-r--r--  1 fessae fessae    0 янв.  15 02:20 79130751128.mp3
-rw-r--r--  1 fessae fessae   92 янв.  15 02:20 test.sh
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Ilya_Nsk от 19 Февраля 2015, 08:55:39
поработал с введением этой штуки в строй.. пока допер, как совместить  records/filename c реальностью.. там же в функции не включено /mp3/ в проверку наличия.
надо бы статью на хабре подправлять по этому поводу

а от плюса я избавляюсь  в диаллане (у меня макрос чуть поправлен, ARG1 кто звонит, ARG2 - кому, переводятся с усекновением плюса в who И to_whom соответственно, которые и использую при конструировании имени файла)
exten => s,n,Set(who=${IF($["${ARG1:0:1}"="+"]?${ARG1:1}:${ARG1})})
exten => s,n,Set(to_whom=${IF($["${ARG2:0:1}"="+"]?${ARG2:1}:${ARG2})})
Но может потребоваться еще проверка на звездочку, буде кто включает ее в экстеншены
P.S. Модераторы, ну капча у вас на ресурсе, ну это просто катастрофа и хорошо, что ответом к примеру не 1252325452
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 23 Февраля 2015, 20:50:55
поработал с введением этой штуки в строй.. пока допер, как совместить  records/filename c реальностью.. там же в функции не включено /mp3/ в проверку наличия.
надо бы статью на хабре подправлять по этому поводу
не понятно, что нужно проверять в функции
P.S. Модераторы, ну капча у вас на ресурсе, ну это просто катастрофа и хорошо, что ответом к примеру не 1252325452
необходимость вводить капчу пропадает после нескольких сообщений на форуме.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: ronaldo-nn от 27 Марта 2015, 18:34:00
Автору огромное спасибо за труды. Все замечательно работает.
Одно только огорчение. На моем астериске есть фича использующая call файлы для коллбека. Функция записи работает, CDR добавляет строку в таблицу. Но кастомный столбец "filename" не заполняется при этом. Т.е. встроенные поля генерятся, а поле filename - нет. В итоге файл с разговором лежит мертвым грузом, а через веб-морду его не прослушать.
Диал-план выглядит примерно так:
[sip]
exten => _.X,1,Macro(record,${CALLERID(num)},${EXTEN})
[macro-record]
exten => s,1, Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2})
exten => s,n, 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")
exten => s,n, Set(CDR(filename)=${fname}.mp3)
exten => s,n, Set(CDR(realdst)=${ARG2})
exten => s,n, MixMonitor(${WAV}/${fname}.wav,b,${monopt})
exten => s,n, Goto(sip-recorded,${MACRO_EXTEN},1)
[sip-recorded]
exten => _.X,1,Dial(SIP/${EXTEN})
Причем проблема именно с call файлами, при обычных звонках всё тип-топ.
Может кто в курсе как управлять записями cdr в call файлах?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 27 Марта 2015, 23:08:09
ronaldo-nn, покажите call файл и дебаг
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: ronaldo-nn от 30 Марта 2015, 09:53:33
Тока тут наворочено много не по теме. Прокомментирую под кодом
Call файл примерно такой:
Channel: Local/1@autocaller
MaxRetries: 0
RetryTime: 60
WaitTime: 30
Context: sip
CallerID: 3000
Extension: 3000
Priority: 1
Вот еще куски диалплана
[autocaller]
exten => 1,1,Macro(call5715user,5715)

[macro-call5715user]
exten => s,1, NooP(${CALLERID(num)})
exten => s,n, Dial(H323/${ARG1}@atska,,t|60|M(privet))
exten => s,n, Goto(s-${DIALSTATUS},1)
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,n,Hangup()
exten => s-BUSY,n,Hangup()
exten => _s-.,1,Goto(s-NOANSWER,1)

[macro-privet]
exten => s,1, AGI(govorilka.php,"Здесь какое-то приветствие")
exten => s,n, Playback(${GVOICE})
Собственно сама консоль
    -- Attempting call on Local/1@autocaller for 3000@sip:1 (Retry 1)
    -- Executing [1@autocaller:1] Macro("Local/1@autocaller-0000000e;2", "record,5715") in new stack
    -- Executing [s@macro-record:1] NoOp("Local/1@autocaller-0000000e;2", "3000") in new stack
    -- Executing [s@macro-record:2] Dial("Local/1@autocaller-0000000e;2", "H323/5715@atska,5,t|60|M(privet)") in new stack
  == Using H323 RTP TOS bits 184
  == Using H323 RTP CoS mark 6
  == Using UDPTL TOS bits 184
  == Using UDPTL CoS mark 6
    -- Requested transfer capability: 0x00 - SPEECH
    -- Called H323/5715@atska
    -- H323/atska-30 is ringing
    -- H323/atska-30 is ringing
    -- H323/atska-30 is making progress passing it to Local/1@autocaller-0000000e;2
    -- H323/atska-30 answered Local/1@autocaller-0000000e;2
    -- Executing [s@macro-privet:1] AGI("H323/atska-30", "govorilka.php,"Здесь какое-то приветствие"") in new stack
    -- Launched AGI Script /usr/local/asterisk/var/lib/asterisk/agi-bin/govorilka.php
    -- <H323/atska-30>AGI Script govorilka.php completed, returning 0
    -- Executing [s@macro-privet:2] Playback("H323/atska-30", "/usr/local/asterisk/var/lib/asterisk/govorilka/6c93fa3232431db27d3731a60d22d61b") in new stack
    -- <H323/atska-30> Playing '/usr/local/asterisk/var/lib/asterisk/govorilka/6c93fa3232431db27d3731a60d22d61b.alaw' (language 'en')
       > 0x8f5dbca8 -- Probation passed - setting RTP source address to 192.168.118.118:32688
       > Channel Local/1@autocaller-0000000e;1 was answered
    -- Executing [3000@sip:1] Macro("Local/1@autocaller-0000000e;1", "sip-recorded,3000,3000") in new stack
    -- Executing [s@macro-sip-recorded:1] Set("Local/1@autocaller-0000000e;1", "fname=1427694294.164-2015-03-30-08_44-3000-3000") in new stack
    -- Executing [s@macro-sip-recorded:2] Set("Local/1@autocaller-0000000e;1", "monopt=nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav"  "/records/mp3/1427694294.164-2015-03-30-08_44-3000-3000.mp3" && rm -f "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav" && chmod o+r "/records/mp3/1427694294.164-2015-03-30-08_44-3000-3000.mp3" ") in new stack
    -- Executing [s@macro-sip-recorded:3] Set("Local/1@autocaller-0000000e;1", "CDR(filename)=1427694294.164-2015-03-30-08_44-3000-3000.mp3") in new stack
    -- Executing [s@macro-sip-recorded:4] Set("Local/1@autocaller-0000000e;1", "CDR(realdst)=3000") in new stack
    -- Executing [s@macro-sip-recorded:5] MixMonitor("Local/1@autocaller-0000000e;1", "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav,b,nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav"  "/records/mp3/1427694294.164-2015-03-30-08_44-3000-3000.mp3" && rm -f "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav" && chmod o+r "/records/mp3/1427694294.164-2015-03-30-08_44-3000-3000.mp3") in new stack
    -- Executing [s@macro-sip-recorded:6] Goto("Local/1@autocaller-0000000e;1", "sip-recorded,3000,1") in new stack
    -- Goto (sip-recorded,3000,1)
  == Channel 'Local/1@autocaller-0000000e;1' jumping out of macro 'sip-recorded'
    -- Executing [3000@sip-recorded:1] Dial("Local/1@autocaller-0000000e;1", "SIP/3000") in new stack
  == Using SIP RTP CoS mark 5
    -- Called SIP/3000
    -- Local/1@autocaller-0000000e;1 requested media update control 20, passing it to SIP/3000-00000068
  == Begin MixMonitor Recording Local/1@autocaller-0000000e;1
       > [INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid) VALUES ({ ts '2015-03-30 08:44:54' },'3000','3000','1','autocaller','Local/1@autocaller-0000000e;2','H323/atska-30','Dial','H323/5715@atska,5,t|60|M(privet)',3,2,'ANSWERED',3,'1427694294.165')]
  == Spawn extension (macro-record, s, 2) exited non-zero on 'Local/1@autocaller-0000000e;2' in macro 'record'
  == Spawn extension (autocaller, 1, 1) exited non-zero on 'Local/1@autocaller-0000000e;2'
    -- SIP/3000-00000068 is ringing
       > 0xb75501b8 -- Probation passed - setting RTP source address to 192.168.11.10:62342
    -- SIP/3000-00000068 answered H323/atska-30
       > 0xb75501b8 -- Probation passed - setting RTP source address to 192.168.11.10:62342
[Mar 30 08:45:09] NOTICE[10191]: chan_sip.c:27853 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 3000
       > [INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,uniqueid) VALUES ({ ts '2015-03-30 08:44:57' },'3000','3000','3000','sip-recorded','H323/atska-30','SIP/3000-00000068','Dial','SIP/3000',22,12,'ANSWERED',3,'1427694294.166')]
  == Spawn extension (sip-recorded, 3000, 1) exited non-zero on 'H323/atska-30'
  == MixMonitor close filestream (mixed)
  == Executing [nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav"  "/records/mp3/1427694294.164-2015-03-30-08_44-3000-3000.mp3" && rm -f "/records/wav/1427694294.164-2015-03-30-08_44-3000-3000.wav" && chmod o+r "/records/mp3/1427694294.164-2015-03-30-08_44-3000-3000.mp3"]
[Mar 30 08:45:20] NOTICE[1872]: pbx_spool.c:402 attempt_thread: Call completed to Local/1@autocaller
  == End MixMonitor Recording Local/1@autocaller-0000000e;1
Комментарии:
Первый звонок уходит на номер 5715 транзитом через Localchannel (сделано для того, чтобы воспроизвести информационное сообщение, когда там ответят на вызов). Сразу напишу, что звонок в обход localchannel (напрямую на номер 5715)- ничего не меняет.
Когда 5715 берет трубку и прослушает сообщение идет дозвон на номер 3000.
В CDR попадают две записи (обе с пустым столбцом filename) и создается два рекорд файла.
По поводу h323 не напрягайтесь. Запись идет и по sip и по h323. Дело не в канале, а именно в call файлах.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 31 Марта 2015, 13:45:38
ronaldo-nn, смотрели эти топики:
http://asterisk-support.ru/question/15253/ne-dobavliaiutsia-zapisi-cdr-ispolzuiu-call-faily/
http://forum.asterisk.ru/viewtopic.php?f=3&t=249
?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 02 Апреля 2015, 12:23:48
Добрый день.
Наткнулся на вашу статью по CDR Viewer, организовал пока только просмотр статистики...  Все круто, за перевод и убирание лишних столбцов вообще отдельное спасибо.

Появилась необходимость (наконец то =) ) записывать входящие звонки.
Т.к. я не использую extensions.ael, а по старинке в конфиге все ручками, появилась пара вопросов:
1. будет ли работать такой вот вариант:
Спойлер для скрыто:
exten => s,1(start),Answer()
exten => s,n,Set(TIMEOUT(digit)=3)
exten => s,n,Set(TIMEOUT(response)=2)
exten => s,n,Background(/ast_snd/IVR/03-record)
exten => s,n,Set(WAV=/records/wav)
exten => s,n,Set(MP3=/records/mp3)
exten => s,n,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => s,n,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")
exten => s,n,Set((CDR(filename)=${fname}.mp3))
exten => s,n,Set(CDR(realdst)=${called})
exten => s,n,MixMonitor(${WAV}/${fname}.wav,b,${monopt})
exten => s,n,Queue(msk_call,nt)
exten => s,n,HangUp()

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

вопрос № 2.

в /usr/bin/ нет исполняемого файла lame... вообще в принципе в системе lame нет.
yum не знает такого пакета... соответственно при его отсутствии, перекодщировка в мп3 производиться не будет.
так вот сам вопрос - вы ставили lame из репозитариев, или собирали из сорцов?

Буду при много благодарен за ПРАВИЛЬНУЮ ссылку на репозиторий или ссылку на сорцы для лэйма...
OS: CentOs 6.5 x64
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 02 Апреля 2015, 20:12:49
так вот сам вопрос - вы ставили lame из репозитариев, или собирали из сорцов?
из реп, на Debian есть
подключи репозиторий rpmforge, там есть lame
1. будет ли работать такой вот вариант:
так проверь =)
Так же хочу обратить внимание, что  вызывается очередь, а не просто телефон...
пофиг
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 03 Апреля 2015, 14:35:18
не работает

Спойлер для скрыто:
[Apr  3 13:26:33]     -- Executing [s@open_msk:5] Set("SIP/gw-00000ce4", "WAV=/records/wav") in new stack
[Apr  3 13:26:33]     -- Executing [s@open_msk:6] Set("SIP/gw-00000ce4", "MP3=/records/mp3") in new stack
[Apr  3 13:26:33]     -- Executing [s@open_msk:7] Set("SIP/gw-00000ce4", "fname=1428056789.3300-2015-04-03-13_26--") in new stack
[Apr  3 13:26:33]     -- Executing [s@open_msk:8] Set("SIP/gw-00000ce4", "monopt=nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1428056789.3300-2015-04-03-13_26--.wav"  "/records/mp3/1428056789.3300-2015-04-03-13_26--.mp3" && rm -f "/records/wav/1428056789.3300-2015-04-03-13_26--.wav" && chmod o+r "/records/mp3/1428056789.3300-2015-04-03-13_26--.mp3"") in new stack
[Apr  3 13:26:33]     -- Executing [s@open_msk:9] Set("SIP/gw-00000ce4", "(CDR(filename)=1428056789.3300-2015-04-03-13_26--.mp3)") in new stack
[Apr  3 13:26:33] ERROR[30119][C-0000057a]: pbx.c:4390 ast_func_write: Function  not registered
[Apr  3 13:26:33]     -- Executing [s@open_msk:10] Set("SIP/gw-00000ce4", "CDR(realdst)=") in new stack
[Apr  3 13:26:33]     -- Executing [s@open_msk:11] MixMonitor("SIP/gw-00000ce4", "/records/wav/1428056789.3300-2015-04-03-13_26--.wav,b,nice -n 19 /usr/bin/lame -b 32  --silent "/records/wav/1428056789.3300-2015-04-03-13_26--.wav"  "/records/mp3/1428056789.3300-2015-04-03-13_26--.mp3" && rm -f "/records/wav/1428056789.3300-2015-04-03-13_26--.wav" && chmod o+r "/records/mp3/1428056789.3300-2015-04-03-13_26--.mp3"") in new stack
[Apr  3 13:26:33]     -- Executing [s@open_msk:12] Queue("SIP/gw-00000ce4", "msk_call,nt") in new stack
[Apr  3 13:26:33]   == Begin MixMonitor Recording SIP/gw-00000ce4
[Apr  3 13:26:33]     -- Started music on hold, class 'default', on SIP/cgw-00000ce4
[Apr  3 13:26:33]   == Using SIP RTP CoS mark 5
[Apr  3 13:26:33]     -- SIP/phone300-00000ce5 connected line has changed. Saving it until answer for SIP/comlink-gw-00000ce4
[Apr  3 13:26:33]     -- SIP/phone300-00000ce5 is ringing

1. почему то не пишется сам MP3 файл, хотя если убрать set(MP3=/records/mp3) будет писаться в корень... очень странно...

2. сама ошибка, предполагаю, что тут загвоздка в записи в базу... у меня пишет через ODBC... я забыл тут что то добавить?

3. не пойму, почему то папка в каталог с вьювером не линкуется...
# link /records/mp3 records
link: cannot create link `records' to `/records/mp3': Operation not permitted

P.S. по 3-му пункту гугл помог -
 ln -s /records/mp3/ /var/www/asterisk-cdr-viewer/records


Update 2.1.
MP3 записалось только после копипаста с сайта в конфиг, почему то на написанное руками не реагировало...

update 2.2
Не срабатывала запись в таблицу CDR, потому что в конфиге было прописано
exten => s,n,Set((CDR(filename)=${fname}.mp3))
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 03 Апреля 2015, 17:24:43
зараза не пишет в базу инфу о записи...

Спойлер для скрыто:
exten => s,1(start),Answer()
exten => s,n,Set(TIMEOUT(digit)=3)
exten => s,n,Set(TIMEOUT(response)=2)
exten => s,n,Background(/ast_snd/IVR/03-record)
exten => s,n,Set(WAV=/records/wav)
exten => s,n,Set(MP3=/records/mp3)
exten => s,n,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => s,n,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")
exten => s,n,Set(CDR(filename)=${fname}.mp3)
exten => s,n,Set(CDR(realdst)=${called})
exten => s,n,MixMonitor(${WAV}/${fname}.wav,b,${monopt})
exten => s,n,Queue(msk_call,nt)
exten => s,n,HangUp()

имя файла получается к примеру 1428069741.25-2015-04-03-17_02--.mp3, то есть ${calling}-${called} не пишутся, но может ли из-за них не писаться информация в базу???

P.S. личные додумки... а может ли это быть из-за того, что у меня таблица называется не CDR а cdr... ???
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 03 Апреля 2015, 20:04:07
имя файла получается к примеру 1428069741.25-2015-04-03-17_02--.mp3, то есть ${calling}-${called} не пишутся, но может ли из-за них не писаться информация в базу???

P.S. личные додумки... а может ли это быть из-за того, что у меня таблица называется не CDR а cdr...
это всего лишь невнимательность
в моей статье говорится о вызове макроса, а у тебя нет макроса, поэтому нужно не ${calling}-${called}
а ${CALLERID(number)},${EXTEN}

update 2.2
Не срабатывала запись в таблицу CDR, потому что в конфиге было прописано
exten => s,n,Set((CDR(filename)=${fname}.mp3))
в ael работает, extensions.conf не пользую

ps
ну да, сделать не так как в статье, а по своему, и при этом еще обвинить автора в "пасхалках" это гуд ;)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 03 Апреля 2015, 20:48:31
по поводу "пасхалок" отписался...
по поводу того, что бы сделать не так, как у автора - ну если делать все так, как делает автор, то никогда не научишься =)))
не суть... идеи есть, почему может не писать в базу?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 03 Апреля 2015, 21:29:59
судя по всему - бага Астериска...
https://issues.asterisk.org/jira/browse/ASTERISK-23046
Вот  тут ситуация почти похожая...
решил проверить, заменил (CDR(filename)=
на  (CDR(userfield)=
Пишется... видимо придется обновлять астер выше версии 11.9.0.

Есть у кого-нить опыт по обновлению астериска?  :trollface:


Updated: 03 April 2015, 22:17:28

Не стал морочиться, поменял filename на userfield в function.php... Все заработало.
Вопрос опять же. Никто не пробовал какой-нить хтмл плеер туда засунуть? А то натяльника не может слушать с гейпада...
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 04 Апреля 2015, 00:45:43
UPDATE.
Решил все же проапдейтить астериск...  до 11.17.0... та же шляпа... в userfield пишет, в filename и новый mp3s не пишет...

с USERFIELD другая проблема - туда не вставляются значения по дефолту none... то есть плеер есть всегда!

странно все это...
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 04 Апреля 2015, 06:50:19
Не стал морочиться, поменял filename на userfield в function.php... Все заработало.
Вопрос опять же. Никто не пробовал какой-нить хтмл плеер туда засунуть? А то натяльника не может слушать с гейпада...
а поле filename в базе есть?
покажи
describe cdr;
(эту команду нужно в консоли мускула ввести)
касаемо плеера, просмотри комменты к статье на хабре, там кто-то говорил, что прикрутил такой плеер
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 04 Апреля 2015, 06:52:49
с USERFIELD другая проблема - туда не вставляются значения по дефолту none... то есть плеер есть всегда!

странно все это...
я не зря говорил о невнимательности
цитата из статьи:
Цитата
PD 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

еще на счет поля filename
вот это
Цитата
Готовим MySQL

CDR нашего Asterisk должны писаться в MySQL базу, о том как это настроить можно прочесть здесь например ;).
Имя файла записи разговора пишется в поле file таблицы CDR.
Добавим его:
mysql -uroot -p -e "alter table  `cdr` add column `filename` varchar(120)  after `userfield`;"  asterisk
сделано?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 04 Апреля 2015, 10:42:22
Ну что бы не было вопросов, сразу надо было дискрайб тут написать:
Спойлер для скрыто:
describe cdr;
+-------------+------------------+------+-----+---------------------+----------------+
| Field       | Type             | Null | Key | Default             | Extra          |
+-------------+------------------+------+-----+---------------------+----------------+
| id          | int(11) 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 |                     |                |
| peeraccount | varchar(20)      | NO   |     |                     |                |
| linkedid    | varchar(32)      | NO   |     |                     |                |
| sequence    | int(11)          | NO   |     | 0                   |                |
| userfield   | varchar(255)     | YES  |     | none                |                |
| mp3s        | varchar(255)     | YES  |     | none                |                |
| filename    | varchar(255)     | YES  |     | none                |                |
+-------------+------------------+------+-----+---------------------+----------------+
22 rows in set (0.00 sec)

В том то и проблема, что дефолтное значение userfield стоит "none", однако не пишет он  none... просто пустые строки::

Спойлер для скрыто:
mysql> SELECT      * FROM     cdr ORDER BY id DESC LIMIT 10;
+------+---------------------+------------------------+-------------+-------------+----------+-------------------------+-------------------------+---------+----------------------------+----------+---------+-------------+----------+-------------+----------------+-------------+----------+----------+-----------+------+----------+
| id   | calldate            | clid                   | src         | dst         | dcontext | channel                 | dstchannel              | lastapp | lastdata                   | duration | billsec | disposition | amaflags | accountcode | uniqueid       | peeraccount | linkedid | sequence | userfield | mp3s | filename |
+------+---------------------+------------------------+-------------+-------------+----------+-------------------------+-------------------------+---------+----------------------------+----------+---------+-------------+----------+-------------+----------------+-------------+----------+----------+-----------+------+----------+
| 7669 | 2015-04-04 10:30:21 | "ROOM #26" <126>       | 126         | 333         | internal | SIP/phone126-00000066   | SIP/phone333-00000067   | Dial    | SIP/phone333,20,tTg        |        3 |       1 | ANSWERED    |        3 |             | 1428132621.102 |             |          |        0 |           | none | none     |
| 7668 | 2015-04-04 10:21:24 | 89853646150            | 89853646150 | 6447200     | open     | SIP/comlink-gw-00000063 | SIP/phone333-00000064   | Queue   | maincall,nt                |       56 |      56 | ANSWERED    |        3 |             | 1428132084.99  |             |          |        0 |           | none | none     |
| 7667 | 2015-04-04 10:09:20 | "ROOM #29" <129>       | 129         | 100         | internal | SIP/phone129-00000060   | SIP/phone333-00000061   | Queue   | maincall,nt                |       13 |      10 | ANSWERED    |        3 |             | 1428131360.96  |             |          |        0 |           | none | none     |
| 7666 | 2015-04-04 10:08:47 | "RECEPTION #333" <333> | 333         | 129         | internal | SIP/phone333-0000005e   | SIP/phone129-0000005f   | Dial    | SIP/phone129,20,tTg        |       14 |      11 | ANSWERED    |        3 |             | 1428131327.94  |             |          |        0 |           | none | none     |
| 7665 | 2015-04-04 10:05:17 | 89829717777            | 89829717777 | 6447200     | open     | SIP/comlink-gw-00000059 | SIP/phone333-0000005a   | Queue   | maincall,nt                |      178 |     178 | ANSWERED    |        3 |             | 1428131117.89  |             |          |        0 |           | none | none     |
| 7664 | 2015-04-04 10:05:20 | "RECEPTION #333" <333> | 333         | 89531620528 | internal | SIP/phone333-0000005c   | SIP/comlink-gw-0000005d | Dial    | SIP/89531620528@comlink-gw |       26 |      18 | ANSWERED    |        3 |             | 1428131120.92  |             |          |        0 |           | none | none     |
| 7663 | 2015-04-04 10:04:38 | "ROOM #29" <129>       | 129         | 100         | internal | SIP/phone129-00000056   | SIP/phone333-00000057   | Queue   | maincall,nt                |       26 |      23 | ANSWERED    |        3 |             | 1428131078.86  |             |          |        0 |           | none | none     |
| 7662 | 2015-04-04 09:56:34 | "RECEPTION #333" <333> | 333         | 89516689556 | internal | SIP/phone333-00000054   | SIP/comlink-gw-00000055 | Dial    | SIP/89516689556@comlink-gw |       38 |      16 | ANSWERED    |        3 |             | 1428130594.84  |             |          |        0 |           | none | none     |
| 7661 | 2015-04-04 09:56:18 | "ROOM #05" <105>       | 105         | 100         | internal | SIP/phone105-00000051   | SIP/phone333-00000052   | Queue   | maincall,nt                |        7 |       5 | ANSWERED    |        3 |             | 1428130578.81  |             |          |        0 |           | none | none     |
| 7660 | 2015-04-04 09:50:03 | "RECEPTION #333" <333> | 333         | 89531620528 | internal | SIP/phone333-0000004f   | SIP/comlink-gw-00000050 | Dial    | SIP/89531620528@comlink-gw |       17 |       8 | ANSWERED    |        3 |             | 1428130203.79  |             |          |        0 |           | none | none     |
+------+---------------------+------------------------+-------------+-------------+----------+-------------------------+-------------------------+---------+----------------------------+----------+---------+-------------+----------+-------------+----------------+-------------+----------+----------+-----------+------+----------+
10 rows in set (0.00 sec)




Для сравнения то, что с записью:
Спойлер для скрыто:
mysql> SELECT      * FROM     cdr where dst= '6447201' ORDER BY id DESC LIMIT 10;
+------+---------------------+-------------+-------------+---------+----------+-------------------------+-----------------------+---------+-------------+----------+---------+-------------+----------+-------------+----------------+-------------+----------+----------+---------------------------------------+------+----------+
| id   | calldate            | clid        | src         | dst     | dcontext | channel                 | dstchannel            | lastapp | lastdata    | duration | billsec | disposition | amaflags | accountcode | uniqueid       | peeraccount | linkedid | sequence | userfield                             | mp3s | filename |
+------+---------------------+-------------+-------------+---------+----------+-------------------------+-----------------------+---------+-------------+----------+---------+-------------+----------+-------------+----------------+-------------+----------+----------+---------------------------------------+------+----------+
| 7630 | 2015-04-04 00:42:20 | 89217903793 | 89217903793 | 6447201 | open_msk | SIP/comlink-gw-00000004 | SIP/phone300-00000005 | Queue   | msk_call,nt |        7 |       7 | ANSWERED    |        3 |             | 1428097340.4   |             |          |        0 | 1428097340.4-2015-04-04-00_42.mp3     | none | none     |
| 7629 | 2015-04-04 00:40:11 | 89217903793 | 89217903793 | 6447201 | open_msk | SIP/comlink-gw-00000002 | SIP/phone300-00000003 | Queue   | msk_call,nt |        7 |       7 | ANSWERED    |        3 |             | 1428097211.2   |             |          |        0 |                                       | none | none     |
| 7628 | 2015-04-04 00:31:40 | 89217903793 | 89217903793 | 6447201 | open_msk | SIP/comlink-gw-00000000 | SIP/phone300-00000001 | Queue   | msk_call,nt |        7 |       7 | ANSWERED    |        3 |             | 1428096700.0   |             |          |        0 |                                       | NULL | none     |
| 7622 | 2015-04-03 22:13:11 | 89117309447 | 89117309447 | 6447201 | open_msk | SIP/comlink-gw-0000008d | SIP/phone300-0000008e | Queue   | msk_call,nt |       20 |      20 | ANSWERED    |        3 |             | 1428088391.141 |             |          |        0 | 1428088391.141-2015-04-03-22_13--.mp3 | NULL | none     |
| 7615 | 2015-04-03 21:23:59 | 89217903793 | 89217903793 | 6447201 | open_msk | SIP/comlink-gw-0000007d | SIP/phone300-0000007e | Queue   | msk_call,nt |       34 |      34 | ANSWERED    |        3 |             | 1428085439.125 |             |          |        0 | 1428085439.125-2015-04-03-21_24--.mp3 | NULL | none     |
| 7594 | 2015-04-03 17:50:16 | 2942373     | 2942373     | 6447201 | open_msk | SIP/comlink-gw-0000004a | SIP/phone300-0000004b | Queue   | msk_call,nt |       25 |      25 | ANSWERED    |        3 |             | 1428072616.74  |             |          |        0 |                                       | NULL | none     |
| 7592 | 2015-04-03 17:37:57 | 2944949     | 2944949     | 6447201 | open_msk | SIP/comlink-gw-00000046 | SIP/phone300-00000047 | Queue   | msk_call,nt |       37 |      37 | ANSWERED    |        3 |             | 1428071877.70  |             |          |        0 |                                       | NULL | none     |
| 7585 | 2015-04-03 17:17:03 | 2494467     | 2494467     | 6447201 | open_msk | SIP/comlink-gw-00000034 | SIP/phone300-00000035 | Queue   | msk_call,nt |       19 |      19 | ANSWERED    |        3 |             | 1428070623.52  |             |          |        0 |                                       | NULL | none     |
| 7582 | 2015-04-03 17:10:39 | 89217903793 | 89217903793 | 6447201 | open_msk | SIP/comlink-gw-00000025 | SIP/phone300-00000026 | Queue   | msk_call,nt |       17 |      17 | ANSWERED    |        3 |             | 1428070239.37  |             |          |        0 |                                       | NULL | none     |
| 7580 | 2015-04-03 17:03:48 | 2944554     | 2944554     | 6447201 | open_msk | SIP/comlink-gw-0000001d | SIP/phone300-0000001e | Queue   | msk_call,nt |       28 |      28 | ANSWERED    |        3 |             | 1428069828.29  |             |          |        0 |                                       | NULL | none     |
+------+---------------------+-------------+-------------+---------+----------+-------------------------+-----------------------+---------+-------------+----------+---------+-------------+----------+-------------+----------------+-------------+----------+----------+---------------------------------------+------+----------+
10 rows in set (0.02 sec)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 04 Апреля 2015, 10:45:26
И естественно, статью я дочитал до конца и по поводу глюка тоже прочитал =))
даже по коментам прошелся, заменив FLASH player обычным HTMLевским... в хроме, фаерфоксе и сафари работает... что еще нужно. ;)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 06 Апреля 2015, 07:19:17
Нужно найти где именно косяк, предлагаю провести простой экспиремент.
Создай какой-нибудь экстеншен(123456 например) и в обработку этого экстеншена вставь что-то типо:
Set(CDR(filename)=ololo_123)
вызови экстеншен и проверь пишется ли в базу
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 17 Апреля 2015, 11:11:30
Сори, был в полной уверенности, что подписался на тему... не видел вашего сообщения:
и так, консоль астериска:
Спойлер для скрыто:
pr 17 11:08:40]   == Using SIP RTP CoS mark 5
[Apr 17 11:08:40]     -- Executing [777@internal:1] Set("SIP/phone333-00000dde", "CDR(filename)=ololo_123") in new stack
[Apr 17 11:08:40]     -- Executing [777@internal:2] Answer("SIP/phone333-00000dde", "") in new stack
[Apr 17 11:08:40]     -- Executing [777@internal:3] BackGround("SIP/phone333-00000dde", "/ast_snd/IVR/03-record") in new stack
[Apr 17 11:08:40]     -- <SIP/phone333-00000dde> Playing '/ast_snd/IVR/03-record.alaw' (language 'ru')
[Apr 17 11:08:43]     -- Executing [777@internal:4] Hangup("SIP/phone333-00000dde", "") in new stack
[Apr 17 11:08:43]   == Spawn extension (internal, 777, 4) exited non-zero on 'SIP/phone333-00000dde'
[Apr 17 11:08:58]   == Using SIP RTP CoS mark 5
[Apr 17 11:08:58]     -- Executing [777@internal:1] Set("SIP/phone333-00000ddf", "CDR(filename)=ololo_123") in new stack
[Apr 17 11:08:58]     -- Executing [777@internal:2] Answer("SIP/phone333-00000ddf", "") in new stack
[Apr 17 11:08:58]     -- Executing [777@internal:3] BackGround("SIP/phone333-00000ddf", "/ast_snd/IVR/03-record") in new stack
[Apr 17 11:08:58]     -- <SIP/phone333-00000ddf> Playing '/ast_snd/IVR/03-record.alaw' (language 'ru')
[Apr 17 11:09:02]     -- Executing [777@internal:4] Hangup("SIP/phone333-00000ddf", "") in new stack
[Apr 17 11:09:02]   == Spawn extension (internal, 777, 4) exited non-zero on 'SIP/phone333-00000ddf'
SELECT      * FROM     cdr where dst= '777' ORDER BY id DESC LIMIT 10;
Спойлер для скрыто:
+------+---------------------+------------------------+-----+-----+----------+-----------------------+------------+---------+----------+----------+---------+-------------+----------+-------------+-----------------+-------------+----------+----------+-----------+------+----------+
| id   | calldate            | clid                   | src | dst | dcontext | channel               | dstchannel | lastapp | lastdata | duration | billsec | disposition | amaflags | accountcode | uniqueid        | peeraccount | linkedid | sequence | userfield | mp3s | filename |
+------+---------------------+------------------------+-----+-----+----------+-----------------------+------------+---------+----------+----------+---------+-------------+----------+-------------+-----------------+-------------+----------+----------+-----------+------+----------+
| 9045 | 2015-04-17 11:08:58 | "RECEPTION #333" <333> | 333 | 777 | internal | SIP/phone333-00000ddf |            | Hangup  |          |        4 |       4 | ANSWERED    |        3 |             | 1429258138.3551 |             |          |        0 |           | none | none     |
| 9044 | 2015-04-17 11:08:40 | "RECEPTION #333" <333> | 333 | 777 | internal | SIP/phone333-00000dde |            | Hangup  |          |        4 |       4 | ANSWERED    |        3 |             | 1429258120.3550 |             |          |        0 |           | none | none     |
+------+---------------------+------------------------+-----+-----+----------+-----------------------+------------+---------+----------+----------+---------+-------------+----------+-------------+-----------------+-------------+----------+----------+-----------+------+----------+
2 rows in set (0.00 sec)


Не пишет =(((
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 17 Апреля 2015, 12:22:12
Все, я добил эту заразу.

проблема была в том, что использовался просто cdr_odbc модуль и не был настроен cdr_adaptive_odbc, который:
Спойлер для скрыто:
что она пытается приспособиться к структуре таблицы: нет статической структуры таблиц, которые должны быть использованы с этим модулем.
Когда модуль загружен (или при перезагрузке), он читает структуру таблицы. Он ищет имя столбца, которому соответствует переменная CDR.
Это относится как к встроенным CDR переменным, так и к пользовательским переменным.

Как только включил в cdr_adaptive_odbc.conf

[cdr]
connection = asterisk-cdr
table = cdr

Сразу стал писать SET-ом в кастомные поля...
Однако РНР скрипт не берет из базы это значение =((( непонятно...
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 18 Апреля 2015, 19:54:08
Однако РНР скрипт не берет из базы это значение =((( непонятно...
какой скрипт и какое значение?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 20 Апреля 2015, 13:07:37
functions.inc.php

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

        /* ============================================================================ */


if ($mycalldate<$mydate){
if (file_exists("records/$mycalldate/$recorded_file]")) {
echo " <td class=\"record_col\"><a href=\"downloads.php?audio=records/$mycalldate/$recorded_file\" title=\"Скачать файл с разговором\"><img src=\"templates/images/sound.png\"</a>
                                <audio src=\"records/$mycalldate/$recorded_file\" type=\"audio/mp3\" controls=\"controls\"> </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>
                        <audio src=\"records/$recorded_file\" type=\"audio/mp3\" controls=\"controls\"></td>\n";
}
else {echo "    <td class=\"record_col\">запись отсутствует</td>\n";}

}
}



при userfield работает, при filemane не работает...
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: scrame от 20 Апреля 2015, 13:10:19
mysql> SELECT      * FROM     cdr where dst= '6447201' ORDER BY id DESC LIMIT 10;
Спойлер для скрыто:
mysql> SELECT      * FROM     cdr where dst= '6447201' ORDER BY id DESC LIMIT 10;
+------+---------------------+-------------+-------------+---------+----------+-------------------------+-----------------------+---------+-------------+----------+---------+-------------+----------+-------------+-----------------+-------------+-----------------+----------+--------------------------------------+--------------------------------------+--------------------------------------+
| id   | calldate            | clid        | src         | dst     | dcontext | channel                 | dstchannel            | lastapp | lastdata    | duration | billsec | disposition | amaflags | accountcode | uniqueid        | peeraccount | linkedid        | sequence | userfield                            | mp3s                                 | filename                             |
+------+---------------------+-------------+-------------+---------+----------+-------------------------+-----------------------+---------+-------------+----------+---------+-------------+----------+-------------+-----------------+-------------+-----------------+----------+--------------------------------------+--------------------------------------+--------------------------------------+
| 9736 | 0000-00-00 00:00:00 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00001164 | SIP/phone300-00001165 | Queue   | msk_call,nt |       18 |      18 | ANSWERED    |        3 |             | 1429524142.4452 |             | 1429524142.4452 |     5866 | 1429524142.4452-2015-04-20-13_02.mp3 | none                                 | none                                 |
| 9735 | 2015-04-20 13:02:22 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00001164 | SIP/phone300-00001165 | Queue   | msk_call,nt |       18 |      18 | ANSWERED    |        3 |             | 1429524142.4452 |             |                 |        0 | 1429524142.4452-2015-04-20-13_02.mp3 | none                                 | none                                 |
| 9734 | 0000-00-00 00:00:00 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00001162 | SIP/phone300-00001163 | Queue   | msk_call,nt |       16 |      16 | ANSWERED    |        3 |             | 1429524116.4450 |             | 1429524116.4450 |     5863 | 1429524116.4450-2015-04-20-13_02.mp3 | none                                 | none                                 |
| 9733 | 2015-04-20 13:01:56 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00001162 | SIP/phone300-00001163 | Queue   | msk_call,nt |       16 |      16 | ANSWERED    |        3 |             | 1429524116.4450 |             |                 |        0 | 1429524116.4450-2015-04-20-13_02.mp3 | none                                 | none                                 |
| 9090 | 0000-00-00 00:00:00 | 2944555     | 2944555     | 6447201 | open_msk | SIP/comlink-gw-00000e2f | SIP/phone300-00000e30 | Queue   | msk_call,nt |       31 |      31 | ANSWERED    |        3 |             | 1429263252.3631 |             | 1429263252.3631 |     4821 | none                                 | none                                 | 1429263252.3631-2015-04-17-12_34.mp3 |
| 9089 | 2015-04-17 12:34:12 | 2944555     | 2944555     | 6447201 | open_msk | SIP/comlink-gw-00000e2f | SIP/phone300-00000e30 | Queue   | msk_call,nt |       31 |      31 | ANSWERED    |        3 |             | 1429263252.3631 |             |                 |        0 |                                      | none                                 | none                                 |
| 9088 | 0000-00-00 00:00:00 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00000e2d | SIP/phone300-00000e2e | Queue   | msk_call,nt |       21 |      21 | ANSWERED    |        3 |             | 1429262842.3629 |             | 1429262842.3629 |     4818 | none                                 | 1429262842.3629-2015-04-17-12_27.mp3 | none                                 |
| 9087 | 2015-04-17 12:27:22 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00000e2d | SIP/phone300-00000e2e | Queue   | msk_call,nt |       20 |      20 | ANSWERED    |        3 |             | 1429262842.3629 |             |                 |        0 |                                      | none                                 | none                                 |
| 9037 | 2015-04-17 10:52:18 | 6010670     | 6010670     | 6447201 | open_msk | SIP/comlink-gw-00000dcb | SIP/phone300-00000dcc | Queue   | msk_call,nt |       36 |      36 | ANSWERED    |        3 |             | 1429257138.3531 |             |                 |        0 | 1429257138.3531-2015-04-17-10_52.mp3 | none                                 | none                                 |
| 8979 | 2015-04-16 16:39:59 | 89117309447 | 89117309447 | 6447201 | open_msk | SIP/comlink-gw-00000d3d | SIP/phone300-00000d3e | Queue   | msk_call,nt |       18 |      18 | ANSWERED    |        3 |             | 1429191599.3389 |             |                 |        0 | 1429191599.3389-2015-04-16-16_40.mp3 | none                                 | none                                 |
+------+---------------------+-------------+-------------+---------+----------+-------------------------+-----------------------+---------+-------------+----------+---------+-------------+----------+-------------+-----------------+-------------+-----------------+----------+--------------------------------------+--------------------------------------+--------------------------------------+
10 rows in set (0.00 sec)




describe cdr;

Спойлер для скрыто:
mysql> describe cdr;
+-------------+------------------+------+-----+---------------------+----------------+
| Field       | Type             | Null | Key | Default             | Extra          |
+-------------+------------------+------+-----+---------------------+----------------+
| id          | int(11) 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 |                     |                |
| peeraccount | varchar(20)      | NO   |     |                     |                |
| linkedid    | varchar(32)      | NO   |     |                     |                |
| sequence    | int(11)          | NO   |     | 0                   |                |
| userfield   | varchar(255)     | YES  |     | none                |                |
| mp3s        | varchar(255)     | YES  |     | none                |                |
| filename    | varchar(255)     | YES  |     | none                |                |
+-------------+------------------+------+-----+---------------------+----------------+
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: brain от 09 Мая 2015, 19:42:57
Добрый вечер, подскажите пожалуйста
у меня происходит запись разговоров все можно прослушать и скачать, только вот есть одно неудобство:
можно как то сделать так чтобы запись разговора шла с самого начала разговора и до конца, например у меня сейчас такая ситуация:
происходит звонок, берут трубку, после чего если переключают на другого человека запись останавливается и начинается другая запись.
можно это как-то исправить?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 13 Мая 2015, 04:02:03
brain, думаю, что нет.
Но могу ошибаться, поштудируйте доку Asterisk.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: brain от 14 Мая 2015, 01:29:21
brain, думаю, что нет.
Но могу ошибаться, поштудируйте доку Asterisk.
а может это быть из за того, что когда я пытаюсь переключить абонента, при вызове сотрудника врубается очередной скрипт с записью на внутреннюю линию?

exten => _XX,1,Macro(radiorecord,${CALLERID(number)},${EXTEN})
exten => _XX,n,Dial(SIP/${EXTEN},30,tT)
exten => _XX,n,HangUp
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 04 Июня 2015, 15:28:52
Использую Asterisk уже около года, работает дома как домашний телефон. 4 USB модема + Skype (запущен на виртуальной машине) + SIP для межгорода.
Как нашел тему на Хабре, попробовал использовать CDR Viewer, но не устроила тормознутость, если сразу выводится много записей звонков и для каждой подгружается Flash player для прослушивания звонка. Все это было переделано. Ниже можно посмотреть на скрины, как все выглядит.

Теперь для каждой записи Flash плеер не подгружается, есть только кнопка для прослушивания звонка, в результате чего нет никаких тормозов. При нажатии на кнопку для прослушивания звонка Javascript подгружает плеер, используется Uppod, фон затемняется для удобства. Файл с сервера отдается не напрямую как было, а с помощью скрипта download.php, чтобы имя файла передавалось корректно, оно в base64. Рядом с кнопкой прослушивания есть кнопка для скачивания файла с записью звонка. Иконки взяты из Free PBX последней версии.

Также теперь можно нажать на любой номер, и откроется информация о номере (какой оператор, область и т.д.). Для этого был написан отдельный сервис, используется база РосСвязи, мобильные номера можно проверить с учетом MNP.

Для чего это все написано? Чтобы подкинуть несколько идей, как можно кастомизировать CDR Viewer для большего удобства. Если есть вопросы, пишите.
Спойлер для Скриншоты:
(http://fs1.directupload.net/images/150604/r8rqj8ay.jpg)

(http://fs1.directupload.net/images/150604/yna73jno.jpg)

(http://fs2.directupload.net/images/150604/hpr5fch2.jpg)


Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 05 Июня 2015, 11:01:15
profiton, замечательная работа у вас вышла.
Я давно не занимался темой, думаю ваш вариант куда интереснее - выкладывайте, прилепим в начало темы.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 05 Июня 2015, 18:45:05
FessAectan, это я еще год назад сделал.
В ближайшее время еще немного все подчищу от лишнего и тогда уже можно выкладывать. Только вот сервис определения оператора выложить не получится, он связан с базой Астериска (определение маршрута), скрипт обновления тоже отдельно, писать FAQ не хочется. А так надеюсь кому-то понадобится.  :)
Еще есть идея отказаться от флеша, но пока не нашел подходящего плеера. У меня все записи звонков в mp3.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 06 Июня 2015, 13:57:21
profiton, в комментах к моей статье некто zombic писал:
http://habrahabr.ru/post/212815/#comment_8176113
т.е. он обошелся без проигрывателя, средствами браузера.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 11 Июня 2015, 13:23:55
FessAectan
В выходные перепробовал все возможные html5 плееры, но нормально работает только флеш. Один плеер может работать в Firefox, но не работает в Chrome. На андроиде почти ниодин не работает нормально. Пробовал в том числе тег audio, но, т.к. файл отдается скриптом, корректно также не работает. Пока только флеш, либо может кто предложит что-то получше.

Много чего еще изменил, в том числе внешний вид (см. скрин). В ближайшее время будет на Github.


Спойлер для Скрин:
(http://fs1.directupload.net/images/150611/yulbi99s.jpg)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Июня 2015, 01:06:59
Много чего еще изменил, в том числе внешний вид (см. скрин). В ближайшее время будет на Github.

profiton, годнота!
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 17 Июня 2015, 02:54:29
Выложил на Гитхабе. На странице проекта можно посмотреть скрины и т.д.

 :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 17 Июня 2015, 11:26:21
profiton, за основу же мою переделку брал, и диалплан и скрипты, упомянул бы где-нибудь   ;)
Добавил в первый пост инфу.


Updated: 17 June 2015, 11:40:53

На хабре тоже добавил инфу и линк на твой мод, если есть хабрааккаунт, то скажи - вставлю в текст статьи
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 17 Июня 2015, 17:37:36
FessAectan, на сайт уже добавил.

Только вот ты Хабре написал "внизу статьи скрины и линк на ...". А линка то нет, или я не увидел  :pardon:
Кстати, у тебя есть ошибка в скрипте из статьи, строка
ym=`date +%Y-%m -%d "-1 day"`
Правильно:
ym=`date +%Y-%m -d "-1 day"`

На хабре меня не было, а так вот prog-it

Скрипт на bash указан только в качестве примера.  :)
Для распределения файлов по папкам у меня написан свой на PHP с учетом нужных параметров, например, если размер файла меньше 30 Кб, просто удаляем. А макрос да, используется.

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 17 Июня 2015, 20:20:52
profiton, линк и ссылку на хабраак добавил.
Скрипт докрутил.  :beer:
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: bmd от 07 Июля 2015, 12:42:46
Всем привет. Подскажите пожалуйста как данный скрипт прикрутить к FreePBX 13? Не очень понимаю где и что необходимо заменить...

имеется ввиду вот этот код

// MixMonitor
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 "${DIR_RECORDS}${fname}.wav"  "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
Set(CDR(filename)=${fname}.mp3);
Set(CDR(realdst)=${called});
MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
   }
   return;
};

Пример вызова макроса:
context internal {
_X. => {
&recording(${CALLERID(num)},${EXTEN});
Dial(SIP/${EXTEN},60);
Hangup();
};
};

Как его адаптировать под FreePBX ? Так же у меня в контексте from-internal используются очереди и т.д... и просто DIAL(SIP) не очень подходит.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 07 Июля 2015, 16:13:56
bmd, здесь показан пример для extensions.ael, а Freepbx генерирует extensions.conf. Насчет Freepbx точно не скажу, т.к. у меня весь диал план в extensions.ael. А так для extensions.conf нужно немного переписать макрос и добавить его в свой диал план.
Например так:
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no)
exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${DIR_RECORDS}${fname}.wav"  "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${called});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(exit record);

Затем добавить глобальные переменные в globals.
[globals]
...
RECORDING=1; // 1-вкл / 0-выкл запись разговора
DIR_RECORDS=/var/calls/; // папка с записями разговоров
...

Как то так...  :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Июля 2015, 20:30:33
bmd, диалплан у меня аналогично предыдущему оратору - в ael.
Но давеча делел одному клиенту на FreePBX.
Вот диалплан:
;##################################################################################################################################################################################
; These changes has made TheCall.RU
; Start
[macro-thecall.ru-record]
exten => s,1,NoOp(== START macro-thecall.ru-record ==)
exten => s,n,Set(THECALLRURECORDING=0)
exten => s,n,Set(CallerID=${ARG1})
exten => s,n,Set(CalleeID=${ARG2})
exten => s,n,NoOp(CalleeID=${CalleeID}, CallerID=${CallerID})
exten => s,n,AGI(record_or_not.py,${CalleeID},${CallerID})
exten => s,n,NoOp(THECALLRURECORDING = ${THECALLRURECORDING})
exten => s,n,GotoIf($["${THECALLRURECORDING}" = "0"]?end)
exten => s,n,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${CallerID}-${CalleeID})
exten => s,n,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")
exten => s,n,Set(CDR(filename)=${fname}.mp3)
exten => s,n,Set(CDR(realdst)=${called})
exten => s,n,MixMonitor(${WAV}/${fname}.wav,b,${monopt})
exten => s,n(end),MacroExit()

[from-internal-custom]
;include => from-internal
exten => _XX.,1, Macro(thecall.ru-record,${CALLERID(number)},${EXTEN})

[from-pstn-custom]
exten => _XX.,1, Macro(thecall.ru-record,${CALLERID(number)},${EXTEN})

; End TheCall.RU's changes
;####################################################################################################################################################################################

Код скрипта, включаещего запись для конкретных номеров:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys

def agi_command(cmd):
    print cmd
    sys.stdout.flush()
    return sys.stdin.readline().strip()




list_of_numbers = ['201','202','203', '204', '205', '206', '207', '208', '209', '210', '211', '222']

if sys.argv[1] in list_of_numbers:
    response = agi_command("EXEC Set THECALLRURECORDING=1")
elif sys.argv[2] in list_of_numbers:
    response = agi_command("EXEC Set THECALLRURECORDING=1")
sys.exit(0)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: djserg-minyar от 08 Июля 2015, 08:08:21
Всем доброго дня, подскажите а можно ли сделать графики по звонкам из данной статистики?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 08 Июля 2015, 09:42:00
djserg-minyar, записи никуда не пропали, они просто не переместились. Переместите их вручную.

А в скрипте ошибка, надо так:
#!/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/$ym* /records/mp3/$ym/$ymd/
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: djserg-minyar от 08 Июля 2015, 09:54:23
Спасибо, начало поправил, а конец так должен выглядеть.

mv /records/mp3/*$ymd* /records/mp3/$ym/$ymd/
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 08 Июля 2015, 10:07:01
djserg-minyar, конец упустил  :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: bmd от 08 Июля 2015, 16:16:46
Спасибо за подсказки ! все заработало и запись пошла... но теперь почему то сама CDR не проигрывает запись разговора

Файл dl.php?f=MTQzNjM2NjY4OC45Mdaasdasdasdasdasd не найден


скажите пожалуйста почему при прослушивание говорится что файл не найден ? я в dl.php попробовал сделать  $fname = base64_decode($_REQUEST['f']) и посмотреть переменную, он декодит правильно .... пробовал открыть файл через www:///// проект //records/file.mp3  он тоже открывается нормально и запись проигрывается.
А прослушивание через интерфейс cdr не работает.



 ::)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: bmd от 08 Июля 2015, 18:36:56
Умирает вот тут... Echo 1 уже не выводится...   Class 'finfo' not found

private function getMime($path) {
      $res = 'application/octet-stream';
      # Включено автоопределение
      if ($this->ContentTypeAuto === true) {

         $finfo = new \finfo(FILEINFO_MIME_TYPE);
            echo '1';
         if (is_object($finfo) === true) {
            $res = $finfo->file($path);
         }
      }

        return $res;

   }
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 08 Июля 2015, 19:10:19
bmd, у вас не установлен модуль php_fileinfo, и , скорее всего, версия PHP ниже 5.3. Какая у вас версия PHP ? У меня 5.5.9 и этот модуль установлен по умолчанию.

Можете обновить PHP, либо установить PECL модуль php_fileinfo. А если ничего делать не хочется  :), добавьте следующую строчку в файл dl.php в 2х местах.
$send->ContentTypeAuto = false;

Итог
...
$send = new sendFile;
$send->ContentTypeAuto = false;
...

PS Добавил системные требования в Readme
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: cagami от 19 Июля 2015, 22:48:15
Вечер добрый всем
у меня проблема с cdr
у меня в asterisk
сделано, что когда приходит звонок, то он попадает в queue
и в dst у меня записывается s
context route {

s => {
          SET(DNID=${CUT(CUT(SIP_HEADER(To),@,1),:,2)});
          SET(OLO=${EXTEN});
          jump ${DNID}@route_in_default;
}
}
context route_in_default {
                 _X. => {
                               jump ${OLO}@route_in_turn;
}
}
context route_in_turn {
                 s =>{
                          start:
                        Answer();
                        SetMusicOnHold(welcome);
                        Queue("turn",t,,,30);
                        Queue(turn2,t,,,30);
                        goto start;
}
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 23 Июля 2015, 19:57:52
cagami, у меня, к сожалению, сейчас нет возможности помочь - в отпуске.
Если никто не подскажет, то постараюсь найти время после 10-го августа.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: owl от 12 Сентября 2015, 10:51:12
Уважаемый FessAectan,
Нужна ваша помощь ибо с линуксом и тем более астериском дружу первый раз.
Суть в чем: Астериск звонки записывает, но не много не в том формате как у вас и складывает в другую папку, файлы *.wav

extensions.conf

[outcoling]
exten => _X.,1,Set(fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M)}-${CALLERID(number)}-${EXTEN})
exten => _X.,2,MixMonitor(/var/www/html/callrecords/${fname}.wav,b)
exten => _XXXX,3,Dial(SIP/${EXTEN},,t&m)
exten => _XXXXXXXXXXX,3,Dial(SIP/*******/${EXTEN})
exten => _XXXXXXXXXXXX,3,Dial(SIP/*******/${EXTEN})


но в web интерфейсе в графе файлы показывает что их нет.

[attachimg=1][attachimg=2]

Может Вам нужна какая дополнительно информация от меня?
Что и где нужно прописать чтоб начало нормально работать?
Заранее спасибо!

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Сентября 2015, 13:51:38
owl, сделайте как у меня и все будет работать.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: owl от 12 Сентября 2015, 13:56:24
FessAectan,
пытался делать, перестают звонки проходить
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: owl от 12 Сентября 2015, 14:47:02
FessAectan,
может поможете с моей конфигурацией ::) ?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Сентября 2015, 15:00:44
owl, на вскидку:
1. у вас не пишется в БД имя файла записи, а именно это поле читает web-прослушка из БД
2. пишите, что перестают звонки ходить - так тому причина есть, в консоле дебаг смотрели?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: owl от 12 Сентября 2015, 15:09:43
да, я понял это, что в БД не идет запись. как это исправить не знаю :-[
а по поводу дебага.. я в линуксе профан, все равно не пойму что напишет и как его запустить, я этот астериск собирал по пошаговому мануалу, еслиб не он, не справился бы.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Сентября 2015, 15:43:58
owl, ну вы меня тогда извините, вот то, что вам нужно в первую очередь - http://asterisk-service.com/downloads/Asterisk-%20The%20Definitive%20Guide,%204th%20Edition.pdf
а так вы каждый шаг спрашивать будите

дебаг можно смотреть так:
asterisk -r
core set verbose 9

как записывать в БД имя файла в статье(линк из первого поста) рассказано, строчки:
              Set(CDR(filename)=${fname}.mp3);
              Set(CDR(realdst)=${called});
макроса
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: owl от 12 Сентября 2015, 15:47:16
Спасибо, буду разбираться
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: rogembaum от 15 Сентября 2015, 11:28:33
Всем привет!
Есть вопрос по такому моменту. Все настроил как по вашей статье на хабре, все работает, НО каждый звонок дублируется (то есть когда делаем select * from cdr; - видим 2 записи, вместо одной).
Соответственно, в веб-интерфейсе отображается также 2 позиции.
Подскажите, куда копать?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: profiton от 15 Сентября 2015, 12:55:32
Всем привет!
Есть вопрос по такому моменту. Все настроил как по вашей статье на хабре, все работает, НО каждый звонок дублируется (то есть когда делаем select * from cdr; - видим 2 записи, вместо одной).
Соответственно, в веб-интерфейсе отображается также 2 позиции.
Подскажите, куда копать?

У вас в базе тоже дубликаты записей или только в веб-интерфейсе ? Если в базе тоже дубликаты, то, возможно, у вас установлен Asterisk 13.
В Asterisk 13 версии есть такой баг.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: keaf от 04 Февраля 2016, 06:20:53
Имеем:
PBX Elastix 2.5
asterisk CDR viewer MOD версии 2.2.5
Изменены параметры в config.inc.php:
$system_column_name = 'recordingfile';
$system_monitor_dir = '/var/spool/asterisk/monitor';

Так как записи разговоров преобразуются в mp3 с расширением wav изменен параметр: $system_audio_format = 'wav';
Записи разговоров складываются в таком виде:
ls /var/spool/asterisk/monitor/2016/02/04/
exten-69xx-1xxx-20160204-090435-1454551475.7921.wav  - входящий
q-19xx-1xxx-20160204-094051-1454553650.8091.wav  - очередь
out-1xxx-69xx-20160204-094628-1454553988.8121.wav  - исходящий

Есть несколько вопросов по внедрению asterisk-cdr-viewer:
1. Почему в интерфейсе asdr показываются записи только звонков очереди? Как сделать, чтобы показывались входящие и исходящие звонки? При этом в elastix можно прослушивать все звонки, в базе mysql в таблице тоже запись с ссылкой на разговор есть.
2. На сколько реально разграничить прослушивание звонков по пользователям? Некоторые пользователи должны прослушивать звонки только из группы.
3. Возможно ли сделать вход с помощью пользователя из базы mysql, а не из файла htpasswd? Как лучше это сделать?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 08 Февраля 2016, 23:04:32
keaf,
1. должно все отображаться, по крайней мере у меня так
2 и 3 - наймите PHP программера
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: syjet от 08 Марта 2016, 22:13:53
profiton, вы еще поддерживаете свою версию Asterisk CDR Viewer Mod?
А то проблемки есть, и смотрю на гите вы давно не появляетесь...
1.
При выборе доп. опции Параллельные звонки выдается ошибка:
Цитата
PDO::errorInfo(): Array (
  • => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY unix_timestamp(calldate) ASC LIMIT 100' at line 1 )
Версия сервера: 5.5.47-0+deb8u1 - (Debian)
Веб-сервер nginx/1.6.2
Версия клиента базы данных: libmysql - 5.5.47
PHP расширение: mysqli
2.
Так же не работают настройки (всегда все фильтры отображаются, независимо от настроек)
### Включение / Отключение показа условий поиска и типов отчетов
## Если 1 - показать, 0 - скрыть
$display_search = array();
# Показ типа отчета - Параллельные звонки
$display_search['chart_cc']=0;
# Показ типа отчета - ASR и ACD (Коэффициент отвеченных вызовов / Средняя продолжительность вызова)
$display_search['asr_report'] = 0;
# Показ условия поиска - Входящий канал
$display_search['channel'] = 0;
# Показ условия поиска - Имя звонящего
$display_search['clid'] = 0;
# Показ условия поиска - DID (Внешний номер)
$display_search['did'] = 0;
# Показ условия поиска - Исходящий канал
$display_search['dstchannel'] = 0;
# Показ условия поиска - Код аккаунта
$display_search['accountcode'] = 0;
# Показ условия поиска - Описание (userfield)
$display_search['userfield'] = 0;
# Показ условия поиска - Приложение
$display_search['lastapp'] = 0;
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 10 Марта 2016, 06:04:25
syjet, думаю быстрее ответит если на гитхабе напишите.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: syjet от 11 Марта 2016, 17:58:53
На гите я оставил, там месяцами некого не было, пришлось сюда писать.
Пока решил тем, что поудалял в коде ненужные фильтры и колонки таблицы.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: killog32 от 11 Апреля 2016, 15:27:02
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no)
exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32  --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${$
exten => s,n,Set(CDR(recordingfile)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(Exit record);


Использовал данный макрос,но вызовы пишуться только на исходящие,что нужно исправить чтобы шла запись и на входящие и на исходящие вызовы?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 12 Апреля 2016, 05:50:16
killog32, неплохо было бы увидеть диалплан на входящие и на исходящие )
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: killog32 от 12 Апреля 2016, 07:56:51
exten => _83XXXXXXXXX,1,Verbose(1,>>> Start of Inter City Call's Processing)
 same => n,Macro(map-to-city,${CALLERID(num)})
same => n,Macro(recording,${CALLERID(num)},${EXTEN})
 same => n,Set(CALLERID(num)=99999${ANOTHERCALLER})
 same => n,Dial(${TELCO}/${EXTEN},,Ttfg)
[macro-map-to-city]
exten => s,1,Goto(s-${ARG1},1)
 same => n,Set(ANOTHERCALLER=${ARG1})
exten => _s-.,1,Set(ANOTHERCALLER=999999)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 13 Апреля 2016, 12:13:53
killog32, ну теперь включай debug(core set verbose 9) и смотри при входящих/исходящих как что отрабатывает
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: wolf_ktl от 13 Мая 2016, 16:14:54
### Название столбца в БД, в котором хранится название записи звонка
$system_column_name = 'recordingfile';



## Если др. значение, то все записи хранятся в одной папке (/var/calls)
$system_storage_format = 2;



### Папка, где находятся записи Asterisk
$system_monitor_dir = '/var/spool/asterisk/monitor'; // без слеша на конце


Не видит файлы


/var/spool/asterisk/monitor/2016/05/13/external-3180-Private-20160513-153548-1463142948.2367.mp3

в базе прописан external-3180-Private-20160513-153548-1463142948.2367.mp3
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 14 Мая 2016, 21:54:31
wolf_ktl, вопрос то в чем?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 01 Июня 2016, 20:06:54
Добрый день
Хочу поделиться скриптом, который я сделал к этому моду, а также хотел бы попросить помощи в реализации разграничения прав.
Для начала поделюсь своим скриптом для автоматического звонка астериском при клике на номер в asterisk-cdr-viewer. Создаём файл (я назвал его dialout.php) и кладём в корень asterisk-cdr-viewer'а с таким содержимым:
<?php
$filename = $_SERVER['REQUEST_TIME'] . '-' . $_GET['from'] . '-' . $_GET['to'] . '.call';
$temp_dn = "/var/spool/asterisk/outgoing_archive/";
$dn = "/var/spool/asterisk/outgoing/";
$fn = $temp_dn . $filename;
$dest_fn = $dn . $filename;
echo "Calling from SIP/" . $_GET["from"] . "\n";
echo "to " . $_GET["to"] . "\n";
echo '<br>';

$fp = fopen($fn,'wt');
$test = fwrite($fp,"Channel: SIP/" . $_GET["from"] . "
CallerID: \"Some Name\" <+380123456789>
MaxRetries : 2
RetryTime: 300
WaitTime: 45
Context: outgoing
Extension: " . $_GET["to"] . "
Priority: 1
Archive: Yes");

if ($test) echo 'File successfully writed';
else echo 'Write file error!';
echo '<br>';
$new_fn = $fn . '.bak';
$test = copy($fn,$new_fn);
if ($test) echo 'File successfully copied';
else echo 'Copy file error!';
echo '<br>';

$test = rename($fn,$dest_fn);
if ($test) echo 'File successfully moved';
else echo 'Move file error!';
?>
(Всякие выводы можно опустить, ни разу не сталкивался с тем, чтобы выдавались ошибки)
где $temp_dn (/var/spool/asterisk/outgoing_archive/) - это папка, где будет создаваться файл и там будет храниться его копия для истории. Если история не нужна, то закомментируйте код $test = copy($fn,$new_fn);. У этой папки должны быть права o+rw. Когда писал это заметил что у меня Archive было без "с". Сейчас проверить возможности нет, но может этот кусок кода вовсе не нужен с включенной опцией Archive: Yes
$dn (/var/spool/asterisk/outgoing/) - папка астериска, в которую он смотрит постоянно и звонит когда там появляется файл звонка
CallerID, MaxRetries и т.п. подредактируйте в соответствии с настройками вашего сервера и вашими пожеланиями. Астериск вызовет сначала SIP/"from", а когда вы снимете трубку - попытается позвонить на номер "to" через экстеншн "outgoing".
В конфиге inc/config.inc.php нужно установить переменную:
$rev_lookup_url = '/dialout.php?from=' . $cdr_user_name . '&to=' . '%n';
И (не уверен, что нужно, но я на всякий случай сделал) перенести вот эти строки:
// Имя пользователя
$cdr_user_name = getenv('REMOTE_USER');
выше строки с $rev_lookup_url.
Также очень важно, чтобы ваше SIP имя совпадало с логином в asterisk-cdr-viewer (используется именно это имя)
Если я где-то сделал косяк или что-то правильнее сделать по-другому - сообщайте.
__________________________________________________________
И теперь мой вопрос вам: как сделать чтобы одни могли прослушивать звонки, а другие - нет? Не реализовал ли кто ранее такое?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 02 Июня 2016, 11:33:08
Makioro, годная идея со скриптом.
На счет вопроса - я не пробовал сделать, возможно подтянутся еще камрады.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 02 Июня 2016, 21:58:16
И ещё есть необходимость сделать чтобы звонки как-то помечались: дозвонился человек или нет, и перезвонили ему потом или нет
Например, все операторы разговаривали когда человек звонил, он немного в очереди покрутился и положил трубку. И вот если ему потом перезвонили или он сам таки дозвонился чтоб все его предыдущие звонки были отмечены, что контакт с абонентом был. А лучше отмечать красным те записи, которые на текущий момент так и не дозвонились.
И кстати, почему когда человек попал в очередь, а потом положил трубку, статус "Отвечено"? Он же до оператора не дозвонился. Может нужен какой-то другой статус если не удалось связаться?

Опыта у меня в php меньше, чем в астериске. Да и астериском я занят всего полгода - в офисе настраиваю с нуля без всяких веб-интерфейсов. Но желание поучиться есть. Мне бы человека, кто потратит немного времени на подсказки. Гугл, конечно, хорошо, но не всегда знаешь, что именно искать
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 03 Июня 2016, 16:31:37
Я тут разобрал вот этот код:
if ( strlen($cdr_user_name) > 0 ) {
        $is_admin = strpos(",$admin_user_names,", ",$cdr_user_name,");
        if ( $admin_user_names == '*' ) {
                $cdr_user_name = '';
        } elseif ( isset($_REQUEST['action']) && $_REQUEST['action'] == 'logout' ) {
                header('Status: 401 Unauthorized');
                header('WWW-Authenticate: Basic realm="Asterisk"');
                exit;
        } elseif ( $is_admin !== false ) {
                $cdr_user_name = '';
        }
}
И получается, что если залогинившийся пользователь есть в списке админов или список админов "*", то переменной $cdr_user_name присваивается пустота, а потом в коде index.php просто показывают всё подряд в случае если эта переменная пустая, а если не пустая, то показывают только исходящие звонки с этим оператором

Думал добавить переменную типа $oper_user_names, в которую записать часть админов, которым не нужно прослушивать файлы.
Наверное нужно в index.php использовать уже другую переменную, а в эту записывать типа "admin" или "oper", а в индексе уже проверять, если админ или опер, то одно, а если другое, то то же, что и делает сейчас при несовпадении с админами
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 04 Июня 2016, 12:26:47
Вообще, вся эта затея мне нужна чтобы операторы перезванивали тем, кто не дозвонился
Т.к. я придумал сейчас другой способ реализации, то пока на это дело забиваю.
Другой способ: когда абоненту выдаётся сообщение "Все операторы заняты, мы вам перезвоним" его номер буду добавлять в отдельную таблицу (может даже в AstDB), а потом оператору нужно будет набрать какой-то внутренний номер и его соединят с первым недозвонившимся из таблицы. И, соответственно, удалится запись из таблицы. Также нужно удалять записи если человек перезвонил раньше, чем оператор перезвонил ему.
Осталось только реализовать :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 07 Июня 2016, 12:46:13
Цитата
И ещё есть необходимость сделать чтобы звонки как-то помечались: дозвонился человек или нет, и перезвонили ему потом или нет
Например, все операторы разговаривали когда человек звонил, он немного в очереди покрутился и положил трубку. И вот если ему потом перезвонили или он сам таки дозвонился чтоб все его предыдущие звонки были отмечены, что контакт с абонентом был. А лучше отмечать красным те записи, которые на текущий момент так и не дозвонились.
и это доп скриптами обрабатываю при исходящих из колцентра

Цитата
И кстати, почему когда человек попал в очередь, а потом положил трубку, статус "Отвечено"? Он же до оператора не дозвонился. Может нужен какой-то другой статус если не удалось связаться?
какая версия астериска?
пробуй 11-ю, в 13 наломали что-то с CDR  опять

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 07 Июня 2016, 16:56:24
Asterisk у меня 13ой версии. И уже в работе, так что менять не буду наверное.
А вместо пометок звонков в cdr-viewer'e подумываю в диалплане когда доходит до конца ожидания звонка и клиенту проговаривается "Мы вам перезвоним", записывать его номер в базу в отдельную таблицу. А потом оператор освобождается, набирает специальный номер и его соединяет с первым номером из этой таблицы.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: white_joker от 10 Июня 2016, 15:19:27
Подскажите пожалуйста почему сообщения записанные в прошлые дни(3 дня назад) могут быть недоступны для прослушивания?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 13 Июня 2016, 08:25:48
А на диске эти файлы есть?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: white_joker от 14 Июня 2016, 09:27:53
Да конечно. Вот и новые записи добавленные 10.06 стали недоступны для прослушивания.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 14 Июня 2016, 10:16:54
А формат хранения какой выбран?
### Формат хранения файлов записей Asterisk
## Если 1, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"

## Если 2, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/12/01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/12/01"

## Если 3, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"

## Если 4, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/12/01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/12/01"

## Если др. значение, то все записи хранятся в одной папке (/var/calls)
$system_storage_format = 3;

### Папка, где находятся записи Asterisk
$system_monitor_dir = '/var/calls'; // без слеша на конце
У меня, как видно из этого отрывка, выбран 3ий вариант, а для записи вызывается вот такой макрос:
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no)
exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},Europe/Kiev,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(curr_dir=${DIR_RECORDS}${STRFTIME(${EPOCH},Europe/Kiev,%Y)}/${STRFTIME(${EPOCH},Europe/Kiev,%Y-%m)}/${STRFTIME(${EPOCH},Europe/Kiev,%Y-%m-%d
)}/);
exten => s,n,Set(monopt=mkdir -p "${curr_dir}" && nice -n 19 /usr/local/bin/lame -b 32  --silent "${curr_dir}${fname}.wav" "${curr_dir}${fname}.mp3" && rm -f
 "${curr_dir}${fname}.wav" && chmod o+r "${curr_dir}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${curr_dir}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(Exit record);
следующим образом:
exten => s,1,Macro(recording,${CALLERID(num)},${EXTEN})
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: white_joker от 16 Июня 2016, 16:52:12
спасибо все получилось! не настроил скрипт.думалось мне что по умолчанию все читается из одной папки)там в скрипте на хабре ошибочка кстати)у меня так заработало
#!/bin/bash
ye=`date +%Y`
ym=`date +%m`
yd=`date +%d -d '1 day ago'`
ymd=`date +%Y-%m-%d -d '1 day ago'`
mkdir -p /var/calls/$ye/$ym/$yd/
mv /var/calls/*${ymd}* /var/calls/$ye/$ym/$yd/
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 17 Июня 2016, 07:37:47
white_joker, нет там ошибочек ;)
работает он(поправил   :)).

А вообще, можно вот так раскладывать сразу по нужным местам(без скрипта):
macro recording (calling,called) {
        if ("${RECORDING}" = "1"){
              Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called});
      Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)});
      System(mkdir -p ${WAV}/${datedir});
              Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}/${datedir}/${fname}.wav"  "${MP3}/${datedir}/${fname}.mp3" && chmod o+r "${MP3}/${datedir}/${fname}.*");
              Set(CDR(filename)=${fname}.mp3);
      Set(CDR(recordingfile)=${fname}.wav);
              Set(CDR(realdst)=${called});
              MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt});

       };
};
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Ilya28 от 29 Июня 2016, 10:53:33
У себя сделал как на скрине.

В коде вот так

$recorded_file = $row[$system_column_name];
$mycalldate_ymd = substr($row['calldate'], 0, 10); // ymd
$mycalldate_ym = substr($row['calldate'], 0, 7); // ym
$mycalldate_y = substr($row['calldate'], 0, 4); // y
$mycalldate_m = substr($row['calldate'], 5, 2); // m
$mycalldate_d = substr($row['calldate'], 8, 2); // d
$mydate = date("$mycalldate_d.$mycalldate_m.$mycalldate_y");

// -----------------------------------------------

# Файл не найден
$tmpError = '<td class="record_col"><img class="img_notfound" src="img/record_notfound.png"></td>';

# Прослушивание и скачивание
//$tmpRec = '<td class="record_col"><audio src=\"records/$mycalldate_y/$mycalldate_m/$mydate/$recorded_file\" type=\"audio/wav\" controls=\"controls\"></td>';


# Только скачивание
$tmpDl = '<td class="record_col">
<div class="recordBox">
<a href="dl.php?f=[_file]"><img class="img_dl" src="img/record_dl.png"></a>
</div>
</td>
';

// -----------------------------------------------

# Получение имени файла и пути
if ($mycalldate_ymd < $mydate &&  $system_storage_format === 1) {
$rec['filename'] = "$mycalldate_y/$mycalldate_ym/$mycalldate_ymd/$recorded_file";
} else if ($mycalldate_ymd < $mydate && $system_storage_format === 2) {
$rec['filename'] = "$mycalldate_y/$mycalldate_m/$mycalldate_d/$recorded_file";
} else if ($system_storage_format === 3) {
$rec['filename'] = "$mycalldate_y/$mycalldate_m/$mycalldate_d/$recorded_file";
} else if ($system_storage_format === 4) {
$rec['filename'] = "$mycalldate_y/$mycalldate_m/$mydate/$recorded_file";
} else {
$rec['filename'] = $recorded_file;
}

$rec['path'] = $system_monitor_dir.'/'.$rec['filename'];
$rec['filesize'] = file_exists($rec['path']) ? filesize($rec['path'])/1024 : 0;

# аудио
if (file_exists($rec['path']) && $recorded_file && $rec['filesize'] >= $system_fsize_exists && preg_match('#(.*)\.'.$system_audio_format.'$#i', $rec['filename'])) {
        echo " <td><audio src=\"records/$mycalldate_y/$mycalldate_m/$mydate/$recorded_file\" type=\"audio/wav\" controls=\"controls\"</td>";
$tmpRes = str_replace('[_file]', base64_encode($rec['filename']), $tmpDl);

Ох и намучился я с $mydate)
У меня файлы записей кладутся в 2016/06/20.06.2016/.
В конфиге (config.inc.php) указан вариант - $system_storage_format = 4.
В начале пробовал ставить просто как в примере в исходниках - date('Y-m-d').
Ставил date('d-m-Y') - не видит записи).
В итоге так все работает.
Пишу в wav, проигрываю сразу средствами браузера с помощью тега аудио.
А, и еще, не могу избавиться от колонки Описание.
Правка config.inc.php не помогает, в конфиге стоит - 0, для userfield(описание).
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 30 Июня 2016, 05:56:13
А, и еще, не могу избавиться от колонки Описание.
Правка config.inc.php не помогает, в конфиге стоит - 0, для userfield(описание).
убери руками его да и все
*где-то в templates-> form.блаблабла емнип
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 30 Июня 2016, 21:15:30
Вообще-то столбец убирается в index.php
364ая строка
<th class="record_col">Описание</th>
Но не уверен, что оно больше никуда не влияет
N.B. обязательно делайте бэкапы прежде чем удалять куски кода!

А вот чтобы убрать из фильтра, надо в templates/form.tpl.php начиная с 239ой строки удалить целый блок
<? if ($display_search['userfield'] == 1) { ?>
<tr>
<td><input <?php if (isset($_REQUEST['order']) && $_REQUEST['order'] == 'userfield') { echo 'checked="checked"'; } ?> type="radio" id="id_order_userfield" name="order" value="userfield">&nbsp;<label for="id_order_userfield"><D0><9E><D0><BF><D0><B8><D1><81><D0><B0><D0><BD><D0><B8><D0><B5></label></td>
<td><input class="margin-left0" type="text" name="userfield" id="userfield" value="<?php if (isset($_REQUEST['userfield'])) { echo htmlspecialchars($_REQUEST['userfield']); } ?>">
<input <?php if ( isset($_REQUEST['userfield_neg'] ) &&  $_REQUEST['userfield_neg'] == 'true' ) { echo 'checked="checked"'; } ?> type="checkbox" name="userfield_neg" value="true" id="id_userfield_neg"> <label for="id_userfield_neg"><D0><9D><D0><B5></label> &ensp;
<input <?php if (empty($_REQUEST['userfield_mod']) || $_REQUEST['userfield_mod'] == 'begins_with') { echo 'checked="checked"'; } ?> type="radio" name="userfield_mod" value="begins_with" id="id_userfield_mod1"> <label for="id_userfield_mod1"><D0><9D><D0><B0><D1><87><D0><B8><D0><BD><D0><B0><D0><B5><D1><82><D1><81><D1><8F> <D0><BD><D0><B0></label> &ensp;
<input <?php if (isset($_REQUEST['userfield_mod']) && $_REQUEST['userfield_mod'] == 'contains') { echo 'checked="checked"'; } ?> type="radio" name="userfield_mod" value="contains" id="id_userfield_mod2"> <label for="id_userfield_mod2"><D0><A1><D0><BE><D0><B4><D0><B5><D1><80><D0><B6><D0><B8><D1><82></label> &ensp;
<input <?php if (isset($_REQUEST['userfield_mod']) && $_REQUEST['userfield_mod'] == 'ends_with') { echo 'checked="checked"'; } ?> type="radio" name="userfield_mod" value="ends_with" id="id_userfield_mod3"> <label for="id_userfield_mod3"><D0><9A><D0><BE><D0><BD><D1><87><D0><B0><D0><B5><D1><82><D1><81><D1><8F> <D0><BD><D0><B0></label> &ensp;
<input <?php if (isset($_REQUEST['userfield_mod']) && $_REQUEST['userfield_mod'] == 'exact') { echo 'checked="checked"'; } ?> type="radio" name="userfield_mod" value="exact" id="id_userfield_mod4"> <label for="id_userfield_mod4"><D0><A0><D0><B0><D0><B2><D0><BD><D0><BE></label>
</td>
</tr>
<? } ?>
(тут у меня кириллица заменена "<D0><A0><D0><B0><D0><B2><D0><BD><D0><BE>", но думаю разберутся. В общем, надо искать похожий блок с упоминанием userfield


P.S. а не может этот кусок кода не работать из-за вот этой конструкции вначале, где вперемешку идёт html с php? Я в пхп очень слабо разбираюсь.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 01 Июля 2016, 04:45:56
А как на счет short_open_tag ?

Цитата
short_open_tag boolean
Определяет, разрешается ли короткая форма записи (<? ?>) тегов PHP. Если вы хотите использовать PHP совместно с XML, вы можете отключить эту опцию, чтобы беспрепятственно использовать <?xml ?>. В противном случае, вы можете отобразить это при помощи PHP, например: <?php echo '<?xml version="1.0"?>'; ?>. Если же эта опция отключена, вы должны использовать длинную форму открывающего тега PHP (<?php ?>).
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 01 Июля 2016, 09:00:50
Вот блин )
Написал огромное сообщение с кучей кода, а потом только понял что проблема в том, что это у меня в сервере поддержка short_open_tag не включена :)
Если заменить все вхождения "<? " на "<?php ", то всё нормально работает )
Пойду включу short_open_tag :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: glbuffon от 15 Июля 2016, 09:35:54
FessAectan,привет,помоги разобраться.
Установил все работает за исключение прослушивания звонков. Всегда показывает нет записи. Поле в таблицу mysql добавил. Файлы пишутся и кодируются в mp3. Пути все и названия все как в инструкции.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 16 Июля 2016, 15:54:40
glbuffon, привет.
Давай попробуем в рамках форумной переписки сперва...
1. Покажи dialplan
2. Покажи файл с настройками веб-морды
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: glbuffon от 18 Июля 2016, 12:30:00
Диаплан:
Спойлер для скрыто:
; MixMonitor
[macro-recording]
exten => s,1,GoToIf($["${RECORDING}" = "1"]?yes:no)
exten => s,n(yes),Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2});
exten => s,n,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${DIR_RECORDS}${fname}.wav"  "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3");
exten => s,n,Set(CDR(filename)=${fname}.mp3);
exten => s,n,Set(CDR(realdst)=${ARG2});
exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt});
exten => s,n(no),Verbose(Exit record);

[test]
exten => _X.,1,Answer()
exten => _X.,n,Noop(CALLERID - ${CALLERID(num)})
;exten => _X.,n,Set(CALLERID(num)=${CALLERID(num):1})
exten => _X.,n,Macro(recording,${CALLERID(num)},${EXTEN})
exten => _X.,n,Dial(SIP/109)
Файл настройки web-морды
Спойлер для скрыто:
/var/www/inc/config.inc.php   [----]  5 L:[  1+ 0   1/162] *(5   /8048b) 0010 0x00A
<?php

### Mysql
$db_type = 'mysql';
$db_host = 'localhost';
$db_port = '3306';
$db_user = 'asterisk_user';
$db_pass = '232d2edxse3e';
$db_name = 'asterisk';
$db_table_name = 'cdr';
$db_options = array();
// $db_options = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8");

### Максимальное количество записей для вывода ('LIMIT')
$db_result_limit = '100';

### Количество записей, после которых снова будет показана шапка (дата статус...)
$h_step = 30;

### Название столбца в БД, в котором хранится название записи звонка
$system_column_name = 'filename';

### Формат хранения файлов записей Asterisk
## Если 1, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"..
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"

## Если 2, то файлы записей должны распределяться скриптом по папкам в соответствии с датой "/var/calls/2015/12/01".
# Записи за сегодня находятся в "/var/calls", записи за прошедшие даты в папках в соответствии с датой "/var/calls/2015/12/01"

## Если 3, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/2015-01/2015-01-01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/2015-01/2015-01-01"

## Если 4, то файлы записей должны распределяться по папкам Asterisk-ом в соответствии с датой "/var/calls/2015/12/01".
# Записи за все даты находятся в папках в соответствии с датой "/var/calls/2015/12/01"

## Если др. значение, то все записи хранятся в одной папке (/var/calls)
$system_storage_format = 1;

### Папка, где находятся записи Asterisk
$system_monitor_dir = '/var/calls'; // без слеша на конце
Все остальные настройки по умолчанию.

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 18 Июля 2016, 17:46:55
ок, а теперь листинг директории с записями
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: glbuffon от 19 Июля 2016, 09:09:33
FessAectan,вот. Там в конфиге стоит 1 по идее должен по папкам разносить,но не видит и записей от текущего числа.

Спойлер для скрыто:
root@VPNserver:/var/calls# ls -l
итого 476
-rw-r--r-- 1 root root    864 Июл 14 21:17 1468509450.19-2016-07-14-21_17-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 14 21:49 1468511390.21-2016-07-14-21_49-2-494194.mp3
-rw-r--r-- 1 root root  20160 Июл 14 21:50 1468511416.23-2016-07-14-21_50-2-494194.mp3
-rw-r--r-- 1 root root 156672 Июл 14 21:51 1468511464.25-2016-07-14-21_51-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 14 21:54 1468511656.27-2016-07-14-21_54-2-494194.mp3
-rw-r--r-- 1 root root  55872 Июл 14 21:55 1468511691.29-2016-07-14-21_54-2-494194.mp3
-rw-r--r-- 1 root root  46944 Июл 14 22:02 1468512164.31-2016-07-14-22_02-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 09:48 1468554525.33-2016-07-15-09_48-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 09:49 1468554588.35-2016-07-15-09_49-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 09:50 1468554634.37-2016-07-15-09_50-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 09:52 1468554753.39-2016-07-15-09_52-2-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 09:54 1468554819.41-2016-07-15-09_53-2423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 09:55 1468554926.43-2016-07-15-09_55-2423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:16 1468556196.45-2016-07-15-10_16-2423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:16 1468556205.47-2016-07-15-10_16-2494015-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:17 1468556227.49-2016-07-15-10_17-2494015-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:18 1468556252.51-2016-07-15-10_17-2494015-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:19 1468556327.53-2016-07-15-10_18-2423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:22 1468556539.55-2016-07-15-10_22-2264027-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:30 1468557054.57-2016-07-15-10_30-2423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:32 1468557114.59-2016-07-15-10_31-2423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:36 1468557346.61-2016-07-15-10_35-423315-494194.mp3
-rw-r--r-- 1 root root  18720 Июл 15 10:38 1468557507.63-2016-07-15-10_38-423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 10:41 1468557709.65-2016-07-15-10_41-423115-494194.mp3
-rw-r--r-- 1 root root  39744 Июл 15 15:26 1468574748.67-2016-07-15-15_25-asterisk-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 15:27 1468574827.69-2016-07-15-15_27-423115-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 15:27 1468574853.71-2016-07-15-15_27-asterisk-494194.mp3
-rw-r--r-- 1 root root    864 Июл 15 16:34 1468578844.74-2016-07-15-16_34-423115-494194.mp3
-rw-r--r-- 1 root root  48960 Июл 15 16:34 1468578876.75-2016-07-15-16_34-423115-494194.mp3

Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 19 Июля 2016, 13:16:55
glbuffon, по папкам разносить может либо отдельный скрипт, либо сам астериск.
Вот пример диалплана, где астер сам пихает как нужно файлы
globals {
    WAV=/var/calls; //Временный каталог с WAV
    MP3=/var/calls; //Куда выгружать mp3 файлы
    RECORDING=1; // Запись, 1 - включена.
};

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

       };
};

В данном случае
$system_storage_format = 4;
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: glbuffon от 19 Июля 2016, 13:34:04
FessAectanс значением 4 без изменений. Ставил отличное число (вроде как тогда должны быть все записи в одной папке) такая же ситуация,запись ищется а прослушать нет файла.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 19 Июля 2016, 15:21:44
Значение 4 должно быть для варианта диалплана, который приведён FessAectan'ом. А для того диалплана, что приводил ты, нужен ещё скрипт, который еженочно разносит по папкам звонки
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 19 Июля 2016, 18:40:30
glbuffon, все точно так, как сказал камрад Makioro - почитай статью и данный тред внимательнее.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: glbuffon от 19 Июля 2016, 22:08:51
Makioro Понял про что ты говорил. У меня стоит $system_storage_format = 1; значит нужен скрипт:
Спойлер для скрыто:
#!/bin/bash
y=`date +%Y`
ym=`date +%Y-%m -d "-1 day"`
ymd=`date +%Y-%m-%d -d "-1 day"`
mkdir -p /var/calls/$y/$ym/$ymd/
mv /var/calls/*$ymd* /var/calls/$y/$ym/$ymd/

я его добавил по папкам стал делать сортировку но результат такой же.  Про значение 4 да ступил)) У меня даже не возможно прослушать записи и от текущего числа которые вроде как хранятся в папке /var/calls/.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 19 Июля 2016, 22:36:03
Рекомендую сделать как предложил FessAectan - чтобы астериск сам по папкам всё раскидывал
Я так сделал и никаких проблем не испытывал.
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Yunihiko от 27 Июля 2016, 11:54:47
Добрый день!
Пользуемся тысячу лет, появилась необходимость добавить в раздел поиск channel и dstchannel
раскомментировал строчки
но при попытке поиска ошибка
PDO::errorInfo(): Array ( [0] => 42000 [1] => 1064 [2] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'channel LIKE 'sip%' ) LIMIT 100' at line 1 )
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 31 Июля 2016, 16:43:01
Yunihiko, вангую, что вы где-то ошиблись...
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Ilya28 от 01 Августа 2016, 09:59:32
glbuffon, посмотри мои посты на прошлой странице, может у тебя с датой что-то, или с символьной ссылкой на папку...






     
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Yunihiko от 03 Августа 2016, 12:33:38
где например
какие куски кода выложить?
я же не спорю что мог ошибиться, просто не могу найти ошибку
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 06 Августа 2016, 13:21:15
раскомментировал строчки
какие сточки?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: goro от 05 Сентября 2016, 20:24:23
Уважаемый FessAectan, а ели мне нужен только русский язык, и я не хочу ничего менять в чистом CDR...
Есть такой вариант?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 06 Сентября 2016, 15:37:04
goro, да, уважаемый goro, такой вариант есть.
Все просто, берете чистый ACDR и пилите его под себя, как это сделал я


Updated: 06 September 2016, 15:43:16

А еще можете попробовать мою новую систему - https://vk.com/fessaectan_reo?w=wall91572403_1300%2Fall
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: goro от 07 Сентября 2016, 20:31:04
goro, да, уважаемый goro, такой вариант есть.
Все просто, берете чистый ACDR и пилите его под себя, как это сделал я


Updated: 06 September 2016, 15:43:16

А еще можете попробовать мою новую систему - https://vk.com/fessaectan_reo?w=wall91572403_1300%2Fall


На вид супер, именно то что нужно. Как попробовать?
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: Makioro от 08 Сентября 2016, 18:08:07
Я бы тоже хотел пощупать :)
Название: Прослушивание звонков из asterisk-cdr-viewer
Отправлено: FessAectan от 09 Сентября 2016, 17:24:49
goro, Makioro, сорри, был оффлайн.
Заявки можно прислать на ceo@vistep.ru или в скайп - fessae
Название: Статистика и прослушивание звонков asterisk
Отправлено: FessAectan от 23 Ноября 2016, 12:30:22
Обновление!
https://habrahabr.ru/post/315910/
Название: Статистика и прослушивание звонков asterisk
Отправлено: uralits от 26 Декабря 2016, 08:56:50
кто-то уже решил проблему с монитором непринятых вызовов?
у нас есть такая закладка в статистике, но работает не в полном объеме, оператор перезванивает, но телефон остается на страничке или человек первым дозвонился и ему ответили, но его первые попытки дозвона без ответа остаются в этом мониторе и оператор снова звонит, хотя они уже общались ранее, получаются такие неприятные нестыковки, когда клиент говорит - зачем вы звоните, мы же уже общались. У кого то есть нормальный код обработки базы данных по звонкам для вывода на MNV? Я могу опубликовать наш вариант (если кто-то сможет доработать наш код или предложат свой за опр.оплату - буду признателен, если ваш  вариант будет работать, то оплатим работу):



Спойлер для скрыто:
<?php


ini_set('display_errors', 1);
error_reporting(E_ALL ^ E_NOTICE);


include ("../admin/config/cfg.php");
global $cwlang, $cwUserId, $cwUserInfo;


$get_params = filter_input_array(INPUT_GET);


$access_type = $cwUserInfo["access_type"];


if ($access_type) {
    $access_objects = getUserAccess($cwUserId, $access_type);
}




switch ($get_params["action"]) {
    case "getReport":
        $output = getReport($get_params);
        echo $output;
        break;
    case "get_list":
    default:
        //$output = getCalls($get_params);
        header("Content-type: text/json");
        echo json_encode($output);
        break;
    case "xls":
        $date     = explode(" - ", $get_params["filterDate"]);
        $dateFrom = $date[0];
        $dateTo   = $date[1];
        $filename = "Общий_отчет_$dateFrom-$dateTo.xls";
        $val      = getReport($get_params);


        header('Content-Type: text/html; charset=windows-1251');
        header('P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"');
        header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
        header('Cache-Control: no-store, no-cache, must-revalidate');
        header('Cache-Control: post-check=0, pre-check=0', FALSE);
        header('Pragma: no-cache');
        header('Content-transfer-encoding: binary');
        header('Content-Disposition: attachment; filename=' . $filename);
        header('Content-Type: application/x-unknown');


        echo iconv("utf-8", "windows-1251", $val);
        break;




}


function formatNumber($number) {
    $result = $number;
    if ($number) {
        if (strlen($number) == 7) {
            $result = "8342$number";
        }
        elseif (strlen($number) == 8) {
            $result = "8342" . substr($number, 1);
        }
        elseif (strlen($number) == 10) {
            $result = "8$number";
        }
        elseif (strlen($number) == 11) {
            $result = substr_replace($number, "8", 0, 1);
        }
        elseif (strlen($number) == 12) {
            $result = substr($number, 1);
        }
    }
    return $result;
}


function getReport($params) {


    global $db, $access_objects, $access_type;


    $table = "calls_v2";
    $table_join = "cdr";


    $html  = "";
    $calls = array();
    $date  = explode(" - ", $params["filterDate"]);


    $dateFrom = new DateTime($date[0]);
    $dateTo   = new DateTime($date[1]);


    $dateTo->modify('+1 day');


    $dateFrom = date_format($dateFrom, "Y-m-d H:i:s");
    $dateTo   = date_format($dateTo, "Y-m-d H:i:s");


    $filterGroup = trim($params["filterGroup"]);










/*
    $sql = "SELECT `$table`.`type`, `$table`.`calldate`, `$table`.`src`, `$table`.`dst`, `$table`.`group` AS `group_name`
            FROM `$table`
            WHERE (`$table`.`calldate` BETWEEN '$dateFrom' AND '$dateTo' )  ";
*/






    $sql = "SELECT `$table`.`type`, `$table`.`calldate`, `$table`.`src`, `$table`.`dst`, `$table`.`group` AS `group_name`, `$table_join`.`userfield`
            FROM `$table`
            LEFT JOIN `$table_join` /* слияние таблиц */
            ON `$table`.`linkedid` = `$table_join`.`linkedid` /* условие слияния - одинаковые поля linkedid */
            WHERE (`$table`.`calldate` BETWEEN '$dateFrom' AND '$dateTo' ) && (`$table_join`.`calldate` BETWEEN '$dateFrom' AND '$dateTo' )  ";










    if (!empty($params["filterGroup"])) {
        $sql .= " AND $table.`group` LIKE'%{$filterGroup}%'";
    }


    $sql .= " AND `$table`.`type` = 'incoming'
            AND `$table`.`disposition` <> 'ANSWERED'
            AND `$table`.`src` <> 'Неизвестный'";


    if ($access_objects) {
        $objects = implode("|", $access_objects);
        switch ($access_type) {
            case "groups":
                $sql .= " AND `group` REGEXP '^$objects$'";
                break;
            case "numbers":
                $sql .= " AND (`src` REGEXP '^$objects$' OR `dst` REGEXP '^$objects$' OR `dst_answer` REGEXP '^$objects$' OR `last` REGEXP '^$objects$' )";
                break;
            default :
                break;
        }
    }


    $sql .= " ORDER BY `$table`.`calldate` DESC";


    $incoming = $db->GetAll($sql);






    $sql = "SELECT `$table`.`type`, `$table`.`calldate`, `$table`.`src`, `$table`.`dst`, `$table`.`group` AS `group_name`
            FROM `$table`
            WHERE (`$table`.`calldate` BETWEEN '$dateFrom' AND NOW() )";






    if (!empty($params["filterGroup"])) {
        $sql .= " AND $table.`group` LIKE '%{$filterGroup}%'";
    }


    if ($access_objects) {
        $objects = implode("|", $access_objects);
        switch ($access_type) {
            case "groups":
                $sql .= " AND `group` REGEXP '^$objects$'";
                break;
            case "numbers":
                $sql .= " AND (`src` REGEXP '^$objects$' OR `dst` REGEXP '^$objects$' OR `dst_answer` REGEXP '^$objects$' OR `last` REGEXP '^$objects$' )";
                break;
            default :
                break;
        }
    }


    $sql .= " AND `$table`.`type` = 'incoming'
            AND `$table`.`src` <> 'Неизвестный'
            AND `$table`.`disposition` = 'ANSWERED'";


    $sql .= " ORDER BY `$table`.`calldate` DESC";


    $dblincoming = $db->GetAll($sql);


    $sql = "SELECT $table.type, $table.calldate, $table.src, $table.dst, $table.disposition, `$table`.`group` AS `group_name`
            FROM $table
            WHERE ($table.calldate BETWEEN '$dateFrom' AND NOW() )
            AND $table.type = 'outgoing'
            AND $table.disposition = 'ANSWERED'";




    /*if ($access_objects) {
        $objects = implode("|", $access_objects);
        switch ($access_type) {
            case "groups":
                $sql .= " AND `group` REGEXP '^$objects$'";
                break;
            case "numbers":
                $sql .= " AND (`src` REGEXP '^$objects$' OR `dst` REGEXP '^$objects$' OR `dst_answer` REGEXP '^$objects$' OR `last` REGEXP '^$objects$' )";
                break;
            default :
                break;
        }
    }*/


    $sql .= " ORDER BY $table.calldate DESC";


    $outgoing = $db->GetAll($sql);


    foreach ($incoming as $row) {
        $number = formatNumber($row["src"]);
        if ($row["group_name"]) {
            $group = explode(",", $row["group_name"]);
            for ($i = 0; $i < count($group); $i++) {
                if (!empty($params["filterGroup"]) && trim($group[$i]) != $filterGroup) {
                    continue;
                }
                else {
                    /* DE edit -----------------------------------------------------------
                    $calls[$number][] = array("calldate" => $row["calldate"], "group" => $group[$i], "dst" => $row["dst"]);
                    ---------------------------------------------------------------DE edit*/
                    $calls[$number][] = array("calldate" => $row["calldate"], "group" => $group[$i], "dst" => $row["dst"], "userfield" => $row["userfield"] );


                }
            }
        }
        else {
            /* DE edit -------------------------------------------------------------------- Добавил запись поля userfield в массив
            $calls[$number][] = array("calldate" => $row["calldate"], "group" => $row["group_name"], "dst" => $row["dst"]);
            ------------------------------------------------------------------------DE edit */
            $calls[$number][] = array("calldate" => $row["calldate"], "group" => $group[$i], "dst" => $row["dst"], "userfield" => $row["userfield"] );


        }
    }


    foreach ($dblincoming as $row) {
        $number = formatNumber($row["src"]);
        if ($row["group_name"]) {
            $group = explode(",", $row["group_name"]);
            for ($i = 0; $i < count($group); $i++) {
                if (!empty($params["filterGroup"]) && trim($group[$i]) != $filterGroup) {
                    continue;
                }
                else {
                    $dblcalls[$number][] = array("calldate" => $row["calldate"], "group" => $group[$i], "dst" => $row["dst"]);
                }
            }
        }
        $dblcalls[$number][] = array("calldate" => $row["calldate"], "group" => $row["group_name"], "dst" => $row["dst"]);
    }


    foreach ($outgoing as $row) {
        $number             = formatNumber($row["dst"]);
        $recalls[$number][] = $row["calldate"];
    }


    foreach ($calls as $key => $value) {
        if ($dblcalls[$key]) {
            foreach ($value as $k => $v) {
                foreach ($dblcalls[$key] as $dblc) {
                    if (strtotime($dblc["calldate"]) > strtotime($v["calldate"]) && ( $v["group"] == "" || $dblc["group"] == $v["group"])) {
                        //if (strtotime($dblc["calldate"]) > strtotime($v["calldate"]) && $dblc["group"] == $v["group"]) {
                        unset($calls[$key][$k]);
                    }
                    if (count($calls[$key]) == 0) {
                        unset($calls[$key]);
                    }
                }
            }
        }
    }


    foreach ($calls as $key => $value) {
        if ($recalls[$key]) {
            $reDate = strtotime(array_shift($recalls[$key]));
            foreach ($value as $k => $v) {
                if ($reDate > strtotime($v["calldate"])) {
                    unset($calls[$key][$k]);
                }
                if (count($calls[$key]) == 0) {
                    unset($calls[$key]);
                }
            }
        }
    }


    if ($calls) {
        $html .= "<table border='1' class=\"b-noanswer_report\" >";
        $html .= "<thead>";
        $html .= "<tr>";
        $html .= "<th>Дата звонка</th>";
        $html .= "<th>Время звонка</th>";
        $html .= "<th>Внеш. номер</th>";
        $html .= "<th>Группа</th>";
        $html .= "<th>Не отвеченных</th>";
        $html .= "<th>Комментарий</th>";  // добавление еще одной колонки для userfield
        $html .= "</tr>";
        $html .= "<tr>";
        $html .= "<th colspan=2 style='text-align:center'>Номер звонящего</th>";
        $html .= "<th></th>";
        $html .= "<th></th>";
        $html .= "<th></th>";
        $html .= "<th></th>";  // добавление еще одной колонки для userfield
        $html .= "</tr>";
        $html .= "</thead>";
        $html .= "<tbody>";


        foreach ($calls as $key => $value) {
            $html .= "<tr>";
            $html .= "<td colspan=2 style='text-align:center; background:#FABF8F'><b>" . $key . "</b></td>";
            $html .= "<td></td>";
            $html .= "<td></td>";
            $html .= "<td style='text-align:right;color:red'><b>" . count($calls[$key]) . "</b></td>";
            $html .= "<td></td>";  // добавление еще одной ячейки для userfield
            $html .= "</tr>";
            foreach ($value as $k => $v) {
                $html .= "<tr>";
                $html .= "<td style='text-align:center; background:#FDE9D9'>" . date("d.m.Y", strtotime($v["calldate"])) . "</td>";
                $html .= "<td style='text-align:center; background:#FDE9D9'>" . date("H:i:s", strtotime($v["calldate"])) . "</td>";
                $html .= "<td><b>" . $v["dst"] . "</b></td>";
                $html .= "<td>" . $v["group"] . "</td>";
                $html .= "<td></td>";
                $html .= "<td>" . $v["userfield"] . "</td>"; // добавление еще одой ячейки под userfield
                $html .= "</tr>";
            }
        }
        $html .= "</tbody>";
        $html .= "</table>";
    }
    else {
        $html .= "<p>Нет пропущенных звонков</p>";
    }


    return $html;
}