【问题标题】:Bulk SMS - Twilio群发短信 - Twilio
【发布时间】:2019-10-15 15:41:46
【问题描述】:

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

您可以执行此操作的另一种方法(根据我的阅读)是您可以同步执行不同的 API 调用,一个接一个,您不应该有问题。我现在正在发送短信后发送短信,但在成功发送 200 条后总是收到“错误:20429 - 请求过多”。

这是我的代码:

//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)
  );
}

有没有人知道更好的路线或者我错过了什么?

【问题讨论】:

    标签: javascript sms twilio twilio-api


    【解决方案1】:

    Heyoooo,这里是 Twilio 开发人员宣传员。 ?

    一个接一个,你不应该有问题

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

    解决此问题的一种方法是将您的代码包装到一个异步函数中并await 它。为此,您必须稍微调整 sendMessage 以返回 Twilio 帮助程序库返回的承诺(或直接使用 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)。

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

    【讨论】:

    • 嘿,一个简单的问题,您将如何处理client.messages.create 上的错误?我在sendMessage() 返回后离开了它们,如果有错误,它会停留在抛出错误的循环中,而不是移动到下一个数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多