You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python实现Twilio未接来电转发及DialCallStatus捕获问题咨询

问题解决思路

1. 正确获取DialCallStatus

你当前代码中获取的CallStatus是主呼叫的状态,而DialCallStatus是Dial动作中被叫号码的呼叫状态,这个字段会出现在两个场景的回调里:

  • Dial组件的action URL请求(同步,呼叫未结束)
  • 给<Number>设置的status_callback URL请求(异步,子呼叫状态通知)

你之前看不到DialCallStatus,是因为在/response路由里错误地取了CallStatus。如果是<Number>的回调,应取子呼叫的CallStatus;如果是Dial的action回调,则可以直接获取DialCallStatus。

2. 未接来电转发的正确实现

你之前的方法无效,是因为status_callback是异步通知——当收到no-answer时,原呼叫已经结束,此时返回Dial指令无法继续操作。正确的做法是利用Dial的action属性:在Dial动作完成后(比如无人接听),Twilio会同步请求action URL,此时原呼叫仍处于活跃状态,可以直接执行转发。

修改后的代码示例

# 初始来电应答路由
@app.route('/gather', methods=['GET', 'POST'])  
def gather():
    resp = VoiceResponse()
    # 设置Dial的action属性,指定Dial结束后的处理路由
    dial = Dial(timeout=30, action='/forward')
    dial.number('+1-initial-called-number')
    resp.append(dial)
    return str(resp)

# Dial结束后的转发处理路由
@app.route('/forward', methods=['POST'])
def forward_call():
    # 获取Dial动作的最终状态
    dial_status = request.values.get('DialCallStatus', None)
    resp = VoiceResponse()
    # 无人接听时转发到下一个号码
    if dial_status == 'no-answer':
        resp.dial('+1-next-number')
    # 其他状态可按需处理,比如busy时提示忙线
    return str(resp)

额外说明

  • Dial的DialCallStatus常见取值:answered、no-answer、busy、failed,对应不同的Dial执行结果
  • 如果需要监听子呼叫的细节状态(比如被叫何时振铃、接通),可以给<Number>单独设置status_callback,此时回调里的CallStatus就是子呼叫的状态,主呼叫的CallStatus仍为in-progress

内容的提问来源于stack exchange,提问作者young2020

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:50:29