Как организовать запись входящих/исходящих звонков определенных абонентов?

Ссылка скопирована
1 ответ

Добрый день. Имеется необходимость записывать входящие/исходящие звонки определенных абонентов. Все усложняется тем, что маски номеров разнятся и много номеров внутри компании находятся на других АТС. Имеется следующий диалплан:
;============================ОБЩИЙ ПЛАН НАБОРА ДЛЯ 10ХХ НОМЕРОВ
exten = _10XX,1,Noop(${CallStart} ${EXTEN} / Звонок внутри АТС)
same = n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?unavailable)
same = n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?busy)
same = n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?busy)
same = n,Set(REDIRTIME=${DB(TIME/${EXTEN})})
same = n,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
same = n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect)

same = n(redirect),Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},${REDIRTIME})
same = n,Set(CALLERID(num)=гор.номер)
same = n,Playback(${Call_forward})
same = n,Dial(PJSIP/${REDIRECTNUM}@город,${CallTime})
same = n,Playback(${ru-nobodyavail})
same = n,Hangup()

same = n(internal),Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},${CallTime})
same = n,Playback(${ru-nobodyavail})
same = n,Hangup()

same = n(busy),Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},${CallTime},m(busy))
same = n,Playback(${ru-nobodyavail})
same = n,Hangup()

same = n(unavailable),Playback(${ru-nobodyavail})
same = n,Hangup()

;============================ОБЩИЙ ПЛАН НАБОРА ДЛЯ 76ХХ НОМЕРОВ
exten = _76XX,1,Noop(${CallStart} ${EXTEN} / Звонок внутри АТС)
same = n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?unavailable)
same = n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?busy)
same = n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?busy)
same = n,Set(REDIRTIME=${DB(TIME/${EXTEN})})
same = n,Set(REDIRECTNUM=${DB(REDIRECT/${EXTEN})})
same = n,GotoIf($[${ISNULL(${REDIRECTNUM})}]?internal:redirect)

same = n(redirect),Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},${REDIRTIME})
same = n,Set(CALLERID(num)=гор.номер)
same = n,Playback(${Call_forward})
same = n,Dial(PJSIP/${REDIRECTNUM}@город,${CallTime})
same = n,Playback(${ru-nobodyavail})
same = n,Hangup()

same = n(internal),Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},${CallTime})
same = n,Playback(${ru-nobodyavail})
same = n,Hangup()

same = n(busy),Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},${CallTime},m(busy))
same = n,Playback(${ru-nobodyavail})
same = n,Hangup()

same = n(unavailable),Playback(${ru-nobodyavail})
same = n,Hangup()

Не получается внедрить MixMonitor, перед которым сначала будет проверка на наличие в звонке определенного номера, не зависимо это входящий или исходящий. Заранее выражаю большую благодарность за любой совет и помощь =)

Дополнительно:

Писать временно все, потом отдельным скриптом где можно реализовать более гибкую логику удалять лишнее?

  • Saboteur, рассматривал такой вариант, служба безопасности против записи всего подряд, исключительно разрешенные номера, даже если будет чиститься скриптом.
  • Ответы:

    В чём конкретно проблема?
    Можно, например, сделать через внутреннюю базу, проверяя через DB_EXISTS(), что существует ключ record/${EXTEN} или record/${CALLERID(num)}.

    • Добрый день.
      Вы предлагаете добавлять еще один GotoIF?
    • Cipceroid, GotoIF, GosubIF... Реализовать можно по разному.

    Мой пример.

    [internal]  same => _XXX.,Dial(SIP/${EXTEN},60,WwtTrU(sub-mixmonitor,${CALLERID(num)},${EXTEN},${UNIQUEID}))  same => n,HangUp()   [sub-mixmonitor] exten => s,1,Noop(------------MixMonitor---------------) ; same => n,DumpChan() ; same => n,NoCDR()  same => n,Noop(DIALEDPEERNUMBER ${DIALEDPEERNUMBER} )  same => n,Set(FILE_UNIQUEID=${ARG3})  same => n,Noop(UNIQUEID = ${FILE_UNIQUEID})  same => n,GotoIf($[${DB_EXISTS(RECORD/${ARG1})}]?go-record)  same => n,GotoIf($[${DB_EXISTS(RECORD/${ARG2})}]?go-record)  same => n,Goto(end_sub)  same => n(go-record),Set(WAV=/var/spool/asterisk/monitor/${FILE_UNIQUEID})  same => n,Set(filedate=${STRFTIME(${EPOCH},,%Y%m%d_%H-%M-%S)})  same => n,Set(foldername=${STRFTIME(${EPOCH},,%Y/%m)})  same => n,Set(filename=${filedate}_${ARG1:-10}_${ARG2:-10}_${FILE_UNIQUEID})  same => n,Set(MP3=/var/spool/asterisk/monitor/mp3/${foldername}/${filename})  same => n,System(mkdir -p /var/spool/asterisk/monitor/mp3/${foldername})  same => n,Set(monopt=nice -n 19 /usr/bin/lame -b 32  --silent "${WAV}.wav"  "${MP3}.mp3" && rm -rf "${WAV}.wav" && chmod o+r "${MP3}.mp3")  same => n,Noop(${CDR(record)})  same => n,Noop(CHANNEL ${CHANNEL(exten)})  same => n,Set(CDR(realdst)=${ARG2});  same => n,Set(CDR(record)=${FILE_UNIQUEID})  same => n,Set(CDR(recordingfile)=${filename}.mp3)  same => n,MixMonitor(${WAV}.wav,b,${monopt})  same => n(end_sub),return

    [internal] same => _XXX.,Dial(SIP/${EXTEN},60,WwtTrU(sub-mixmonitor,${CALLERID(num)},${EXTEN},${UNIQUEID})) same => n,HangUp() [sub-mixmonitor] exten => s,1,Noop(------------MixMonitor---------------) ; same => n,DumpChan() ; same => n,NoCDR() same => n,Noop(DIALEDPEERNUMBER ${DIALEDPEERNUMBER} ) same => n,Set(FILE_UNIQUEID=${ARG3}) same => n,Noop(UNIQUEID = ${FILE_UNIQUEID}) same => n,GotoIf($[${DB_EXISTS(RECORD/${ARG1})}]?go-record) same => n,GotoIf($[${DB_EXISTS(RECORD/${ARG2})}]?go-record) same => n,Goto(end_sub) same => n(go-record),Set(WAV=/var/spool/asterisk/monitor/${FILE_UNIQUEID}) same => n,Set(filedate=${STRFTIME(${EPOCH},,%Y%m%d_%H-%M-%S)}) same => n,Set(foldername=${STRFTIME(${EPOCH},,%Y/%m)}) same => n,Set(filename=${filedate}_${ARG1:-10}_${ARG2:-10}_${FILE_UNIQUEID}) same => n,Set(MP3=/var/spool/asterisk/monitor/mp3/${foldername}/${filename}) same => n,System(mkdir -p /var/spool/asterisk/monitor/mp3/${foldername}) same => n,Set(monopt=nice -n 19 /usr/bin/lame -b 32 --silent "${WAV}.wav" "${MP3}.mp3" && rm -rf "${WAV}.wav" && chmod o+r "${MP3}.mp3") same => n,Noop(${CDR(record)}) same => n,Noop(CHANNEL ${CHANNEL(exten)}) same => n,Set(CDR(realdst)=${ARG2}); same => n,Set(CDR(record)=${FILE_UNIQUEID}) same => n,Set(CDR(recordingfile)=${filename}.mp3) same => n,MixMonitor(${WAV}.wav,b,${monopt}) same => n(end_sub),return

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Антон С. Ответ

    Для организации записи входящих и исходящих звонков определенных абонентов можно использовать специализированные программные решения или сервисы. В зависимости от потребностей и бюджета, можно выбрать подходящий вариант:

    1. Использование CRM системы: многие CRM системы имеют функционал записи звонков. Такие системы позволяют не только записывать разговоры, но и анализировать их, хранить историю общения с клиентом и многое другое. Некоторые CRM системы, такие как Bitrix24, Zoho CRM, Salesforce, имеют встроенные инструменты для записи звонков.

    2. Использование специализированных VoIP-сервисов: существуют сервисы, специализирующиеся на записи звонков, такие как Aircall, CallRail, CallTrackingMetrics. Они предоставляют возможность записи всех входящих и исходящих звонков, а также аналитику и отчеты по звонкам.

    3. Установка специализированного оборудования: для более надежной и безопасной записи звонков можно установить специализированное оборудование, такое как IP-телефоны с функцией записи разговоров или регистраторы звонков.

    Для организации записи входящих и исходящих звонков определенных абонентов в PHP можно использовать соответствующие библиотеки и API сервисов. Вот пример использования PHP для записи звонков с помощью API Twilio:

    calls->create(
        '+15558675310', // To
        '+15017122661', // From
        array(
            'url' => 'http://demo.twilio.com/docs/voice.xml'
        )
    );
     
    echo $call->sid;
    ?>

    calls->create( '+15558675310', // To '+15017122661', // From array( 'url' => 'http://demo.twilio.com/docs/voice.xml' ) ); echo $call->sid; ?>

    Этот код отправляет POST запрос на Twilio API для создания звонка с записью разговора. Помимо Twilio, существуют и другие сервисы, предоставляющие API для записи звонков, такие как Plivo, Nexmo и другие.

    Надеюсь, это поможет вам организовать запись входящих и исходящих звонков определенных абонентов.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно