创建自己的 IVR 来访问数据库

问题描述 投票:0回答:3

我目前在一家公司实习,负责研究一些使用电话的方法。目标是让我们的客户能够拨打电话并通过 IVR 提示问题获取信息。该信息将来自我们的数据库。

我已经使用 Twilio 和一个小型 Python 应用程序成功完成了此操作。它完全符合我的要求,只是成本因素可能有点高,特别是如果我们有 30,000 多个客户连续拨打几分钟的电话。

我的目标是找到一种方法来复制我在 Twilio 上所做的事情,但在我们自己的服务器上。我找到了像 Asterisk 和 IncrediblePBX 这样的选项,但由于我对 Linux 的了解有限,我遇到的每个错误都会在互联网上寻找答案。最终,我不确定我是否正朝着正确的方向前进。

这是我想要完成的示例:

客户拨入号码。他们被要求提供一个帐号(可能是他们的电话号码),然后它将获取此信息并与数据库通信。收集这些信息后,它将向客户转发其帐户的状态等。

问题: 我希望使用 Google Voice 来路由类似于 Twilio 的呼叫,这可能吗?或者,我的公司可以切换到 VoIP 并做同样的事情吗?

如果我离开 Twilio,Asterisk 可以执行必要的任务吗?接听电话并运行应用程序以收集数据库信息。

Twilio 的当前代码(Python):

from flask import Flask, request, redirect
import twilio.twiml
import json
from urllib.request import urlopen
 
app = Flask(__name__)
callers = {
    "+": "Nicholas",
}
 
@app.route("/", methods=['GET', 'POST'])
def initial():
    # Get the caller's phone number from the incoming Twilio request
    from_number = request.values.get('From', None)
    resp = twilio.twiml.Response()
 
    # if the caller is someone we know:
    if from_number in callers:
        # Greet the caller by name
        caller = callers[from_number]
    else:
        caller = ""

    resp = twilio.twiml.Response()
    resp.say("Hello " + caller)
    resp.say("Thank you for calling.")
    your_number = list(from_number)
    del your_number[0]
    del your_number[0]
    resp.say("You are calling from: ")
    x = 0
    while x < len(your_number):
        resp.say(your_number[x])
        x += 1

    print("Please enter the neighborhood I.D. you're looking for.")
    with resp.gather(numDigits=1, action="/handle-first", method="POST") as g:
    	g.say("Please enter the neighborhood I.D. you're looking for.")

    return str(resp)

@app.route("/handle-first", methods=['GET', 'POST'])
def handle_key():
    digit_pressed = request.values.get('Digits', '')
    resp = twilio.twiml.Response()
    url = 'http://localhost/...'
    response = urlopen(url)
    data = json.loads(response.readall().decode('utf-8'))   
    current = data['rows'][0]['Neighborhood']
    print(current)
    resp.say("You have chosen " + current + "as your neighborhood.")
    with resp.gather(numDigits=1, action="/handle-second", method="POST") as h:
        h.say("Press 1 to choose another Neighborhood?")

    return str(resp)

@app.route("/handle-second", methods=['GET', 'POST'])
def handle_key2():
    digit_pressed = request.values.get('Digits', '')
    resp = twilio.twiml.Response()
    if digit_pressed == "1":
        return redirect("/")

    else:
        resp.say("Thank you for calling. Good-bye.")
        return str(resp)

 
if __name__ == "__main__":
    app.run(debug=True)

python database asterisk twilio ivr
3个回答
0
投票

Asterisk 与 Twilio 有着根本的不同,我可以诚实地说它们有些相反。您正在寻求遵循的路线是 Asterisk dialplan 与 AGI 的组合。 AGI 是 Asterisk 网关接口,使您能够通过简单的脚本机制与 Asterisk 进行交互。 API 相当简单,并且有一系列现成的库可供您使用。这么说吧,说到 AGI,就选你的毒吧——PHP、Python、JAVA、Ruby——全都可用。

我个人以及 Asterisk 世界中的许多人最喜欢的是 PHP - 带有一个名为 PHP-AGI 的 LGPL 组件。它相当古老,已经存在多年,但可以与所有版本的 Asterisk 配合良好。如果您希望走在最前沿并需要更强的呼叫控制,您可以使用 ARI(Asterisk REST 接口),但是,从您的要求来看 - 这是一种矫枉过正。

您可以通过此链接阅读有关使用 PHP 进行 AGI 开发的一些内容:

https://www.packtpub.com/books/content/asterisk-gateway-interface-scripting-php

(可耻的插件 - 我写了这本书)

此外,您可以参考以下演示文稿以获取更多信息(同样,我自己的演示文稿) - 它有点旧,但在概念和用法方面仍然有效:

http://osdc.org.il/2006/html/Asterisk_AGI_Programming.ppt

祝你好运


0
投票

是的,星号可以完成您可以编程的所有任务。它甚至有用于访问原始流的 API。

但是不行,您不能使用相同的代码。

对于谷歌语音,请检查 chan_motif 代码。

对于数据库访问,请使用 dialplan+realtime 或 func_odbc 或 fastagi/agi 接口。


0
投票

您可能正在寻找开源 IVR 解决方案。我唯一知道的是 OpenVBX

我与他们或 Twilio 没有任何关系。

© www.soinside.com 2019 - 2024. All rights reserved.