Twilio函数错误20429-太多请求多个短信

时间:2019-07-14 19:55:48

标签: ios swift sms twilio twilio-functions

我正在使用Twilio功能和可编程SMS将SMS消息发送到iOS应用程序中的数字列表。列表中刚好有100多个手机号码(发生此错误时为113)。这些消息大多数都会发送,但随后该函数说它在502毫秒后超时。

我正在使用Twilio中的示例代码将消息发送到群组消息(已在下面复制),并从我的iOS应用发出URLSession请求。

有没有一种方法可以解决此问题,以便将其发送到相当大的电话号码列表或使该功能运行更长的时间?

非常感谢您的帮助。 汤姆

请求:

let messagesPhoneNumberString = [+447987654321abc,+447123789456def,+447123456789ghi]
"https://myfunction.twil.io/send-messages?phoneAndID=\(messagesPhoneNumberString)&globalID=\(current globalID)"

我的Twilio功能代码:

exports.handler = function(context, event, callback) {

    let phoneAndIDString = event['phoneAndID'];
    let globalID String = event['globalID'];
    let numbersArray = phoneAndIDString.split(",");

Promise.all(
  numbersArray(number => {

      let phoneNumberSplit = "+" + number.slice(1, 13);
      let idSplit = number.slice(13);

      console.log('Send to number: ' + phoneNumberSplit + ' - with ID: ' + idSplit);

    return context.getTwilioClient().messages.create({
      to: phoneNumberSplit,
      from: 'Example',
      body: 'Hello World: ' + idSplit
    });
  })
)
  .then(messages => {
    console.log('Messages sent!');
    callback(null, response);
  })
  .catch(err => console.error(err));
    };

2 个答案:

答案 0 :(得分:1)

这里是Twilio开发人员的传播者。

Twilio Functions has a timeout of 5 seconds,因此使用Twilio函数一次发送这么多消息可能不是最好的主意。

不过您还有一些选择。

如果您要向所有这些数字发送相同的消息,则可以使用Twilio通知直通API。请查看此博客文章中有关sending mass messages with Node.js的详细信息。

否则,如果您必须发送不同的消息,则可以将数字分成批处理并多次使用相同的功能。

最后,您可以使用其他平台来发送没有5秒限制的邮件。

答案 1 :(得分:0)

除了Phil回答中提供的选项之外,您还可以使用递归。

您可以像现在一样从应用程序触发该过程并在初始函数调用中传递所有数字。

然后,想法是每个函数调用仅发送一条消息,并在 之后,让Twilio函数本身调用它,它会收到 .create()的响应。这意味着无需并发调用即可发送消息,尽管消息的接收顺序与查询字符串中数字的传递顺序无关,但消息却是一个接一个地发送。

您需要在功能依赖项配置(https://www.twilio.com/console/runtime/functions/configure)中添加axios

Axios用于从函数内部向函数发出HTTP请求。

运行每个功能,测试停止条件,该条件发生在电话号码查询字符串长度为零时。然后,使用.shift()从numbers数组中删除第一个元素以使用它。剩余的数组将传递到下一个函数调用。

这是我尝试过的代码,它对我有用,但是您必须将 {{更改为11方法的.slice()长度) 1}} ,因为我已经测试了长度较短的美国电话号码 +44


+1


在测试过程中尝试逐步进行操作,控制台记录日志,然后从上到下使用 exports.handler = function(context, event, callback) { const axios = require("axios"); let phoneAndIDString = event["phoneAndID"].trim(); console.log(phoneAndIDString); let globalIDString = event["globalID"].trim(); // stop condition for recursive call if (phoneAndIDString.length === 0) { return callback(null, true); } let numbersArray = phoneAndIDString.split(","); console.log(numbersArray); // take the first item of array let number = numbersArray.shift(); console.log(number); // the remaining array will be passed to the next function call phoneAndIDString = numbersArray.join(); console.log(phoneAndIDString); let phoneNumberSplit = "+" + number.slice(0, 11); let idSplit = number.slice(11); console.log("Send to number: " + phoneNumberSplit + " - with ID: " + idSplit); context .getTwilioClient() .messages.create({ to: phoneNumberSplit, from: "+17775553333", body: "Hello World: " + idSplit }) .then(msg => { console.log("Message sent: " + msg.sid); axios .get( "https://foo-bar-1234.twil.io/send-messages?globalID=baz&phoneAndID=" + phoneAndIDString ) .then(function(response) { // handle success console.log(response.status); return callback(null, true); }) .catch(function(err) { // handle error console.error(err); }); }) .catch(function(err) { console.error(err); }); }; 早返回,以确保不会循环。