Массовая СМС - Twilio - PullRequest
       18

Массовая СМС - Twilio

0 голосов
/ 14 октября 2019

Я пытаюсь отправить смс с Twilio SMS api. Я пытаюсь отправить 2000 SMS, и только 200 доставляются. Я прочитал, что мне нужно отправить пакетами по 100, поэтому я изменил свой код, чтобы разбить массив на куски по 100 и получить только один вызов API, но это не сработало, получилось только первое число в массивеSMS.

Еще один способ сделать это (из того, что я прочитал) - синхронно выполнять разные вызовы API, один за другим, и у вас не должно быть проблем. Я сейчас отправляю SMS после SMS, но всегда получаю сообщение «Ошибка: 20429 - слишком много запросов» после 200 успешно отправленных.

Вот мой код:

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

Кто-нибудь знает лучший маршрут или я что-то упустил?

1 Ответ

1 голос
/ 15 октября 2019

Heyoooo, евангелист разработчиков Twilio здесь. 100

один за другим, и у вас не должно быть проблем

Это не то, что делает ваш код. Вы звоните sendMessage в цикле, не ожидая, когда это будет сделано. Это, скорее всего, приведет к почти параллельным запросам X, которые приведут к ответу too many request.

Чтобы решить эту проблему, заключите ваш код в асинхронную функцию и await it. Чтобы это работало, вам нужно немного подправить sendMessage, чтобы вернуть обещание (или напрямую использовать client.messages.create), возвращаемое вспомогательной библиотекой Twilio.

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) больше.

Дайте мне знать, если это поможет. :)

...