Запись разговоров в Asterisk

Запись разговоров в Asterisk

В сегодняшней статье, мы расскажем как выполнить запись разговоров в Asterisk из диалплана. Также приведем пример, в котором запись разговоров для выбранных пользователей будет контролироваться через AstDB. Это означает, что запись разговоров будет производится по умолчанию, а для выбранных пользователей она производится не будет. Для записи разговоров мы будем использоваться GoSub() приложение в Asterisk. Итак, что имеем:

Предварительная настройка Asterisk

Во-первых создадим глобальные переменные для дальнейшего использования. Редактируем файл /etc/asterisk/extensions.conf следующим образом:

[globals]
CONSOLE=Console/dsp
RECORDING=1
DIR_RECORDS=/var/calls
DIAL_PSTN_OPTIONS=trg
DIAL_LOCAL_OPTIONS=tr
RING_TIMER=90

Во-вторых создадим папку для записей и установим права доступа к ней:

mkdir /var/calls
chown -R asterisk:asterisk /var/calls
chmod -R u=rwX,g=rX,o=rX /var/calls

Добавляем общий контекст, по которому мы будем выполнять запись разговоров для входящих и исходящих вызовов. В этот контекст также можно добавить и другие проверки, такие как черный список, запись CDR, подмену CallerID и т.д. Настройки вносим в файл /etc/asterisk/extensions.conf:

;Входящие вызовы с ТфОП
[sub-incoming-PSTN]
exten => _X.,1,NoOp(Вызов на абонента ${EXTEN})
exten => _X.,n,Gosub(sub-recording,${EXTEN},1)
exten => _X.,n,Return()

;Исходящие вызовы в ТфОП
[sub-outgoing-PSTN]
exten => _X.,1,NoOp(Вызов на абонента ${EXTEN})
exten => _X.,n,Gosub(sub-recording,${EXTEN},1)
exten => _X.,n,Return()

В этом же файл (/etc/asterisk/extensions.conf) ниже добавляем GoSub() для записи разговоров:

;Запись разговоров
[sub-recording]
exten => _X.,1,Gotoif($["${DB(NORECORDING/${EXTEN})}" = "1"]?norec)
exten => _X.,n,Gotoif($["${DB(NORECORDING/${CALLERID(num)})}" = "1"]?norec)
exten => _X.,n,GoToIf($["${RECORDING}" = "1"]?mp3)
exten => _X.,n,GoToIf($["${RECORDING}" = "2"]?wav:no)
exten => _X.,n(mp3),Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y.%m.%d-%H.%M.%S)}-${CALLERID(num)}-Called-to-${EXTEN}-${UNIQUEID})
exten => _X.,n,Set(CALLDIRNAME=${STRFTIME(${EPOCH},,%Y/%Y-%m/%Y-%m-%d)})
exten => _X.,n,System(mkdir ${DIR_RECORDS}/${CALLDIRNAME})
exten => _X.,n,Set(wavtomp3=nice -n 19 /usr/bin/lame -b 32  --silent "${DIR_RECORDS}/${CALLDIRNAME}/${CALLFILENAME}.wav"  "${DIR_RECORDS}/${CALLDIRNAME}/${CALLFILENAME}.mp3" && rm -f "${DIR_RECORDS}/${CALLDIRNAME}/${CALLFILENAME}.wav" && chmod o+r "${DIR_RECORDS}/${CALLDIRNAME}/${CALLFILENAME}.mp3")
exten => _X.,n,Set(CDR(recordingfile)=${CALLFILENAME}.mp3)
exten => _X.,n,Set(CDR(filename)=${CALLFILENAME}.mp3)
exten => _X.,n,MixMonitor(${DIR_RECORDS}/${CALLDIRNAME}/${CALLFILENAME}.wav,b,${wavtomp3})
exten => _X.,n,Goto(no)
exten => _X.,n(wav),Set(CALLFILENAME=${STRFTIME(${EPOCH},,%Y.%m.%d-%H.%M.%S)}-${CALLERID(ANI-num)}-Called-to-${EXTEN}-${UNIQUEID})
exten => _X.,n,Set(CDR(recordingfile)=${CALLFILENAME}.wav)
exten => _X.,n,Set(CDR(filename)=${CALLFILENAME}.wav)
exten => _X.,n,MixMonitor(${DIR_RECORDS}/${CALLDIRNAME}/${CALLFILENAME}.wav,b)
exten => _X.,n,Goto(no)
exten => _X.,n(no),Verbose(Exit record)
exten => _X.,n(norec),Return()

Запись исходящих звонков

Для записи исходящих вызовов настроим (для примера) маршрутизацию на мобильные номера. Для этого в файле /etc/asterisk/extensions.conf добавляем:

[out-mobile]
exten => _89XXXXXXXXX,1,Goto(allow-out,${EXTEN},1)

[allow-out]
exten => _X.,1,Log(NOTICE, RDNIS: ${CALLERID(rdnis)}  DNID: ${CALLERID(dnid)} CLID: ${CALLERID(num)})
exten => _X.,n,Set(CDR(realsrc)=${CALLERID(num)})
same => n,Gosub(sub-outgoing-PSTN,${EXTEN},1)
same => n,Goto(to-pstn,${EXTEN},1)

[to-pstn]
exten => _X.,1,NoOP(Набор с номера ${CALLERID(num)} на абонента ${EXTEN} RDNIS="${CALLERID(rdnis)}" )
exten => _X.,n,Dial(${TRUNK_PSTN}/${EXTEN},${RING_TIMER},${DIAL_PSTN_OPTIONS})
exten => _X.,n,Hangup(19)

include => hangupcause

[hangupcause]
exten => h,1,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_KEYS()})
same => n(begin),GotoIf($[${LEN(${HANGUPCAUSE_STRING})}=0]?exit)
same => n,Set(ARRAY(item)=${HANGUPCAUSE_STRING})
same => n,Set(HANGUPCAUSE_STRING=${HANGUPCAUSE_STRING:${LEN(${item})}})
same => n,NoOp(Channel ID:  ${item})
same => n,NoOp(SIP cause:  ${HANGUPCAUSE(${item},tech)})
same => n,NoOp(Ast cause:  ${HANGUPCAUSE(${item},ast)})
same => n,Set(CDR(hangupcause)=${HANGUPCAUSE(${HANGUPCAUSE_KEYS()},tech)})
same => n(exit),NoOp(${IF($["${LEN(${HANGUPCAUSE_STRING})}" = 0]?"HANGUPCAUSE отсутствует":"")})

Запись входящих звонков

На SIP-транке с оператором мы используем контекст [from-pstn]. Соответственно добавляем:

[from-pstn]
exten => 495XXXXXXX,1,Gosub(sub-incoming-PSTN,${EXTEN},1)
exten => 495XXXXXXX,n,Dial(SIP/100,${RING_TIMER},${DIAL_PSTN_OPTIONS})

где:

  • 495XXXXXXX – номер в установленном формате, который вы получаете от оператора связи;
  • SIP/100 – внутренний номер, на который терминируется вызов;

В качестве места терминации может быть любой приложение: IVR, Voicemail, FollowMe и др.

  • ${RING_TIMER} – глобальная переменная, установленная выше, определяющая время дозвона;
  • ${DIAL_PSTN_OPTIONS} – опции вызова команды Dial().

Контроль SIP-аккаунтов в AstDB

Для абонентов, запись разговоров которых не требуется производить в диалплане создана ветка AstDB NORECORDING. Поэтому для того чтобы отключить запись по конкретному SIP-аккаунту необходимо всего лишь добавить его в эту ветку командой из консоли Asterisk:

database put NORECORDING 100 1

где:

  • NORECORDING – семейство AstDB, исключающее запись разговоров;
  • 100 – Внутренний номер (SIP-аккаунт)

 


Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.