Назад | Перейти на главную страницу

Asterisk блокирует входящий звонок с определенными идентификаторами вызывающего абонента

Итак, я знаю, что это довольно простой вопрос, но я не могу найти на него хорошего ответа. У меня есть DID, который довольно сильно страдает (или, по крайней мере, для меня, около 1-3 звонков в день) с телемаркетингом с номеров, отличных от 1-8XX. Однако есть только несколько номеров, которые звонят изо дня в день. Поэтому, естественно, я просто хочу заблокировать их, чтобы мой телефон не звонил, и мне не выставляли счет за звонок.

Я хочу отправить SIP / 404 или другой ответ без ответа, а не отправлять их на голосовую почту или другую запись. Меня не волнует ведение журнала или что-то в этом роде, я просто хотел бы иметь возможность довольно легко добавлять (или удалять) номер, чтобы сократить количество ненужных вызовов.

Все, что я нахожу, кажется либо слишком сложным, либо слишком простым (только один заблокированный номер), и я не могу найти хорошего носителя. Надеюсь, кто-то еще лучше поймет! Я использую Asterisk 1.6. Спасибо!

Как твои навыки программирования? Я не уверен во всех деталях, но, как я понимаю, из вашего вопроса:

  • У вас есть номер для входящих звонков в США, доставленный вам по протоколу SIP.
  • Это номер, по которому вы оплачиваете входящие звонки (1-800?)
  • У вас есть несколько номеров вызывающих абонентов, которые вы хотите заблокировать
  • Это число достаточно велико (наверное, больше 10), чтобы не писать одну или две строчки кода в extension.conf для каждого числа.

Взгляните на код в упомянутой ссылке kaptk2.

А затем взгляните на функции DB () звездочки: Функция звездочки DB (). Вы должны выполнить поиск каждого входящего идентификатора вызывающего абонента в качестве ключа базы данных, и вы можете поддерживать ключи базы данных из командной строки asterisk.

Краткий пример управления БД:

greenblatt*CLI> database put blockcaller 18005551212 1
Updated database successfully
greenblatt*CLI> database get blockcaller 18005551212
Value: 1

Вы можете получить доступ к значению примерно так:

exten => s,1,GotoIf($[${DB(blockcaller/${CALLERID(num)}))} = 1]?blocked:ok

Лучший способ «убить» вызов - использовать функцию Hangup (). Или, если вы настаиваете на коде 404: отправьте его на несуществующий добавочный номер.

Я сделал нечто подобное и, как и другой отправитель, использовал базу данных. Вместо использования встроенных функций int DB я использовал cmd MySQL. Это было сделано для того, чтобы я мог написать веб-страницу, которая взаимодействует с одной и той же БД, И мой администратор БД мог делать перекрестный выбор БД между этой таблицей «Каталог» и MySQL CDR.

В моем примере я установил таблицу с 4 полями. id (auto_increment int), number (телефонный номер), name (Имя пользователя), ban (int, по умолчанию 0). Пример выполняет 2 вещи: 1 - он ищет имя в БД и устанавливает его в качестве идентификатора вызывающего абонента (поскольку наша линия POTS этого не сообщает) 2 - Он проверяет, не ban установлен в 1 и блокирует вызов.

exten => s,1,Answer
exten => s,n,NoOp("Caller ID IS: ${CALLERID(number)}")
exten => s,n,MYSQL(Connect connid HOST USER PASSWORD database)
exten => s,n,MYSQL(Query resultid ${connid} SELECT name,ban FROM directory WHERE number='${CALLERID(number)}')
exten => s,n,MYSQL(Fetch fetchid ${resultid} name ban)
exten => s,n,NoOp("We found: ${name} ${ban}")
exten => s,n,MYSQL(Clear ${resultid})
exten => s,n,MYSQL(Disconnect ${connid});
exten => s,n,Set(CALLERID(name)=${name})
exten => s,10,NoOp()
exten => s,n,GotoIf($["${ban}" = "1"]?wedontlikeyou,s,1)
exten => s,n,Goto(mainmenu,s,1)

После этого у вас будут [mainmenu] и [wedontlikeyou]. Чем позже будет ваш бан, это может быть простое зависание, сообщение об ошибке, что угодно. Я предпочитаю Перегрузка () поскольку это заставляет людей думать, что номер телефона не обслуживается.