https://a.storyblok.com/f/270183/31822/a708f6dd31/blog_facebook-messenger_node-js_1200x600.png

Como enviar uma mensagem pelo Facebook Messenger usando o Node.js

Publicado em November 19, 2020

Tempo de leitura: 3 minutos

Com o Facebook Messenger, as pessoas conectadas à sua organização no Facebook podem acessar serviços automatizados úteis. Você pode receber pedidos, fornecer atualizações ou responder a perguntas. Se você ainda não tem experiência com esse tipo de comunicação ou, até agora, dependia exclusivamente do Facebook para sua presença na web, talvez seja uma boa ideia experimentá-lo primeiro usando o Sandbox da Messages APIda Vonage.

Pré-requisitos

Neste exemplo, você vai configurar um serviço rápido para responder às mensagens do Messenger com uma recomendação do que comer no almoço. O Messenger é um pouco diferente, pois o cliente precisa iniciar a conversa com você antes que você possa enviar uma mensagem para ele. Portanto, não podemos testá-lo simplesmente enviando uma mensagem; precisamos primeiro aguardar a chegada de uma mensagem. Para isso, precisaremos de um servidor Node, além dos pré-requisitos gerais para usar a sandbox:

Para receber mensagens, seu servidor precisará estar disponível publicamente. Você pode fazer isso em sua máquina de desenvolvimento com ngrok, ou usar o Glitch, como fiz no código de exemplo.

Criar um servidor

Crie um novo server.js arquivo no seu diretório de trabalho. Seu servidor será muito parecido com a maioria dos servidores Express minimalistas. Você precisará incluir o pacote e obter uma instância, além de incluir body-parser e axios. Por fim, você configurará o middleware e ficará à escuta na porta 3000.

O objetivo do servidor aqui é fornecer pontos de conexão para seus webhooks. Você também pode adicioná-los: um para mensagens recebidas e outro para status. Por enquanto, eles podem simplesmente responder com uma confirmação de que a solicitação chegou ao seu destino:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const axios = require('axios');

app.use(bodyParser.json());

// when someone messages the number linked to this app, this endpoint "answers"
app.post('/answer', function(req, res) {
  res.status(204).end();
});

// this endpoint receives information about events in the app
app.post('/event', function(req, res) {
  res.status(204).end();
});

app.listen(3000);

Observação: Não se esqueça de configurar seus endpoints de webhook no seu painel. Você pode configurar ambos na Sandbox da Messages API. Para este exemplo, elas devem ser solicitações POST com o seguinte formato https://YOUR-SERVER/answer e https://YOUR-SERVER/event.

Adicione alguns dados

Para enviar mensagens, você precisará das suas credenciais de API e do ID do Messenger do ambiente de teste (sandbox) a partir do qual a mensagem será enviada. Você pode obter todos esses valores por meio do comando cURL na página do ambiente de teste. Como você enviará sugestões de almoço, também pode criar um array com dez opções de almoço para servir como dados de teste.

Você não verá o ID do Messenger do usuário final até que ele tenha enviado uma mensagem para você. Assim que o seu /answer seu endpoint receber uma solicitação, você poderá obter o from_id no corpo da solicitação. Você pode salvá-lo para usar como o ID de “destinatário” na sua mensagem:

var user = '12ab3456';
var password = '123AbcdefghIJklM';
var my_id = '123456789012345';

var lunches = ['bbq','teriyaki','salad','a bagel','curry','dumplings','tacos','a sub','bibimbap','pizza'];

// when someone messages the number linked to this app, this endpoint "answers"
app.post('/answer', function(req, res) {
  var from_id = req.body.from.id;
  
  res.status(204).end();
});

Responder às mensagens recebidas

Agora você tem todos os elementos necessários para criar uma resposta para o seu usuário. Para este exemplo pontual, basta usar o axios para fazer a solicitação. Você fornecerá a ele a URL da sandbox, um objeto de dados e sua chave e senha da API. O objeto de dados contém o ID da sandbox de onde a mensagem será enviada, o ID do usuário cadastrado para quem ela será enviada e um texto com uma sugestão aleatória de almoço.

Depois de enviar a solicitação, você pode aguardar uma resposta ou a ocorrência de algum erro. Em condições ideais, você não verá nada ali além da confirmação do que enviou:

// when someone messages the number linked to this app, this endpoint "answers"
app.post('/answer', function(req, res) {
  var from_id = req.body.from.id;
  
  axios.post('https://messages-sandbox.nexmo.com/v0.1/messages',{
    "from": { "type": 'messenger', "id": my_id },
    "to": { "type": 'messenger', "id": from_id },
    "message": {
      "content": {
        "type": 'text',
        "text": 'You should have ' + 
          lunches[Math.floor(Math.random() * 10)] + ' for lunch.'
      }
    }
  },{
    auth: {
      username: user,
      password: password
    }
  })
  .then(function (response) {
    console.log('Status: ' + response.status);
    console.log(response.data);
  })
  .catch(function (error) {
    console.error(error);
  });
  
  res.status(204).end();
});

Experimente

Inicie seu servidor com node server.js se ele ainda não estiver em execução. A partir do seu cliente do Messenger incluído na lista de permissões, envie uma mensagem para a conta de teste da Vonage. (Não importa o que esteja escrito.) Você deve receber uma resposta e as confirmações no seu console.

Getting lunch suggestions via Facebook MessengerMessenger Sandbox

Agora que você já viu como a comunicação com o Messenger funcionam, você pode começar a incorporá-las aos seus aplicativos reais. Você pode usar o Sandbox da Messages API para desenvolvimento com o SDK do Vonage para Node.js. Quando estiver pronto, você pode conectar sua própria Página do Facebook e colocar tudo no ar!

Veja e remixe o exemplo no Glitch para ver todo o código de uma só vez.

Compartilhar:

https://a.storyblok.com/f/270183/250x250/f231d97f1b/garann-means.png
Garann MeansFormador de Desenvolvedores

Sou desenvolvedor de JavaScript e instrutor de desenvolvimento na Vonage. Ao longo dos anos, tenho me interessado muito por modelos, Node.js, aplicativos web progressivos e estratégias “offline-first”, mas o que sempre adorei de verdade é uma API útil e bem documentada. Meu objetivo é tornar a sua experiência com nossas APIs a melhor possível.