Задать вопрос
PhpKip
@PhpKip

Как получить длину и статус разговора из Asterisk а после передать в событие с помощью extensions_custom.conf?

extensions_custom.conf

[globals]
;; Проверьте пути и права на папки - юзер asterisk должен иметь права на запись
;; Сюда будет писаться разговоры
WAV=/var/www/html/callme/records/wav
MP3=/var/www/html/callme/records/mp3

;; По этим путям будет воспроизводится и скачиваться запись
URLRECORDS=https://www.host.ru/callmeplus/records/mp3

;; Адрес для калбека при исходящем вызове
URLPHP=https://www.host.ru/callmeplus

;; Да пишем разговоры
RECORDING=1

;; Это макрос для записи разговоров в нашу папку.
;; Можно использовать и системную запись, но пока пусть будет эта -
;; она работает
[recording]
exten => ~~s~~,1,Set(LOCAL(calling)=${ARG1})
exten => ~~s~~,2,Set(LOCAL(called)=${ARG2})
exten => ~~s~~,3,GotoIf($["${RECORDING}" = "1"]?4:14)
exten => ~~s~~,4,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${calling}-${called})
exten => ~~s~~,5,Set(datedir=${STRFTIME(${EPOCH},,%Y/%m/%d)})
exten => ~~s~~,6,System(mkdir -p ${MP3}/${datedir})
exten => ~~s~~,7,System(mkdir -p ${WAV}/${datedir})
exten => ~~s~~,8,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}/${datedir}/${fname}.wav" "${MP3}/${datedir}/${fname}.mp3" && rm -f "${WAV}/${fname}.wav" && chmod o+r "${MP3}/${datedir}/${fname}.mp3")
exten => ~~s~~,9,Set(FullFname=${URLRECORDS}/${datedir}/${fname}.mp3)
exten => ~~s~~,10,Set(CDR(filename)=${fname}.mp3)
exten => ~~s~~,11,Set(CDR(recordingfile)=${fname}.wav)
exten => ~~s~~,12,Set(CDR(realdst)=${called})
exten => ~~s~~,13,MixMonitor(${WAV}/${datedir}/${fname}.wav,b,${monopt})
exten => ~~s~~,14,NoOp(Finish if_recording_1)
exten => ~~s~~,15,Return()

;; Это основной контекст для начала разговора
[ext-did-custom]

;; Это хулиганство, делать это так и здесь, но работает - добавляем к номеру '8'
exten => s,1,Set(CALLERID(num)=8${CALLERID(num)})

;; Тут всякие переменные для скрипта
exten => s,n,Gosub(recording,~~s~~,1(${CALLERID(number)},${EXTEN}))
exten => s,n,ExecIF(${CallMeCallerIDName}?Set(CALLERID(name)=${CallMeCallerIDName}):NoOp())
exten => s,n,Set(CallStart=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})

Смотрю события в логфайлах FreePBX, данные события и не вижу там своих параметров (CallStart, CallMeDISPOSITION)
В extensions.conf есть include extensions_custom.conf, насколько я понял он дефолтно подключается , после добавления скрипта выполнял данную команду fwconsole reload
  • Вопрос задан
  • 137 просмотров
Подписаться 2 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Rust56
Для того, чтобы получить длину и статус разговора в Asterisk, можно использовать переменные CDR(duration) и CDR(disposition), соответственно. CDR (Call Detail Record) - это запись о каждом завершенном звонке, которую Asterisk сохраняет в базе данных. Вы можете использовать эти переменные в своем скрипте для передачи в событие.

Например, для передачи длины разговора и его статуса в событие, можно использовать следующий код в расширении [ext-did-custom]:

exten => s,n,Set(CallEnd=${STRFTIME(epoch,,%s)})
exten => s,n,Set(CallLength=$[${CallEnd}-${CallStart}])
exten => s,n,Set(CallMeDISPOSITION=${CDR(disposition)})
exten => s,n,Event(custom,CallLength:${CallLength},CallMeDISPOSITION:${CallMeDISPOSITION})

Здесь мы добавляем несколько строк кода, чтобы получить длину разговора (CallLength) и статус разговора (CallMeDISPOSITION), а затем вызываем событие с помощью команды Event, чтобы передать эти значения.

Кроме того, убедитесь, что вы настроили Asterisk на запись CDR в базу данных. Вы можете проверить это, выполнив команду cdr show status в консоли Asterisk. Если CDR не записываются в базу данных, то значения переменных CDR(duration) и CDR(disposition) не будут доступны.

После того, как вы внесли изменения в файл extensions_custom.conf, необходимо перезагрузить Asterisk, чтобы изменения вступили в силу. Для этого можно выполнить команду fwconsole reload в консоли сервера FreePBX.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы