Estoy construyendo una función twilio que reacciona a las llamadas telefónicas entrantes. Después de recibir una llamada, la función debe enviar un SMS a la persona que llama. Sin embargo, me gustaría que el SMS se retrase un par de minutos. Actualmente, mi función se ve así:
exports.handler = function (context, event, callback) { // Create a new voice response object const client = context.getTwilioClient(); const client_number = event.From; const twilio_number = +xxxx; client.messages.create({ // Send SMS to: client_number, from: twilio_number, body: "Hello on SMS" }).then(() => { // When request to send SMS is complete, deal with the caller let twiml = new Twilio.twiml.VoiceResponse(); twiml.say(""); // respond to voice caller callback(null, twiml); }) };Ahora mismo se envía el SMS y luego se envía la respuesta a la llamada. No estoy seguro de cómo retrasar el mensaje. He estado leyendo esto pero no funciona porque no puedo atender la llamada primero y luego enviar el mensaje. https://www.twilio.com/docs/runtime/quickstart/add-delay
Esto no funciona con las funciones de Twilio, verifique la respuesta de @philnash
Primero debe devolver la llamada para responder la llamada y luego, en una promesa retrasada, enviar el SMS
exports.handler = function (context, event, callback) { const delay = (delayMS) => new Promise((res) => { setTimeout(res, delayMS) }) // Create a new voice response object const client = context.getTwilioClient(); const client_number = event.From; const twilio_number = +xxxx; let twiml = new Twilio.twiml.VoiceResponse(); twiml.say(""); // respond to voice caller callback(null, twiml); return ( delay(10000) .then(() => client.messages.create({ // Send SMS to: client_number, from: twilio_number, body: "Hello on SMS" }) ) .then(() => console.log("SMS sent")) ) }Espero que esto ayude.
Nota: el retraso es una función de utilidad en la que pasa la cantidad de milisegundos que desea esperar.
Desarrollador evangelista de Twilio aquí.
Esto no es algo que pueda hacer con solo una función de Twilio. Si bien la respuesta de aLittleSalty funcionará en una situación en la que su aplicación y el ciclo de eventos continúan ejecutándose, como en una aplicación Express que ejecuta, pero en una función de Twilio, una vez que llama al método de callback de llamada, el ciclo de eventos finaliza, por lo que la demora se cancelará.
Del mismo modo, el tiempo de ejecución de la función Twilio está limitado a 10 segundos, por lo que no puede retrasar un mensaje un par de minutos, incluso si lo anterior funciona.
Una idea podría ser que envíe el mensaje una vez que se haya completado la llamada. Su código de ejemplo solo incluye un <Say> , por lo que trabajaré con eso, pero podría hacerlo de otras maneras si la llamada continúa de manera diferente.
Primero, actualice su función inicial para devolver solo el TwiML, pero agregue un <Redirect> después de <Say> para que una vez que se complete el mensaje, Twilio envíe un nuevo webhook.
exports.handler = function (context, event, callback) { let twiml = new Twilio.twiml.VoiceResponse(); twiml.say(""); // respond to voice caller twiml.redirect("/after_say"); callback(null, twiml); }; Luego cree otra función en la ruta /after_say que envíe el mensaje y cuelgue la llamada.
exports.handler = function (context, event, callback) { // Create a new voice response object const client = context.getTwilioClient(); const client_number = event.From; const twilio_number = +xxxx; let twiml = new Twilio.twiml.VoiceResponse(); twiml.hangup(); client.messages.create({ // Send SMS to: client_number, from: twilio_number, body: "Hello on SMS" }).then(() => { callback(null, twiml); }).catch(error => { console.error(error); callback(null, twiml); }); }Eso todavía no le dará un par de minutos entre la llamada entrante y el mensaje enviado, pero con suerte se enviará una vez que se complete la llamada y sea una mejor experiencia.