Há um tempo atrás eu escrevi um tutorial aqui no blog ensinando a criar um script que envia mensagens de celular, os famosos SMS, via Node.js usando o SMS Gateway internacional da Twilio. Você confere esta primeira parte neste link.
Desta vez eu quero dar um passo adiante com você ensinando como transformar este script, que originalmente servia para enviar apenas uma mensagem, em um script que envia para uma lista de destinatários.
É importante ressaltar, por questões éticas, que você somente deve enviar mensagens SMS para destinatários que se cadastraram voluntariamente na sua plataforma com seus números, a fim de evitarmos spam via SMS, algo que é tenebroso.
Dito isso, o primeiro passo que você vai ter de fazer, uma vez que já tenha o script de envio para um destinatário é uma lista de números, um por linha, salva em um arquivo de texto. Os números devem estar completos, incluindo o DDI (+55 no caso do Brasil), o DDD (51, exemplo do RS) e o número da pessoa com o 9 na frente. Com esta lista em mãos, vamos escrever uma função que lê o arquivo, pega a lista de números e remove os duplicados. Além disso, vou verificar se está com o 9 na frente do número e, se não possuir, vamos adicionar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
const fs = require('fs'); const lines = fs.readFileSync('lista.txt').toString(); const array = []; lines.split('\n').forEach(item => { if (item.startsWith('+55') && item.length < 14) { const chars = [...item]; chars.splice(5, 0, '9'); item = chars.join(''); } if (!array.includes(item)) array.push(item); }) console.log(array); process.exit(0); |
Para isso eu usei o módulo fs, nativo do Node, que permite ler arquivos facilmente e transformei o conteúdo de um lista.txt disponível ao lado do index.js (crie este arquivo manualmente, eu não fornecerei o meu por questões de sigilo dos números). Em seguida, fiz um split pelas quebras de linha do arquivo e fui adicionando um a um os números em um array, não sem antes ignorar os duplicados e verificar se os números brasileiros estavam todos começando com 9 e possuindo 9 dígitos no número.
Com isso, ao término da execução deste script ele deve ter um array de números únicos prontos para enviarmos as mensagens. Depois de fazer os testes iniciais, remove as últimas duas linhas (console.log e process.exit) a fim de continuar o desenvolvimento.
Por padrão a Twilio deixa enviar até 100 mensagens por segundo, mas por questões de entregabilidade vamo enviar uma mensagem por vez. Assim que a mensagem anterior finalizar o envio, vamos enviar a próxima e assim por diante. Certamente não é a abordagem com a melhor performance mas diminuirá nossas chances de termos problemas.
Para garantir este comportamento, vou criar uma função recursiva após o código anterior que ao término de sua execução, se chama novamente até acabarem os números para envio. Essa função vai englobar o código antigo de envio, que vimos na parte 1 deste tutorial e fazer a primeira chamada, que vai startar a recursão, ao final do código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
const accountSid = process.env.TWILIO_SID; const authToken = process.env.TWILIO_TOKEN; const client = require('twilio')(accountSid, authToken); function send(array, index) { if (index === array.length) return; return client.messages .create({ to: array[index], from: process.env.TWILIO_NUMBER, body: 'Essa eu aprendi com o LuizTools!', }) .then(message => { console.log(array[index]); console.log('Enviado ' + index + ' de ' + array.length); return send(array, index + 1); }) .catch(err => { console.log(array[index]); console.error(err); process.exit(0); }); } send(array, 0); |
Recomendo que quando for testar esta função crie uma lista pequena e apenas com números conhecidos, a fim de não te sair muito caro principalmente em caso de erro na lógica, e também para não aborrecer usuários reais.
Não esqueça que para testar você vai precisar preencher as variáveis de ambiente adequadamente, então não esqueça de ao menos ler a parte 1 do tutorial para entender do que se trata.
Então é isso, tutorial curto mas espero que seja útil.
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.