Twilio API и экспоненциальная задержка при отправке массовых SMS с помощью Node.js

Я работаю над приложением для массовых SMS, которое отправит одно сообщение группе людей в случае возникновения чрезвычайной ситуации. Я просмотрел Документы Twilio и реализовал свой код, после чего я получил ошибку 429 от API. Поэтому я добавил код экспоненциальной отсрочки, чтобы предотвратить это, но когда я запускаю скрипт, он отправляет только второй номер, указанный в массиве.

const accountSid = '[ACCOUNT SID]';
const authToken = '[AUTH TOKEN]';
const client = require('twilio')(accountSid, authToken);

var numbersToMessage = ["+1800XXXXXXX", "+1888XXXXXXX"]

numbersToMessage.forEach(function(number){
  var message = client.messages.create({
    body: 'This is test #2 from August 21, 2020.',
    from: '[TWILIO SENDER NUMBER]',
    statusCallback: '[PIPEDREAM API URL]',
    to: number
  })
  .then(message => console.log(message.status))
  return((err) => {
  // assumes that the error is "request made too soon"
  backoffTime *= 2;
  i--;
  console.log(err);
  return delay(backoffTime);
});
  done();
});

Экспоненциальная отсрочка для меня совершенно нова, поэтому я вполне уверен, что проблема именно в этом, но это все, что я понял. Я тоже безуспешно пытался использовать пакет npm exponential-backoff.


person Alex    schedule 21.08.2020    source источник
comment
Сколько человек в группе, другими словами, сколько сообщений в группе?   -  person Alex Baban    schedule 21.08.2020
comment
@AlexBaban Примерно 100.   -  person Alex    schedule 22.08.2020


Ответы (1)


Чтобы было ясно, это не экспоненциальная отсрочка, но она должна работать примерно со 100 числами.

Замените на свои учетные данные Twilio, добавьте свои числа в массив, замените PIPEDREAM_API_URL. Все ваши 100 сообщений должны быть поставлены в очередь в Twilio примерно за 30 секунд.

Ответ message.sid от Twilio означает, что сообщение было добавлено в очередь отправки, а не то, что сообщение было действительно отправлено.

const accountSid = 'AC...';
const authToken = '4f...';
const client = require('twilio')(accountSid, authToken);

const TWILIO_SENDER_NUMBER = '+1...';
const TEXT_TO_SEND = 'This is test #2 from August 21, 2020.';
const PIPEDREAM_API_URL = '...';

// about 100 numbers
let numbersToMessage = [
    "+1...",
    "+1...",
    "+1...",
    // "+1...",

];

function sendAllMessagesWithTwilio(data) {

    // stop condition, nothing left in the array of numbers
    if (data.length === 0) {
        console.log('............... DONE');
        return;
    }

    // take the first number from the array of numbers
    let _number = data.shift();
    console.log(_number);

    client.messages
        .create({
            to: _number,
            from: TWILIO_SENDER_NUMBER,
            body: TEXT_TO_SEND,
            statusCallback: PIPEDREAM_API_URL
        })
        .then((message) => {
            // after Twilio responds, send the next message
            console.log(`${message.sid}`);
            // recursive call of function, pass the remaining numbers as argument
            // use setTimeout() to slow down, 300 milliseconds between requests
            setTimeout(sendAllMessagesWithTwilio.bind(null, data), 300);
        })
        .catch((err) => {
            // if an error is sent back from Twilio
            console.error(err);
        });

}

// first call of recursive function
// takes the initial array of numbers as argument
console.log('BEGIN ...............')
sendAllMessagesWithTwilio(numbersToMessage);

Good luck!
person Alex Baban    schedule 21.08.2020
comment
Большое спасибо! Отлично! - person Alex; 24.08.2020