Asterisk 阻止具有特定呼叫者 ID 的来电

Asterisk 阻止具有特定呼叫者 ID 的来电

所以我知道这是一个相当简单的问题,但我似乎找不到一个很好的答案。我有一个 DID,它经常被来自非 1-8XX 号码的电话推销员打来,而且打得相当多(至少对我来说,每天大约 1-3 个电话)。然而,每天打来电话的号码只有少数几个。所以自然而然地,我只想屏蔽它们,这样我的电话就不会响,我也不会被收取通话费。

我希望发送 SIP/404 或其他非应答响应 - 而不是将其发送到语音邮件或其他录音。我并不真正关心日志记录或类似的东西,我只是希望能够相当轻松地添加(或删除)号码,以便我可以减少不必要的呼叫。

我发现的所有东西要么太复杂要么太简单(只有一个被屏蔽的号码),我找不到好的媒介。希望其他人能有更好的见解!我正在使用 Asterisk 1.6。谢谢!

答案1

我做过类似的事情,和其他提交者一样,我使用了数据库。我没有使用内置的 DB 功能,而是使用了命令MySQL这样我就可以编写一个与同一个数据库交互的网页,并且我的 DBA 可以在这个“目录”表和 MySQL CDR 之间进行跨数据库选择。

在我的示例中,我设置了一个包含 4 个字段的表。id(auto_increment int)、number(电话号码)、name(用户名)、ban(默认为 0 的 int)。该示例执行 2 项操作,1- 它从 DB 中查找名称并将其设置为呼叫者 ID(因为我们的 POTS 线路不传达这一点)2- 它查找是否ban设置为 1,然后阻止呼叫。

exten => s,1,答案
exten => s,n,NoOp("来电显示为: ${CALLERID(number)}")
exten => s,n,MYSQL(连接 connid HOST USER PASSWORD 数据库)
exten => s,n,MYSQL(查询结果id ${connid} SELECT name,ban FROM directory WHERE number='${CALLERID(number)}')
exten => s,n,MYSQL(获取 fetchid ${resultid} 名称禁止)
exten => s,n,NoOp("我们发现:${name} ${ban}")
exten => s,n,MYSQL(清除${resultid})
exten => s,n,MYSQL(断开${connid});
exten => s,n,设置(CALLERID(名称)=${名称})
扩展 => s,10,NoOp()
exten => s,n,GotoIf($["${ban}" = "1"]?wedontlikeyou,s,1)
exten => s,n,转到(主菜单,s,1)

之后,您将看到 [主菜单] 和 [我们不喜欢您]。后者是您的禁令,可能是简单的挂断、错误消息,无论您想要什么。我更喜欢拥塞()因为这往往会让人们认为该电话号码已停止服务。

答案2

你的编程技能怎么样?我不确定所有细节,但我从你的问题中猜测:

  • 您已通过 SIP 协议获得了一个美国来电号码
  • 这是您需要支付来电费用的号码(1-800?)
  • 您想要屏蔽多个来电显示号码
  • 这个数字足够大(我猜超过 10),因此不需要在 extensions.conf 中为每个数字写一两行代码

看一下 kaptk2 提到的链接中的代码。

然后看一下星号的DB()函数:星号函数 DB()。您可以查找每个来电呼叫者 ID 作为数据库密钥,并且可以从 asterisk 命令行维护数据库密钥。

DB 管理的简短示例:

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 代码:将其发送到不存在的分机。

相关内容