Envie lembretes diários via SMS usando as plataformas Firebase, Node.js e Twilio

September 29, 2014
Escrito por

Enviar lembretes diários via SMS usando as plataformas Firebase, Node.js e Twilio

Você não precisa amarrar um barbante ao redor do dedo. Usando o Node.js, o Firebase e o Twilio, você pode criar seu próprio aplicativo de lembrete diário via SMS.

O que você vai precisar

Usaremos algumas ferramentas para criar esse app. É necessário preparar estes recursos antes de continuar:

  • Twilio: para enviar e receber mensagens SMS. Não tem uma conta do Twilio? Cadastre-se gratuitamente.
  • Firebase: uma API de banco de dados em tempo real. Nós o usaremos para armazenar os usuários que se cadastraram em nosso serviço.
  • Node.js: uma plataforma baseada no tempo de execução JavaScript do Chrome que cria facilmente aplicativos de rede rápidos e escaláveis.

Programar mensagens SMS com Cron

Para começar, teremos que instalar alguns pacotes npm. Usaremos o pacote twilio para enviar mensagens de texto e o pacote cron para programar a hora em que queremos enviar essas mensagens. Você pode instalá-los executando os seguintes comandos:

npm install twilio
npm install cron

Crie um novo arquivo chamado app.js e solicite os pacotes twilio e cron:

var twilio = require('twilio'),
var client = new twilio('ACCOUNTSID', 'AUTHTOKEN'),
cronJob = require('cron').CronJob;

Vamos escrever um código que enviará uma mensagem de texto às 18h todos os dias:

var textJob = new cronJob( '0 18 * * *', function(){
  client.messages.create( { to:'YOURPHONENUMBER', from:'YOURTWILIONUMBER', body:'Hello! Hope you're having a good day!' }, function( err, data ) {});
},  null, true);

Espere, você provavelmente está se perguntando qual é a string que estamos transmitindo como o primeiro argumento para nosso cronJob. Trata-se de um formato específico para cron que nos permite definir a hora e a frequência com que queremos que esta tarefa seja acionada. Nesse caso, às 18 horas e 0 minutos todos os dias. Este artigo faz um detalhamento excelente do formato cron.

No retorno de chamada para o nosso cronJob, usamos a biblioteca do Twilio Client para enviar uma mensagem. Transmitimos os números de origem e destino e o corpo da mensagem que queremos enviar.

Execute este código e aguarde sua mensagem de texto. Se for 10h, você provavelmente não vai querer esperar mais 8 horas para ver se o seu código funciona. Portanto, basta atualizar o formato Cron para enviá-la mais cedo. Aqui vai uma dica: para enviar às 10h13, use o formato "13 10 * * *".

Agora, você tem uma versão básica desse app, mas é muito provável que você não queira apenas enviar uma mensagem para si mesmo todos os dias. Se não for o seu caso, parabéns! É isso aí! Para o restante de nós, podemos fazer algumas pequenas alterações de código para que isso seja enviado para vários números de telefone.

Primeiro, vamos adicionar uma nova variável chamada "numbers" (números) que contém os números de telefone para os quais queremos enviar mensagens:

var numbers = ['YOURPHONENUMBER', 'YOURFRIENDSPHONENUMBER'];

Em seguida, vamos atualizar o código em nosso textJob para fazer o looping desses números de telefone e enviar uma mensagem para eles:

for( var i = 0; i < numbers.length; i++ ) {
  client.messages.create( { to:numbers[i], from:'YOURTWILIONUMBER', body:'Hello! Hope you're having a good day.'}, function( err, data ) {
    console.log( data.body );
  });
}

Receber mensagens SMS

Agora que estamos enviando uma mensagem SMS para números diferentes no momento que queremos, vamos atualizar esse código para saber quando um usuário envia uma mensagem de texto para o app. O Twilio usa webhooks para informar o servidor quando uma mensagem ou chamada telefônica chega ao app. Precisamos configurar um endpoint que podemos pedir ao Twilio para usar no webhook de mensagens.

Usaremos o framework Express para configurar nosso servidor da Web de nodes (nós) e receber a solicitação POST do Twilio, por isso teremos que instalar o pacote Express. Também usaremos o módulo "body-parser". Vamos instalá-lo também:

npm install express
npm install body-parser

No início do nosso arquivo app.js, precisaremos solicitar o Express e inicializá-lo em uma variável chamada "app". Também vamos usar o middleware bodyParser para facilitar o uso dos dados que obteremos em nossa solicitação POST.

var express = require('express');
bodyParser = require('body-parser');
var MessagingResponse = require('twilio').twiml.MessagingResponse;
app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

Vamos adicionar uma rota para /message que responda com algumas TwiML. TwiML é um conjunto básico de instruções que você pode usar para dizer ao Twilio o que fazer quando receber uma chamada ou mensagem SMS. Nosso código ficará assim:

app.post('/message', function (req, res) {
  var resp = new MessagingResponse();
  resp.message('Thanks for subscribing!');
  res.writeHead(200, {
    'Content-Type':'text/xml'
  });
  res.end(resp.toString());
});

Usamos a biblioteca de nodes (nós) do Twilio para inicializar uma nova TwimlResponse. Em seguida, usamos o verbo Mensagem para definir com o que queremos responder à mensagem. Neste caso, vamos dizer apenas "Thanks for subscribing!" (Obrigado por assinar!). Em seguida, vamos definir o tipo de conteúdo de nossa resposta como text/xml e enviar a representação da string da TwimlResponse que criamos.

Por fim, vamos configurar o servidor para ouvir na porta 3000.

var server = app.listen(3000, function() {
  console.log('Listening on port %d', server.address().port);
});

Agora, vamos ativar o app:

node app.js

Se você estiver executando essa função localmente, será necessário verificar se o ngrok está em execução antes de passar para a próxima etapa. Se você ainda não usou o ngrok, meu grande amigo, Kevin, reuniu um ótimo tutorial para ajudar você nos primeiros passos.

Agora que o servidor está em execução, precisamos dizer ao Twilio para usar este URL de mensagens como nosso URL de solicitação de mensagem:

Tela de configuração do console da Twilio contendo o campo para configurar o webhook de mensagens recebidas.

Envie uma mensagem SMS para o número do Twilio. Você deverá receber uma resposta. Se não receber, dê uma olhada no Monitor de apps do Twilio para saber o que deu errado.

Salvar usuários no Firebase

Configuramos um script que envia uma mensagem de texto no mesmo horário todos os dias e proporcionamos aos usuários a possibilidade de enviar uma mensagem de texto para nosso app. Resta apenas uma última coisa a fazer. Precisaremos salvar as informações dos nossos usuários quando eles enviarem um texto para nosso app. Usaremos o Firebase como nosso datastore, então precisamos instalar o módulo do node (nó) do Firebase:

npm install firebase

Agora que instalamos o módulo do Firebase, vamos solicitá-lo e inicializá-lo na parte superior do nosso arquivo app.js:

var Firebase = require('firebase'),
usersRef = new Firebase('{FIREBASEURL}/Users/');

Quando você cria uma conta do Firebase, é fornecido um URL para seu datastore. Atualize esse código substituindo {FIREBASEURL} por esse URL.

Como vamos extrair os números de telefone do Firebase, precisamos atualizar a variável dos números para que ela seja uma matriz vazia e, em seguida, preenchê-la com informações do banco de dados. O Firebase é um banco de dados em tempo real e foi criado com base na premissa de assinatura de eventos em vez de leitura sob demanda. Vamos assinar um evento de atualização sempre que um novo usuário for adicionado:

var numbers = [];
usersRef.on('child_added', function(snapshot) {
numbers.push( snapshot.val() );
  console.log( 'Added number ' + snapshot.val() );
});

Agora, precisaremos adicionar os usuários ao nosso banco de dados quando eles enviarem uma mensagem com o texto "assinar". Vamos rever a rota da mensagem para fazer essa atualização:

app.post('/message', function (req, res) {
  var resp = new MessagingResponse();
  if( req.body.Body.trim().toLowerCase() === 'subscribe' ) {
    var fromNum = req.body.From;
    if(numbers.indexOf(fromNum) !== -1) {
      resp.message('You already subscribed!');
    } else {
      resp.message('Thank you, you are now subscribed. Reply "STOP" to stop receiving updates.');
      usersRef.push(fromNum);
    }
  } else {
    resp.message('Welcome to Daily Updates. Text "Subscribe" receive updates.');
  }

  res.writeHead(200, {
    'Content-Type':'text/xml'
  });
  res.end(resp.toString());

});

Quando o webhook de mensagens do Twilio aciona uma nova solicitação POST para o seu servidor, incluímos parâmetros de solicitação com informações sobre a mensagem. Usaremos o parâmetro "Body" para examinar o conteúdo que o usuário enviou por mensagem de texto e o parâmetro "From" para determinar o número usado para enviá-la. Se ele enviar a palavra "assinar" e ainda não estiver em nosso banco de dados, usaremos a função push na nossa referência do Firebase para adicioná-la.

Agora, o app está pronto. Vamos executá-lo e testá-lo:

node app.js

O que você fará

Conseguimos! Agora que você criou um app simples de lembrete diário via SMS, pode personalizar a mensagem diária conforme preferir. Talvez queira incluir uma citação de Jack Handy, uma notícia do NY Times ou um link para um gif engraçado.

Este artigo foi traduzido do original "Send Daily SMS Reminders Using Firebase". Enquanto melhoramos nossos processos de tradução, adoraríamos receber seus comentários em help@twilio.com - contribuições valiosas podem render brindes da Twilio.