群发短信 - Twilio

Bulk SMS - Twilio

我正在尝试使用 Twilio SMS 发送 SMS api。我正在尝试发送 2,000 条短信,但只有 200 条已送达。我读到我需要分批发送 100 个,所以我更改了代码以将数组分成 100 个块,每个块只有一个 API 调用它,但这没有用,只有第一个数字在数组中收到一条短信。

您可以执行此操作的另一种方法(根据我的阅读)是您可以同步执行不同的 API 调用,一个接一个,您应该不会有问题。我现在正在一个接一个地发送短信,但我总是在成功发送 200 条后收到 "Error: 20429 - Too Many Requests"。

这是我的代码:

//After I grab all the numbers: 

var cleanNumbers = []
let recipientAmount = 1;
let numberStart = 0;
let numbersLen = numbers.length

while (numberStart < numbersLen) {
  let maxNumbers = Math.min(numbersLen, numberStart + recipientAmount);

  for (let i = numberStart; i < maxNumbers; i++) {
     let number = numbers[i]['phone_number'].replace(/[^\d]/g, '')
     if (number.length > 10 && number[0] === '1') {
         number = number.substring(1)
         cleanNumbers.push('1' + number)
     }
     else {
         cleanNumbers.push('1' + number)
     }

     if (i == maxNumbers - 1) {
        var params = {
          'body': `${event_sms_message}`,
          'messagingServiceSid': 'XXXXXXXXXXXXXXX',
          'to': cleanNumbers
        }

     sendMessage(params)

     cleanNumbers = []
     numberStart = numberStart + recipientAmount;
    }
  }
}

调用API的函数

async function sendMessage(params) {
  let msg = await client.messages.create(params, function(err, data, message) {
    if (err) {
      console.log("ERROR:");
      console.log(err)
      return 'done'
    }
    else {
      console.log("SUCCESS:");
      console.log(data)
      return 'done'
    }
  })
  .then(message => 
    console.log(message.sid)
  );
}

有没有人知道更好的路线或者我是否遗漏了什么?

嘿嘿,这里是 Twilio 开发者布道师。

one after another and you shouldn't have problems

这不是您的代码所做的。您在循环中调用 sendMessage 而无需等待它完成。这很可能会导致 X 几乎并行的请求,从而导致 too many request 响应。

解决此问题的一种方法是将您的代码包装到一个异步函数中,然后 await 它。为此,您必须稍微调整 sendMessage 以 return 由 Twilio 帮助程序库 return 编辑的承诺(或直接使用 client.messages.create)。

async function sendMessage(params) {
  return client.messages.create(params)
}

通过这些调整,您可以将循环包装到异步函数中并等待每个请求先成功。

(async () => {
  while (numberStart < numbersLen) {
    try {
      let maxNumbers = Math.min(numbersLen, numberStart + recipientAmount);

      for (let i = numberStart; i < maxNumbers; i++) {
        let number = numbers[i]['phone_number'].replace(/[^\d]/g, '')
        if (number.length > 10 && number[0] === '1') {
          number = number.substring(1)
          cleanNumbers.push('1' + number)
        } else {
          cleanNumbers.push('1' + number)
        }

        if (i == maxNumbers - 1) {
          var params = {
            'body': `${event_sms_message}`,
            'messagingServiceSid': 'XXXXXXXXXXXXXXX',
            'to': cleanNumbers
          }

        await sendMessage(params)

        cleanNumbers = []
        numberStart = numberStart + recipientAmount;
      }
    } catch(e) {
      console.error(e);
    }
  }
})();

此代码将等待 client.message.create 成功,您不应再 运行 陷入速率限制错误 (too many requests)。

如果有帮助请告诉我。 :)