![Asterisk 阻止具有特定呼叫者 ID 的来电](https://linux22.com/image/572569/Asterisk%20%E9%98%BB%E6%AD%A2%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E5%91%BC%E5%8F%AB%E8%80%85%20ID%20%E7%9A%84%E6%9D%A5%E7%94%B5.png)
所以我知道这是一个相当简单的问题,但我似乎找不到一个很好的答案。我有一个 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 代码:将其发送到不存在的分机。