Страница 1 из 1

Сокрытие callerID при отправке его абоненту

Добавлено: 12 дек 2020, 11:52
Devorian
Всем добрый день,
возникла, как выяснилось, для меня, не тривиальная задача. Перерыл весь интернет и единственное что близкое нашел это вот эта ссылка:
https://community.asterisk.org/t/can-i- ... risk/68198

Проблема что это опять же не решение проблемы.
Собственно задача/проблема:
Есть внешний транк с внешним номером, на него прилетают звонки. За транком астериск, за астериском очередь, за очередью - абоненты. Ко всему этому привязана CRM - Odoo.
Вся суета вокруг дивана связана с конфиденциальностью - операторы воруют данные о клиентах и сливают их налево. Требуется чтобы сделать так, чтобы Asterisk как либо (я лично вижу ENCODE_64 как не плохой вариант) искажал данные о номере при отправке на абонентское устройство и в CRM. Но искажал не в одну сторону, а чтобы по такому номеру, сохранённому в БД CRM можно было еще и перезвонить. Ну и отправив его другому абоненту АТС, вне колл-центра, чтобы он также мог с софт-фона его набрать.

Re: Сокрытие callerID при отправке его абоненту

Добавлено: 14 дек 2020, 11:39
ded
Мы проделали такую работу, по заказу, для компании по недвижимости, которая столкнулась с такой же проблемой. И точно так же предложили base64, так как в Астериске есть встроенные функции BASE64_DECODE BASE64_ENCODE, которые несложно встроить в диалплан.
Set(${BASE64_ENCODE($CALLERID(num)})
и, соответственно, в CRM отражались нетелефонные номера, а base64 значения, Но были кликабельны, и при отправке в Астериск - обратное превращение
Dial(SIP/trunk/${BASE64_DECODE(dest)})

И знаете с чем столкнулись дальше? Хитроумные риэлтеры во время разговора просто просили уточнить номер телефона клиента. И против этого приёма - только тотальный линейный контроль разговоров в реальном времени.

Re: Сокрытие callerID при отправке его абоненту

Добавлено: 15 дек 2020, 21:44
Devorian
Хех, великая русская душа. Против лома нет приёма. )

Я не сильно дока в астере, если не сложно, спожможите, мой текущий dial plan:

Код: Выделить всё

[general]
static=yes
writeprotect=no
[globals]
[default]

;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()

;Исходящие звонки
[call-out]
;Звонок на внутренний номер
exten => _XXX,1,Dial(SIP/${EXTEN})
;Звонок на внешний номер
exten => _XXX.,1,Dial(SIP/${EXTEN}@397945)

include => handup-sip

;Входящие звонки
[call-in]
exten => 397945,1,Dial(SIP/100)
Как его правильно прописать под это дело?

Re: Сокрытие callerID при отправке его абоненту

Добавлено: 16 дек 2020, 17:45
Devorian
У меня вот такой dial plan и я хоть убей не понимаю как его привести к желаемому результату:

Код: Выделить всё

[general]
static=yes
writeprotect=no

[globals]
DIR_RECORDS=/mnt/calls/
[default]

;Вешаем трубку
[handup-sip]
exten => _X!,1,HangUp()



;[recording]
;exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2})
;exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3")
;exten => s,n,Set(CDR(filename)=${fname}.mp3)
;exten => s,n,Set(CDR(realdst)=${ARG2})
;exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt})
;exten => s,n(no),Verbose(Exit record)
;exten => s,n,Return()

;Исходящие звонки
[call-out]
;Комната для конференций
exten => 9999,1,Answer()
exten => 9999,n,ConfBridge(1,confer)
;Номер для записи звуков, окончание записи #
exten => _350X, 1, NoOp()
exten => _350X, n, Wait(2)
exten => _350X, n, Playback(beep)
exten => _350X, n, Record(/tmp/music${EXTEN:2}:wav)
exten => _350X, n, Wait(1)
exten => _350X, n, Playback(/tmp/music${EXTEN:2})
exten => _350X, n, Wait(2)
exten => _350X, n, Hangup()
;Управление голосовой почтой
exten => 5000,1,VoiceMailMain()

;Звонок на внутренний номер
;exten => _XXXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXXX,n,Dial(SIP/${EXTEN},10)
exten => _XXXX,n,Set(dstNUM=${EXTEN})
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
exten => _XXXX,n,ChanIsAvail(SIP/${EXTEN},s)
exten => _XXXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
exten => _XXXX,n,Goto(num-${DIALSTATUS},1)
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)

;Звонок на внешний номер
;exten => _XXXX.,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXXX.,1,Dial(SIP/${EXTEN}@164719)

include => handup-sip

;Входящие звонки
[call-in]
exten => 164719,1,Goto(ivr-main,s,1)

[ivr-main]
exten => s,1,Answer()
exten => s,2,Background(/etc/asterisk/ivr/ivr-main)
exten => s,3,WaitExten(5)
;exten => _XXXX,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => _XXXX,1,Dial(SIP/${EXTEN},15)
;Задаем переменную для передачи в голосовую почту
exten => _XXXX,n,Set(dstNUM=${EXTEN})
;Проверяем статус пира, существует или нет
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status)}" = ""]?num-not-exist,1)
;Проверяем статус пира, подключен или нет
exten => _XXXX,n,GotoIf($["${SIPPEER(${EXTEN},status):0:2}" = "UN"]?num-not-connected,1)
;Проверяем канал на занятость
exten => _XXXX,n,ChanIsAvail(SIP/${EXTEN},s)
;Выводим в лог значение функции ChanIsAvail, нужно только для отладки, можно удалить строку
exten => _XXXX,n,NoOp(=========== ChanIsAvail STATUS: ${AVAILSTATUS} ===========)
;Если функция возвращает 2 или 3, значит абонент занят
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 2]?num-BUSY,1)
exten => _XXXX,n,GoToIf($[${AVAILSTATUS} = 3]?num-BUSY,1)
;Обрабатываем остальные статусы
exten => _XXXX,n,Goto(num-${DIALSTATUS},1)
;Если номера не существует говорим "Ошибочный номер, попробуйте еще раз"
exten => num-not-exist,1,Wait(2)
exten => num-not-exist,n,Playback(invalid)
;Если номер не подключен, говорим "Набранный вами номер отключен, проверьте номер и повторите попытку
exten => num-not-connected,1,Wait(2)
exten => num-not-connected,n,Playback(ss-noservice)
;Если номер занят, говорим "Занято"
exten => num-BUSY,1,Wait(2)
exten => num-BUSY,n,Playback(vm-isonphone)
;Если номер не отвечает, включаем голосовую почту
exten => num-NOANSWER,1,Wait(2)
exten => num-NOANSWER,n,Voicemail(${dstNUM},u)
;Если еще по какой-то причине будет статус CHANUNAVAIL, говорим, что номер не доступен в данный момент
exten => num-CHANUNAVAIL,1,Wait(2)
exten => num-CHANUNAVAIL,n,Playback(vm-isunavail)
;Если в голосовом меню не выбрали внутренний номер, адресуем звонок секретарю
;exten => t,1,GoSub(recording,s,1,(${CALLERID(num)},${EXTEN}))
exten => t,1,Queue(secretary,t)