仅使用twilio.rest如何将Twilio <Gather>的用户输入结果存入变量
Twilio的语音呼叫流程完全运行在Twilio云端,用户按键输入的DTMF信号仅会被Twilio云端捕获,原生机制下必须通过回调传输结果,不存在完全脱离回调的实现方案,但你不需要自行搭建Flask服务、配置公网地址,仅借助Twilio内置的免费云端功能+twilio.rest库即可实现需求,无需额外本地依赖。
实现步骤
步骤1:创建Twilio Function存储用户输入
直接在Twilio控制台创建免费的Function(无需自行部署服务器,Twilio自动生成公网访问地址),代码如下:
exports.handler = function(context, event, callback) { const twilioClient = context.getTwilioClient(); // 将用户输入的验证码写入当前呼叫的annotation字段 twilioClient.calls(event.CallSid) .update({annotation: event.Digits}) .then(() => { const twiml = new Twilio.twiml.VoiceResponse(); twiml.say({language: 'ru-RU'}, 'Спасибо, код получен.'); callback(null, twiml); }); };
创建完成后复制Function的公网访问地址备用。
步骤2:修改本地Python代码
本地代码仅保留twilio.rest依赖,发起呼叫后轮询呼叫详情即可拿到用户输入:
from twilio.rest import Client import time account_sid = 'AC274461ad47988c753424a3c8735dbcc1' auth_token = '8ac88e8d5bce419ae3b5cbac4fc255f9' client = Client(account_sid, auth_token) # 替换为你上一步创建的Function的访问地址 FUNCTION_URL = "你的Twilio Function访问地址" # 可根据实际验证码长度调整numDigits参数 xml = f''' <Response> <Gather language="ru-RU" numDigits="4" action="{FUNCTION_URL}" method="POST"> <Say language="ru-RU">Здравствуйте, пожалуйста введите код для подтверждения.</Say> </Gather> <Say language="ru-RU">Вы не ввели код, звонок завершается.</Say> </Response>''' # 发起呼叫 call = client.calls.create( twiml=xml, to='+375336412273', from_='+12318247004' ) print(f"呼叫SID: {call.sid}") # 轮询获取用户输入,最多等待30秒 input_code = None for _ in range(30): call_info = client.calls(call.sid).fetch() if call_info.annotation: input_code = call_info.annotation break time.sleep(1) if input_code: print(f"用户输入的验证码为: {input_code}") else: print("未获取到用户输入,请求超时")
内容的提问来源于stack exchange,提问作者Andrew Duskin
相关产品推荐
相关产品推荐

