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

无需Webhook的Python脚本通过Twilio外呼采集DTMF输入方法问询

Twilio外呼采集DTMF输入无Webhook解决方案

结论

该需求完全可以实现,无需额外搭建Web应用或配置公网Webhook,核心实现逻辑为:发起外呼后,通过Twilio提供的Call Events API轮询当前呼叫的事件记录,筛选提取用户触发的DTMF按键输入事件即可拿到对应按键值。

实现步骤

  • 第一步:调整TwiML配置,确保DTMF输入事件会被Twilio正常记录,无需配置action跳转外部地址
  • 第二步:外呼发起后,循环轮询当前呼叫SID对应的事件列表,匹配dtmf-received类型的事件提取按键值
  • 第三步:增加超时终止逻辑,避免无人输入时脚本无限轮询

完整可运行代码

import os
import time
from twilio.rest import Client
from twilio.twiml.voice_response import Gather, VoiceResponse, Say

# 配置Twilio密钥,替换为自己的实际参数
account_sid = os.environ['TWILIO_ACCOUNT_SID'] = 'XXXXX'
auth_token = os.environ['TWILIO_AUTH_TOKEN'] = 'YYYYY'
client = Client(account_sid, auth_token)

# 生成TwiML,无需配置action参数,DTMF事件会自动上报到Twilio后台
resp = VoiceResponse()
gather = Gather(input='dtmf', timeout=5, numDigits=1)
gather.say('Please press 1 for sales')
resp.append(gather)
# 用户超时未输入的提示+自动挂断
resp.say('No input received, call will end')
resp.hangup()

# 发起外呼,替换为自己的目标号码和Twilio号码
call = client.calls.create(
    twiml=str(resp),
    to='Destination_Number',
    from_='My_Twilio_Number'
)
call_sid = call.sid
print(f"外呼已发起,呼叫SID:{call_sid},等待用户按键输入...")

# 轮询参数设置
poll_interval = 1  # 轮询间隔1秒,不要设置过短避免触发API限流
max_wait_time = 30  # 最长等待30秒,可根据需求调整
start_time = time.time()
received_digit = None

while time.time() - start_time < max_wait_time:
    # 获取当前呼叫的所有事件
    events = client.calls(call_sid).events.list()
    for event in events:
        # 匹配DTMF接收事件提取按键值
        if event.event_type == 'dtmf-received':
            received_digit = event.request['digits']
            break
    if received_digit:
        break
    time.sleep(poll_interval)

if received_digit:
    print(f"成功采集到用户按键输入:{received_digit}")
else:
    print("等待超时,未采集到用户按键输入")

注意事项

  • 如果需要采集多位按键,修改标签的numDigits参数即可
  • 实际使用时需替换代码中的账号凭证、主被叫号码为真实参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:57:01