Как получить/скачать файл записи по Uniqueid?

Интеграция Asterisk и 1С:Предприятие 8.2, 8.1, 7.7
Boivori
Member
Сообщений: 4
Зарегистрирован: 07 окт 2014, 14:32

Как получить/скачать файл записи по Uniqueid?

Сообщение Boivori » 09 окт 2014, 16:12

Здравствуйте! А можно ли при помощи AMI скачать/получить файл записи разговора по Uniqueid? Спасибо.

admin
Администратор
Сообщений: 219
Зарегистрирован: 27 апр 2011, 18:35

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение admin » 12 окт 2014, 14:39

При желании можно, но лучше этого не делать. AMI - это не тот протокол, через который следует передавать файлы.
Используйте HTTP для загрузки файла.

А еще лучше, пусть Asterisk сам воспроизводит пользователю файл записи. В Wiki есть статья на эту тему.

Boivori
Member
Сообщений: 4
Зарегистрирован: 07 окт 2014, 14:32

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение Boivori » 14 окт 2014, 10:15

Спасибо, но дело в том что проигрывать файл нужно в самой 1С, а не через телефон/софтфон.

admin
Администратор
Сообщений: 219
Зарегистрирован: 27 апр 2011, 18:35

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение admin » 14 окт 2014, 11:28

Тогда расшарьте каталог файлов записи по HTTP средствами Apache и забирайте файл через объект HTTPЗапрос

Larkin
Member
Сообщений: 14
Зарегистрирован: 11 мар 2015, 16:33

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение Larkin » 12 мар 2015, 14:16

Вопрос решил следующим образом:
На сервере Http создал php скрипт, в который ч-з GET передаю идентификатор.
Скриптом получаю имя файла из БД и копирую его во временный каталог, формирую html код и проигрываю файл ч-з WEB-плеер (в моем случае тег <audio>).

Со стороны 1С добавил общую форму с элементом "Поле HTML-документа". При открытии формы посылаю запрос с GET строкой к моему скрипту и собственно выполняю воспроизведение файла.

На сервере раз в сутки произвожу очистку временной папки с накопленными файлами.

admin
Администратор
Сообщений: 219
Зарегистрирован: 27 апр 2011, 18:35

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение admin » 17 мар 2015, 00:28

Larkin писал(а):Вопрос решил следующим образом:
На сервере Http создал php скрипт, в который ч-з GET передаю идентификатор.
Скриптом получаю имя файла из БД и копирую его во временный каталог, формирую html код и проигрываю файл ч-з WEB-плеер (в моем случае тег <audio>).

Со стороны 1С добавил общую форму с элементом "Поле HTML-документа". При открытии формы посылаю запрос с GET строкой к моему скрипту и собственно выполняю воспроизведение файла.

На сервере раз в сутки произвожу очистку временной папки с накопленными файлами.


Звучит прекрасно, но...
было бы отлично и просто замечательно, если бы вы:
  • Выложили php-скрипт
  • Выложили скрипт запроса к БД
  • Выложили текст GET-запроса 1С

При всем уважении, без всего этого, ценность поста сомнительная.

P.S.
В Asterisk 10 и выше, легко настраиваются доп. поля CDR. В них можно ложить имя файла записи.
Если я правильно помню, то FreePBX 2.10 и выше "из коробки" использует эту возможность, автоматом добавляет поле "recordingfile" и автоматом-же пишет туда значения. А для прослушивания/скачивания браузером у FreePBX есть готовая страница Recordings

Larkin
Member
Сообщений: 14
Зарегистрирован: 11 мар 2015, 16:33

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение Larkin » 17 мар 2015, 10:57

Выложили php-скрипт
Выложили скрипт запроса к БД
Выложили текст GET-запроса 1С


Для начала - структура каталогов:
На сервере Астериск (Linux CentOS 7) в корневой директории веб сервера добавляю поддиректорию "play" (/var/www/html/play/)
В созданной директории делаю поддиреторию "tmp" (/var/www/html/play/tmp/) в эту папку буду складывать временные файлы записей из основного хранилища Астериск

Теперь по скриптам:
1. index.php (файл вывода результата)

Код: Выбрать все

<?php
    include('./ink.php');
?>

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>play</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/play/main.css">
<link href="style.css" rel="stylesheet" type="text/css">
</head>

<body>
<center>
<div id="wrapper">
<?php
    if(isset($_GET['uid']) && $_GET['uid'] != ''){
            $html = getHTMLdata($_GET['uid'], $link);
            echo $html;
    }
?>
</div>
</center>
<script src="jquery.min.js"></script>
<script src="audioplayer.js"></script>
<script>
    $( function()
        {
            $( 'audio' ).audioPlayer(
            {
            classPrefix: 'audioplayer',
            strPlay: '',
            strPause: '',
            strVolume: ''
            }
            );
        });
</script>

<script src="main.js"></script>

</body>
</html>


2. ink.php - подключение к БД астериска, копирование файла записи, формирование html кода.

Код: Выбрать все

<?php
    $link = mysql_connect('localhost', '<DB_login>', '<DB_PASSWORD>') or die("NO CONNECT");
    mysql_select_db('asteriskcdrdb', $link);
    mysql_query('set character set utf8');

    function getHTMLdata ($uid, $link){
        $sql = "SELECT calldate, recordingfile FROM cdr WHERE uniqueid = '".$_GET['uid']."' LIMIT 1;";
        $result = mysql_query($sql, $link);

        $html = 'Файл не найден.';
        $q = mysql_num_rows($result);

        if($q == 0){
            return $html;
        }

        while($row = mysql_fetch_array($result)){


            $date_explode = explode(" ", $row['calldate']);

            $date = explode("-", $date_explode[0]);
            $time = explode(":", $date_explode[1]);

            $year = $date[0];
            $month = $date[1];
            $day = $date[2];

            $filename = $row['recordingfile'];

            if($filename == ''){
                $html = 'По данному разговору нет записи.';
                return $html;
            }

            $from = '/home/asterisk/dials/'.$year.'/'.$month.'/'.$day.'/'.$filename;
            $to = '/var/www/html/play/tmp/'.$filename;
            if(file_exists($from)){
                if(!file_exists($to)){
                    if (!copy($from, $to)) {
                        $html = 'не удалось скопировать $filename...';
                        return $html;
                    }
                }
            }

            if(file_exists($to)){
                $html = '<audio src="tmp/'.$filename.'" preload="auto" controls></audio><br>
                <center><a href="tmp/'.$filename.'" title="Файл разговора">Скачать файл</a></center>';
            }else{
                $html = 'Не найден файл разговора.';
            }

            return $html;
        }

    }
?>


3. Плеер для воспроизведения файла (тут нужно смотреть по вашей ситуации, я использовал этот: http://osvaldas.info/examples/audio-pla ... -friendly/)

Со стороны 1С добавляю общую форму с единственным реквизитом типа строка, который на форме выведен как поле HTML документа.
При регистрации звонка в 1С (в моем случае это документ "Телефонный звонок") записываю в него уникальный идентификатор звонка из данных внешнего события.
В местах, где необходимо прослушать разговор (панель телефонии, документ, и т.к.), на форме, делаю вызов общей формы с передачей в нее уникального идентификатора из документа

Код: Выбрать все

&НаКлиенте
Процедура ПрослушатьИстория1С(Команда)
   ТекДанные = Элементы.СписокВзаимодействий.ТекущаяСтрока;
   Если ТекДанные = Неопределено Тогда
      Возврат;
   КонецЕсли;
   
   Ключ = ПолучитьКлючЗвонка(ТекДанные);
   Если Ключ = "" Тогда
      Возврат;
   КонецЕсли;
   
   ПараметрыФормы = Новый Структура("Ключ", Ключ);
   
   ОткрытьФорму("ОбщаяФорма.ТелефонияФормаПрослушиванияРазговора", ПараметрыФормы, Неопределено, "ФормаПрослушиванияРазговора", ВариантОткрытияОкна.ОтдельноеОкно, , ,РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

&НаСервере
Функция ПолучитьКлючЗвонка(ТекДанные)
   Возврат СокрЛП(ТекДанные.Ссылка.ИдентификаторАТС);
КонецФункции


в общей форме при создании на сервере делаю формирование обращения к серверу Астериск для вывода плеера в поле html документа

Код: Выбрать все

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)   
   Сервер = ДоработкиСервер.ПолучитьЗначениеКонстанты(Справочники.Константы.IPТелефония_Адрес, Тип("Строка"), Ложь);
   Если Сервер = Неопределено Тогда
      Отказ = Истина;
      Возврат;
   КонецЕсли;
   
   ПолеHTML = "http://"+Сервер+"/play/index.php?uid="+Параметры.Ключ;
КонецПроцедуры


Очистка временной папки по крону пока не делал.

admin
Администратор
Сообщений: 219
Зарегистрирован: 27 апр 2011, 18:35

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение admin » 17 мар 2015, 12:17

Супер!
Думаю, народ вам будет очень благодарен. Работающий пример - это лучше любого учебника

mih_io
Member
Сообщений: 4
Зарегистрирован: 13 ноя 2015, 10:13

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение mih_io » 04 дек 2015, 00:54

admin писал(а):В Asterisk 10 и выше, легко настраиваются доп. поля CDR. В них можно ложить имя файла записи.


У меня 11-ая версия. Можете подсказать как в CDR событие в AMI добавить поле о том, какое было имя файла записи или подсказать в какую сторону копать?

Автоматическую запись настроил, в CDR Report веб интерфейса FreePBX я этот файл вижу. Не могу добиться что бы имя файла приходило в CDR event AMI.

admin
Администратор
Сообщений: 219
Зарегистрирован: 27 апр 2011, 18:35

Re: Как получить/скачать файл записи по Uniqueid?

Сообщение admin » 04 дек 2015, 10:19

mih_io писал(а):Автоматическую запись настроил, в CDR Report веб интерфейса FreePBX я этот файл вижу. Не могу добиться что бы имя файла приходило в CDR event AMI.


Можно в теории. Для этого берете исходники Asterisk, он написан на чистом C и переписываете либу cdr.so


Вернуться в «ROM-Asterisk. 1С и Телефония»

cron