516 просмотров
от (640 баллов) в категории Тонкая настройка
редактировать от

Всем привет

Прочитал вот эту статью и захотел переделать скрипт под MikoPbx, но с сожалению знаний не хватает, потому скрипт ниже не работает у меня.

Смысл общий такой, что если прошел звонок на определенного провайдера, то затем, после окончания вызова и при нажатии на "20" предыдущий определившийся номер попадает автоматически в blacklist (спам-лист). 

Подскажите пожалуйста, как можно этот код переделать, чтобы он работал и работал не только с одним провайдером, а со всеми?

[SIP-1634042845-incoming-custom]

exten => _X!,1,Set(_From=${CALLERID(name)}) 

    same => n,GotoIf(${BLACKLIST()}?banned)

    same => n,Set(DB(ToMe/LastCaller)=${From})

    same => n,Hangup()

    same => n(banned),Answer()

    same => n,Hangup()

    

[all_peers-custom]

exten => 20,1,Set(tmp=${DB(ToMe/LastCaller)})

    same => 20,n,Set(DB(blacklist/${tmp})=1)

    same => n,return

1 Ответ

от (2.8 тыс. баллов)

Можно попробовать в add-trim-prefix-clid-custom.

  • add-trim-prefix-clid-custom - этот контекст используется при обработке входящих вызовов, лучшим образом подходит для нормализации входящего номера телефона, добавить / отсечь префикс
от (640 баллов)
Сам код не работает. Есть возможность помочь?
от (2.8 тыс. баллов)

Нужно проверять, но я так понимаю и не будет работать.

По вашему коду сделал бы так:

[SIP-1634042845-incoming-custom]

exten => _X!,1,Set(__From=${CALLERID(num)}) 

    same => n,GotoIf($[${BLACKLIST()}=1]?banned)

    same => n,return

    same => n(banned),Answer()

    same => n,Hangup()

    

[all_peers-custom]

exten => 20,1,Set(DB(blacklist/${From})=$From)

    same => n,return

Но что-то мне не нравиться в компоновке. Попробуйте.

__From - с двумя подчеркиванием впереди становится глобальной переменной, видной в любом контексте и наследоваться неограниченное количество раз

_From - с одним подчеркиванием будет наследоваться один раз. 

от (640 баллов)

Пока код выдает ошибку, следующего характера в asterisk/messages

[2021-10-13 07:12:15] NOTICE[16423] sorcery.c: Type 'system' is not reloadable, maintaining previous values

[2021-10-13 07:12:15] NOTICE[2745] chan_iax2.c: Ignoring bindport on reload

[2021-10-13 07:12:15] NOTICE[2745] chan_iax2.c: Ignoring bindaddr on reload

[2021-10-13 07:12:15] NOTICE[2745] app_queue.c: queuerules.conf has not changed since it was last loaded. Not taking any action.

[2021-10-13 07:12:15] NOTICE[2765] chan_iax2.c: Ignoring bindport on reload

[2021-10-13 07:12:15] NOTICE[2765] chan_iax2.c: Ignoring bindaddr on reload

[2021-10-13 07:12:15] Asterisk 16.16.2 built by root @  on a x86_64 running Linux on 2021-09-16 12:06:22 UTC

[2021-10-13 07:12:15] NOTICE[2772] cdr.c: CDR simple logging enabled.

[2021-10-13 07:12:15] NOTICE[16423] sorcery.c: Type 'system' is not reloadable, maintaining previous values

[2021-10-13 07:12:15] NOTICE[2772] chan_iax2.c: Ignoring bindport on reload

[2021-10-13 07:12:15] NOTICE[2772] chan_iax2.c: Ignoring bindaddr on reload

[2021-10-13 07:12:15] NOTICE[2772] app_queue.c: queuerules.conf has not changed since it was last loaded. Not taking any action.

[2021-10-13 07:17:05] WARNING[4945][C-00000022] ast_expr2.fl: ast_yyerror():  syntax error: syntax error, unexpected '=', expecting $end; Input:

=1

^

[2021-10-13 07:17:05] WARNING[4945][C-00000022] ast_expr2.fl: If you have questions, please refer to https://wiki.asterisk.org/wiki/display/AST/Channel+Variables

Если я правильно понимаю, то система  жалуется на неожиданное появление знака равно в выражении  GotoIf($[${BLACKLIST()}=1]?banned). 

от (2.8 тыс. баллов)
Да, попробуйте как у вас написано с blacklist.

n,GotoIf(${BLACKLIST()}?banned)

Использование этой переменной разнится в разных мануалах.
от (640 баллов)

Пробывал такой вариант 

n,GotoIf($["${BLACKLIST()}"=="1"]?banned)

Он не выдает ошибок, но и не работает как нужно. 

от (2.8 тыс. баллов)
n,GotoIf($[${BLACKLIST()}]?banned)
от (2.8 тыс. баллов)
еще попробуйте выполнить в консоли:

asterisk -rx 'database show' | grep blacklist
от (640 баллов)

Это результат выполнения команды

от (2.8 тыс. баллов)
Ага, понятно. у вас в базе лежит не номер, переменная blacklist.

Больше пока не могу сказать точно - нужно востпроизводить на работающей версии. Несколько позже.
от (2.8 тыс. баллов)
Итак, мы тут покрутили все. Функция BLACKLIST не работает корректно. Может мы чего не так понял, может где косяк. не ясно. Но оно не отрабатывает так как нужно. Учитывая факу https://wiki.mikopbx.com/faq:black_list_white_list - там действительно что-то не так.

После некоторых экспериментов сделал такой скрипт:

[SIP-1632574698-incoming-custom]

 exten => _X!,1,Set(_From=${CALLERID(num)})

    same => n,Set(tel_banned=${DB(blacklist/${From})})

    same => n,GotoIf($["${tel_banned}" = "${From}"]?banned:call)

    same => n(call),Set(DB(ToMe/LastCaller)=${From})

    same => n,return

    same => n(banned),Hangup()

   

[all_peers-custom]

exten => 20,1,Set(tmp=${DB(ToMe/LastCaller)})

    same => n,Set(DB(blacklist/${tmp})=${tmp})

    same => n,return

Фактически, мы используем базу данных напрямую, минуя встроенную функцию.
от (640 баллов)
Благодарю Вас, ошибок нет, вот только при нажатии на 20 - в список номер не добавляется а произносится фраза - данный номер не может быть вызван.
от (2.8 тыс. баллов)
Добавляется. Можете проверить командой

asterisk -rx 'database show' | grep blacklist

А произносить, потому что стоит same => n,return.

Чтобы произносил фразу нужно добавить

same => n,Playback(added)

same => n,Hangup()

и проверить выше написанной командой, что номер в списке.
от (640 баллов)

Понял Вас, благодарю. 

Нашел, еще одну реализацию blacklist - без прослушивания IVR.

Может получится доработать скрипт с учетом этой ссылки?

от (2.8 тыс. баллов)
Так, во-первых функция blacklist не работает как нужно.

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

same => n(call),Set(DB(ToMe/LastCaller)=${From})

same => n,return

отправить в ivr по номеру командой n,Goto(ivr,s,1). И будет счастье.

Но я бы от IVR не отказывался... это ж какой кайф. Сначала: "Мы приветсвуем вас! Ваш звонок важен для нас", а потом "Ой, вы в черном списке. Ваш звонок не важен для нас." :)
от (640 баллов)

Благодарю Вас за Ваше усердие. 

Сейчас по какой-то причине blacklist в базе данных стал пустым:

/blacklist/                                       :

И перестала добавляться запись ToMe/LastCaller в базу данных (ранее все было).

Что сделал не так? Куда копать?

В первой сточке скрипта точно нужно писать "_From" с нижним подчеркиванием впереди? В других случаях в коне не нужно этого делать?

от (2.8 тыс. баллов)
редактировать от
Тесты проводились на вресии 2021.3.86.

Очистите базу blacklist командой:

asterisk -rx «database deltree blacklist»

Можете очистить базу ToMe

asterisk -rx «database deltree ToMe»

Попробуйте снова.

20 нужно нажимать после завершения звонка.

выполните команду:

asterisk -rx 'database show' | grep blacklist

посмотрите что выдаст. Должно быть так:

/blacklist/1234567890                 :1234567890

Тогда все правильно. Если выдает просто:

/blacklist/                                      :

Тогда нужно смотреть ваше оборудование и разбираться уже как передается входящий номер. Возможно, нужно будет сменить на CALLERID(name), возможно, он передается более хитрым способом. Это уже за рамками форума.

Сначала _From c подчеркиванием. Дальше уже просто как переменная ${From}

Диалплан рабочий, тестировали на живой системе.

PS и надеюсь заголовки на свои заменили? (SIP-1634042845-incoming-custom????)
от (640 баллов)

Благодарю Вас, все получилось)

Возникла правда маленькая проблемка, при поступлении с одного провайдера номер определяется как 7-ХХХ-ХХХХХХ, а с другого как 8-ХХХ-ХХХХХХ, т.е. номер нужно добавлять 2 раза получается, если он будет звонить на два разных входящих номера?

Можно, как то обойти эту проблемку?

от (640 баллов)

И еще один вопрос, когда ставлю контекст add-trim-prefix-clid-custom  то все перестает работать, но все же хочется сделать одно правило для всех входящих линий. 

Какой контекст я могу еще использовать для этой цели?

от (2.8 тыс. баллов)

1. Это называется нормализация входящего номера. Описано здесь: https://wiki.mikopbx.com/faq:cid_norm

Читать внимательно и вдумчиво, до полного просветления :)

2. Да, для этого можно использовать add-trim-prefix-clid-custom, но [all_peers-custom] нужно оставить в файле existantions.conf

от (640 баллов)
редактировать от

Еще раз, огромное спасибо, все заработало. Привожу окончательный вариант работающего на 100% скрипта, с учетом всех Ваших инструкции и исправлений:

[add-trim-prefix-clid-custom]

exten => _.!,1,NoOp(---)

    same => n,Set(CALLERID(num)=${REPLACE(CALLERID(num),"+")})

    same => n,ExecIf($[ ${LEN(${CALLERID(num)})} == 11 ]?Set(CALLERID(num)=7${CALLERID(num):1}))

    same => n,ExecIf($[ ${LEN(${CALLERID(num)})} == 7 ]?Set(CALLERID(num)=7495${CALLERID(num)}))

    same => n,Set(_From=${CALLERID(num)})

    same => n,Set(tel_banned=${DB(blacklist/${From})})

    same => n,GotoIf($["${tel_banned}" = "${From}"]?banned:call)

    same => n(call),Set(DB(ToMe/LastCaller)=${From})

    same => n,return

    same => n(banned),Hangup()

[all_peers-custom]

exten => 66,1,Set(tmp=${DB(ToMe/LastCaller)})

    same => n,Set(DB(blacklist/${tmp})=${tmp})

    same => n,Wait(2)

    same => n,Playback(/storage/usbdisk1/mikopbx/media/custom/added_to_blacklist_male)

    same => n,Wait(1)

    same => n,Hangup

Немного украсил скрипт оповещением о добавлении номера в черный список. Скачать можно их в мужском исполнении и женском. Затем эти файлы добавляем в разделе "Звуковые файлы" и в скрипте меняем только название файла, либо  added_to_blacklist_male, либо added_to_blacklist_female, соответственно. 

Номер в черный список добавляется в этом варианте с помощью комбинации "66".

На этом сайте можно бесплатно задать вопрос разработчикам MikoPBX и другим членам сообщества. Время ответа не регламентированно, но мы стараемся несколько раз в день заглядывать сюда. Для срочного решения проблем обращайтесь на платную линию поддержки

Популярные теги

askozia входящие-вызовы настройка исходящие маршрутизация провайдер запись-разговоров входящие ivr исходящие-звонки обновление ошибка очередь провайдеры битрикс24 очередь-вызовов переадресация запись установка маршрут история-звонков mikopbx транк панель-телефонии-1с перевод-вызова перевод askozia7 askozia6 битрикс callerid интеграция голосовая-почта логи перехват-вызова ростелеком нерабочее-время факс модуль nat docker запись-разговора веб-интерфейс bitrix24 goip настройка-провайдер история диалплан почта журнал-звонков релиз gsm вызовы звонок внешние-номера web-интерфейс zabbix маршруты cdr sip панель pjsip переадресация-мобильный voicemail ascozia телефонная-книга аон мобильный звонков лицензирование вызовов редактор номер asterisk лицензия ami регистрация оповещения провайдеров время голосовая fax trunk разговоров группы-пользователей #mikopbx пропущенные-звонки донабор beeline monitoring тишина smtp cisco мобильные мультифон мегафон шлюз не-работает электронная-почта не-слышно-звук

2.8 тыс. вопросов

2.4 тыс. ответов

6.7 тыс. комментариев

465 тыс. пользователей

...