Автор Тема: Статистика и прослушивание звонков asterisk  (Прочитано 179608 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #165 : 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", а в индексе уже проверять, если админ или опер, то одно, а если другое, то то же, что и делает сейчас при несовпадении с админами

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #166 : 04 июня 2016, 12:26:47 »
Вообще, вся эта затея мне нужна чтобы операторы перезванивали тем, кто не дозвонился
Т.к. я придумал сейчас другой способ реализации, то пока на это дело забиваю.
Другой способ: когда абоненту выдаётся сообщение "Все операторы заняты, мы вам перезвоним" его номер буду добавлять в отдельную таблицу (может даже в AstDB), а потом оператору нужно будет набрать какой-то внутренний номер и его соединят с первым недозвонившимся из таблицы. И, соответственно, удалится запись из таблицы. Также нужно удалять записи если человек перезвонил раньше, чем оператор перезвонил ему.
Осталось только реализовать :)

Оффлайн FessAectan

  • Модератор
  • Старожил
  • *****
  • Сообщений: 972
  • Рейтинг: 25
  • Пол: Мужской
  • На пути к просветлению
    • fessae@jabber.ru
    • fessae
    • Просмотр профиля
    • https://vistep.ru/
  • Откуда: vistep.ru
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #167 : 07 июня 2016, 12:46:13 »
Цитировать
И ещё есть необходимость сделать чтобы звонки как-то помечались: дозвонился человек или нет, и перезвонили ему потом или нет
Например, все операторы разговаривали когда человек звонил, он немного в очереди покрутился и положил трубку. И вот если ему потом перезвонили или он сам таки дозвонился чтоб все его предыдущие звонки были отмечены, что контакт с абонентом был. А лучше отмечать красным те записи, которые на текущий момент так и не дозвонились.
и это доп скриптами обрабатываю при исходящих из колцентра

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

Мы переоцениваем себя завтрашнего, поэтому и страдаем прокрастинацией.

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #168 : 07 июня 2016, 16:56:24 »
Asterisk у меня 13ой версии. И уже в работе, так что менять не буду наверное.
А вместо пометок звонков в cdr-viewer'e подумываю в диалплане когда доходит до конца ожидания звонка и клиенту проговаривается "Мы вам перезвоним", записывать его номер в базу в отдельную таблицу. А потом оператор освобождается, набирает специальный номер и его соединяет с первым номером из этой таблицы.

Оффлайн white_joker

  • Новичок
  • *
  • Сообщений: 5
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: SPB
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #169 : 10 июня 2016, 15:19:27 »
Подскажите пожалуйста почему сообщения записанные в прошлые дни(3 дня назад) могут быть недоступны для прослушивания?

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #170 : 13 июня 2016, 08:25:48 »
А на диске эти файлы есть?

Оффлайн white_joker

  • Новичок
  • *
  • Сообщений: 5
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: SPB
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #171 : 14 июня 2016, 09:27:53 »
Да конечно. Вот и новые записи добавленные 10.06 стали недоступны для прослушивания.

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #172 : 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})

Оффлайн white_joker

  • Новичок
  • *
  • Сообщений: 5
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: SPB
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #173 : 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/

Оффлайн FessAectan

  • Модератор
  • Старожил
  • *****
  • Сообщений: 972
  • Рейтинг: 25
  • Пол: Мужской
  • На пути к просветлению
    • fessae@jabber.ru
    • fessae
    • Просмотр профиля
    • https://vistep.ru/
  • Откуда: vistep.ru
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #174 : 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});

       };
};
Мы переоцениваем себя завтрашнего, поэтому и страдаем прокрастинацией.

Оффлайн Ilya28

  • Новичок
  • *
  • Сообщений: 2
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Врн
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #175 : 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(описание).
« Последнее редактирование: 29 июня 2016, 11:03:02 от Ilya28 »

Оффлайн FessAectan

  • Модератор
  • Старожил
  • *****
  • Сообщений: 972
  • Рейтинг: 25
  • Пол: Мужской
  • На пути к просветлению
    • fessae@jabber.ru
    • fessae
    • Просмотр профиля
    • https://vistep.ru/
  • Откуда: vistep.ru
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #176 : 30 июня 2016, 05:56:13 »
А, и еще, не могу избавиться от колонки Описание.
Правка config.inc.php не помогает, в конфиге стоит - 0, для userfield(описание).
убери руками его да и все
*где-то в templates-> form.блаблабла емнип
Мы переоцениваем себя завтрашнего, поэтому и страдаем прокрастинацией.

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #177 : 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? Я в пхп очень слабо разбираюсь.

Оффлайн FessAectan

  • Модератор
  • Старожил
  • *****
  • Сообщений: 972
  • Рейтинг: 25
  • Пол: Мужской
  • На пути к просветлению
    • fessae@jabber.ru
    • fessae
    • Просмотр профиля
    • https://vistep.ru/
  • Откуда: vistep.ru
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #178 : 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 ?>).
Мы переоцениваем себя завтрашнего, поэтому и страдаем прокрастинацией.

Оффлайн Makioro

  • Начинающий
  • *
  • Сообщений: 23
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Ukraine
Прослушивание звонков из asterisk-cdr-viewer
« Ответ #179 : 01 июля 2016, 09:00:50 »
Вот блин )
Написал огромное сообщение с кучей кода, а потом только понял что проблема в том, что это у меня в сервере поддержка short_open_tag не включена :)
Если заменить все вхождения "<? " на "<?php ", то всё нормально работает )
Пойду включу short_open_tag :)