无需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
相关产品推荐
相关产品推荐

