如何在Twilio中通过DTMF输入调用Python函数且不关闭WebSocket
解决方案:无需关闭WebSocket即可发起呼叫
核心思路是绕过Twilio的TwiML后续指令依赖,直接用Twilio REST API在Python端发起呼叫,这样既能保留WebSocket连接继续处理IVR逻辑,又能执行拨号操作。
步骤1:修改TwiML模板
移除原TwiML中<Connect>后的<Dial>指令,只保留WebSocket流连接:
<Connect> <Stream url="wss://{{ host }}/audio/" /> </Connect>
步骤2:Python端处理DTMF并调用Twilio API
当检测到目标DTMF输入(比如数字1)时,直接调用Twilio的Calls API发起呼叫,无需关闭WebSocket。
首先确保安装Twilio Python SDK:
pip install twilio
然后在你的WebSocket消息处理逻辑中添加以下代码:
from twilio.rest import Client # 替换为你的Twilio账户信息 ACCOUNT_SID = "你的账户SID" AUTH_TOKEN = "你的认证令牌" TWILIO_PHONE_NUMBER = "你的Twilio电话号码(带国家码)" def process_dtmf_input(digit): if digit == "1": # 发起呼叫 client = Client(ACCOUNT_SID, AUTH_TOKEN) call = client.calls.create( to="{{ number }}", # 替换为要拨打的目标号码 from_=TWILIO_PHONE_NUMBER, url="https://你的服务器地址/handle-call" # 呼叫接通后执行的TwiML接口 ) # 这里可以执行你的自定义业务代码,比如记录日志、触发其他逻辑 print(f"呼叫已发起,Call SID: {call.sid}") # 你的WebSocket消息处理函数示例 def handle_websocket_message(message): if message.get("event") == "dtmf": dtmf_digit = message["digit"] process_dtmf_input(dtmf_digit)
关键说明
- 此方案中,WebSocket连接会持续保持,你可以继续处理后续的DTMF输入或其他音频流事件。
- 呼叫接通后的行为由
url参数指定的TwiML接口控制,比如播放语音、转接等,完全独立于原IVR的WebSocket流程。 - 确保你的Python服务器能正常访问Twilio API,且账户有可用的通话额度和权限。
内容的提问来源于stack exchange,提问作者Foobar
相关产品推荐
相关产品推荐

