Александр Мисюрин
06.11.2019
158

Голосовая почта через Record, создание веб-интерфейса для прослушки и просмотра

Ранее рассматривалась статья, о кастомизации голосовой почты, для хранения ее в необходимых папках и в необходимом формате. Рассмотрим вариант создания веб-интерфейса для этого функционала. Выводить на страницу будем: дату звонка, номер звонящего, длительность записи. Также, для удобства работы необходимо внести дополнение в прошлую статью, а именно добавить заполнение поля userfield в cdr и добавить к […]

Ранее рассматривалась статья, о кастомизации голосовой почты, для хранения ее в необходимых папках и в необходимом формате. Рассмотрим вариант создания веб-интерфейса для этого функционала.

Все настройки проводились на системе: CentOS 6.9, Asterisk 13.21.0, FreePBX 13.

Выводить на страницу будем: дату звонка, номер звонящего, длительность записи.

Также, для удобства работы необходимо внести дополнение в прошлую статью, а именно добавить заполнение поля userfield в cdr и добавить к имени записи uniqueid (необходимо для поиска файла).

Измененный контекст
Измененный контекст

Указываем функцию подключения к БД (пользователь должен иметь доступ к чтению cdr):

function bd_bridge($db,$q){
                $link = @mysqli_connect('localhost','user','password',$db) or die("Error: ".@mysqli_connect_error($link));
                $rs = @mysqli_query($link, $q) or die("Error: ".@mysqli_error($link));
                if($rs){
                        return $rs;
                        @mysqli_free_result($rs);
                }
                else{
                }
                mysqli_close($link);
        }

Также потребуется функция выгрузки файла с сервера:

function file_force_download($file) {
  if (file_exists($file)) {
    // сбрасываем буфер вывода PHP, чтобы избежать переполнения памяти выделенной под скрипт
    // если этого не сделать файл будет читаться в память полностью!
    if (ob_get_level()) {
      ob_end_clean();
    }
    // заставляем браузер показать окно сохранения файла
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    // читаем файл и отправляем его пользователю
    readfile($file);
    exit;
  }
}

Выводим на страницу поля ввода и кнопки отображения/выгрузки статистики:

echo "<form action='' method=post>
Начало интервала: <input type=datetime-local name=first>
Конец интервала: <input type=datetime-local name=second>
<input type=submit value=Отобразить name=input>
<button type='submit' name='get_csv' value='ok' />Выгрузить</button>
</form>";

Далее обработчики нажатий, первое, если нажата кнопка вывода, в каждом обработчике для отладки выведем строку echo “<pre>”.print_r($_POST,true).”</pre><br>”;

Отладочная информация.
Отладочная информация.
if(isset($_POST['input']))
{
echo "<table border=1><tr><td>Дата вызова</td><td>Номер звонящего</td><td>Длительность сообщения</td><td>Удалить</td></tr>";
	echo "<pre>".print_r($_POST,true)."</pre><br>";
	$first=str_replace("T"," ",$_POST['first']);
	$second=str_replace("T"," ",$_POST['second']);
	echo "$first - $second";
	$result = bd_bridge('asteriskcdrdb',"select calldate, src, billsec, userfield, uniqueid from cdr where userfield like 'voicemail-%' and calldate>='".$first."' and calldate<='".$second."';");
	while ($row = mysqli_fetch_array($result)) 
	{
		echo "<tr>
		<td>".$row[0]."</td>
		<td>".$row[1]."</td>
		<td>".$row[2]."</td>
		<td><audio src='get_file.php?download=".$row[4]."' controls></td>
//используется сторонний скрипт, для прослушивания/выгрузки записи, опишем его ниже.
		</tr>";
	}
	echo "
	</table>
	";
}

Кнопка выгрузки:

if(isset($_POST['get_csv'])){
	
	echo "<pre>".print_r($_POST,true)."</pre><br>";
	$first=$_POST['first'];
	$second=$_POST['second'];
	$result = bd_bridge('asteriskcdrdb',"select calldate, src, billsec, userfield, uniqueid from cdr where userfield like 'voicemail-%' and calldate>='".$first."' and calldate<='".$second."';");
	$fp = fopen("/usr/src/test/voicemails.csv", 'w');
	fputcsv($fp, array('Дата вызова','Номер звонящего','Длительность сообщения'));
	while ($row = mysqli_fetch_array($result)) 
	{
		fputcsv($fp, array($row[0],$row[1],$row[2]));
	}
file_force_download('/usr/src/test/voicemails.csv');
}
Файл выгрузки
Файл выгрузки

Ниже приведу скрипт, для получения файла записи и его воспроизведения:

<?php

if(isset($_GET['download']))
{
	exec("find /var/spool/asterisk/monitor/voicemail/ -name *".$_GET['download']."*",$exec_out);
	if (!empty($exec_out) && file_exists($exec_out[0])) {
		$name=substr($exec_out[0],strrpos($exec_out[0],'/')+1);
		header('HTTP/1.1 200 OK'); // хороший ответ
		header('Expires: 0'); // файл устаревший моментально
		header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); // не кешировать
		header("Accept-Ranges: bytes"); // дискретизация по единице измерения
		header('Content-Description: File Transfer'); // предупреждение о передаче ссылки
		header('Content-Type: audio/wav'); // тип возвращаемого файла
		header('Content-Length: '.filesize($exec_out[0])); // сведения о размере файла
		header('Content-Disposition: attachment; filename='.$name); // передать на скачивание
		readfile($exec_out[0]);
}
}
?>
Следует учесть, что файл формируется без вывода на экран.
Пример работы
Пример работы
При изменении пути хранения записей, можно указывать этот путь в userfield вместе с именем записи
 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices