Tutorial de início rápido

Este tutorial apresentará tudo o que você precisa saber para criar a sua primeira experiência no Messenger. Antes de começar, escolha uma das opções em Projeto inicial para obter o código necessário para começar. Depois, siga as etapas em Introdução para fazer a configuração.

Quer ver o código finalizado? Sem problemas! É possível duplicá-lo no GitHub.

Conteúdo

Projeto inicial

Antes de começar este tutorial de início rápido, conclua um dos itens a seguir para garantir que você tenha o código inicial necessário. Esse código fornece um webhook básico que usaremos como base da experiência do Messenger.

Opção 1: criar por conta própria

O guia de configuração de webhooks descreve como criar o seu primeiro webhook, que pode ser usado neste tutorial.

Criar um webhook

Opção 2: baixar no GitHub

Baixe o nosso código inicial de webhook no GitHub e faça a implantação no servidor de sua escolha.

Baixar o código

Opção 3: fazer um remix no Glitch

Caso você não tenha um servidor para implantar o seu webhook, remixe o nosso projeto inicial de webhook no Glitch. Com isso, você terá uma URL pública do seu webhook exibida em HTTPS.

Para criar o próprio webhook no Glitch, faça o seguinte.

  1. Abra o nosso projeto inicial de webhook no Glitch: Remixar no Glitch
  2. Clique no botão "Remixar no Glitch". Uma cópia do projeto será criada para você.
  3. No canto superior esquerdo, clique no menu suspenso e copie a URL pública abaixo da descrição do projeto. Essa será a URL base do webhook.
  4. Siga o nosso guia de configuração do app para assinar o webhook no seu app do Facebook. A URL do webhook será a URL do Glitch mais /webhook ao final:
    https://

Introdução

Antes de criar a sua primeira experiência do Messenger, configure as credenciais do seu app.

1
Configurar o app do Facebook

Caso ainda não tenha feito isto, siga o nosso guia de configuração do app para configurar o seu app do Facebook e usá-lo com a plataforma do Messenger.

Seu app está no modo de desenvolvimento

Até que o seu app seja enviado e aprovado para uso público no Messenger, os tokens de página permitirão que a sua Página interaja somente com contas do Facebook que tenham a função de administrador, desenvolvedor ou testador no app.

Para atribuir essas funções a outras contas do Facebook, visite a aba "Funções" nas configurações do app.

2
Gerar um token de acesso à Página

Todas as solicitações às APIs da Plataforma do Messenger são autenticadas ao incluir um token de acesso no nível da página no parâmetro access_token da string de consulta.

Caso não tenha feito isto ao configurar o app do Facebook, gere um token de acesso à Página seguindo estas etapas:

  1. Na seção "Tokens de acesso" nas configurações do Messenger do seu app, selecione a página do Facebook para a qual deseja gerar um token no menu suspenso "Páginas". Um token de acesso aparecerá no campo "Token de acesso à página".
  2. Clique em "Copiar" para copiar o token para a área de transferência.

O token gerado NÃO ficará salvo na interface do usuário. Cada vez que você selecionar uma Página no menu suspenso, um novo token será gerado. Se um novo token for gerado, os tokens anteriores continuarão funcionando.
3
Salvar o token de página como uma variável de ambiente

Recomendamos que você mantenha as suas informações confidenciais (como o token de acesso à página) seguras não as codificando no webhook.

Para fazer isso, adicione o seguinte às suas variáveis de ambiente, sendo <PAGE_ACCESS_TOKEN> o token de acesso gerado e <VERIFY_TOKEN> uma string aleatória definida para verificar o webhook:

PAGE_ACCESS_TOKEN="

Variáveis de ambiente no Glitch

Se você estiver usando o Glitch, defina as variáveis de ambiente no arquivo .env fornecido para garantir que elas não fiquem visíveis a outros usuários.

4
Adicionar a página e verificar os tokens no webhook

Agora, tudo o que você precisa fazer é adicionar o token de acesso à página e verificá-lo na parte superior do arquivo app.js para que esse token seja usado na sua lógica de webhook:

const PAGE_ACCESS_TOKEN = process.env.PAGE_ACCESS_TOKEN;
const VERIFY_TOKEN = process.env.VERIFY_TOKEN;

Configuração concluída

Vamos criar sua primeira experiência no Messenger!

Criar a experiência

Neste tutorial, criaremos uma experiência simples do Messenger que faz o seguinte:

Analisa a mensagem e o ID do remetente no escopo da página a partir de um evento de webhook recebido.

Gerencia eventos de webhook messages e messaging_postbacks.

Envia mensagens por meio da API de Envio.

Responde a mensagens de texto com uma mensagem de texto.

Responde a anexos de imagem com um modelo genérico que usa a imagem recebida.

Responde a uma carga postback condicionalmente.


1
Fazer stub out de funções do manipulador

Para começar, faremos stub out de três funções que administrarão os tipos de eventos de webhook recebidos aos quais queremos oferecer suporte, além de responder por meio da API de Envio. Para fazer isso, anexe o seguinte ao seu arquivo app.js:

// Handles messages events
function handleMessage(sender_psid, received_message) {

}

// Handles messaging_postbacks events
function handlePostback(sender_psid, received_postback) {

}

// Sends response messages via the Send API
function callSendAPI(sender_psid, response) {
  
}
2
Obter o ID do remetente no escopo da página

Para responder às pessoas no Messenger, primeiro precisamos saber quem elas são. No Messenger, fazemos isso ao obter o ID do remetente no escopo da página (PSID) a partir do evento de webhook recebido.

O que é o PSID?


As pessoas recebem um ID no escopo da página (PSID) exclusivo para cada página do Facebook com a qual iniciam uma conversa. O PSID é usado para identificar uma pessoa ao enviar mensagens.

Se você concluiu uma das opções na seção Projeto inicial, você tem um ponto de extremidade /webhook básico que aceita as solicitações POST e registra o corpo de eventos de webhook recebidos com esta aparência:

app.post('/webhook', (req, res) => {  

  // Parse the request body from the POST
  let body = req.body;

  // Check the webhook event is from a Page subscription
  if (body.object === 'page') {

    // Iterate over each entry - there may be multiple if batched
    body.entry.forEach(function(entry) {

      // Get the webhook event. entry.messaging is an array, but 
      // will only ever contain one event, so we get index 0
      let webhook_event = entry.messaging[0];
      console.log(webhook_event);
      
    });

    // Return a '200 OK' response to all events
    res.status(200).send('EVENT_RECEIVED');

  } else {
    // Return a '404 Not Found' if event is not from a page subscription
    res.sendStatus(404);
  }

});

Para obter o PSID do remetente, atualize o bloco body.entry.forEach com o seguinte código para extrair o PSID da propriedade sender.id do evento:

body.entry.forEach(function(entry) {

  // Gets the body of the webhook event
  let webhook_event = entry.messaging[0];
  console.log(webhook_event);

  // Get the sender PSID
  let sender_psid = webhook_event.sender.id;
  console.log('Sender PSID: ' + sender_psid);

});

Faça o teste!


Abra o Messenger e envie uma mensagem para a página do Facebook associada à sua experiência. Você não receberá uma resposta no Messenger, mas deverá ver uma mensagem com o seu PSID registrado no console em que o webhook está sendo executado:
Sender PSID: 1254938275682919
3
Analisar o tipo de evento de webhook

Queremos que nossa experiência seja capaz de administrar dois tipos de evento de webhook: messages e messaging_postback. O nome do tipo de evento não é incluído no corpo do evento, mas podemos determiná-lo verificando certas propriedades do objeto.

O que são os eventos de webhook?


A plataforma do Messenger envia eventos de webhook para notificar você sobre as ações que ocorrem no Messenger. Os eventos são enviados no formato JSON como solicitações POST para o seu webhook. Para saber mais, consulte Webhooks para a plataforma do Messenger.

Para fazer isso, atualize o bloco body.entry.forEach do webhook com uma condicional que verifica se o evento recebido contém uma propriedade message ou postback. Também adicionaremos chamadas às funções handleMessage() e handlePostback() que fizemos stub out antes:

body.entry.forEach(function(entry) {

  // Gets the body of the webhook event
  let webhook_event = entry.messaging[0];
  console.log(webhook_event);


  // Get the sender PSID
  let sender_psid = webhook_event.sender.id;
  console.log('Sender PSID: ' + sender_psid);

  // Check if the event is a message or postback and
  // pass the event to the appropriate handler function
  if (webhook_event.message) {
    handleMessage(sender_psid, webhook_event.message);        
  } else if (webhook_event.postback) {
    handlePostback(sender_psid, webhook_event.postback);
  }
  
});
4
Gerenciar mensagens de texto

Agora que as mensagens recebidas estão sendo encaminhadas à função de manipulador apropriada, atualizaremos handleMessage() para administrar e responder a mensagens de texto básicas. Para fazer isso, atualize o código definindo a carga de mensagem da resposta e passe essa carga para callSendAPI(). Queremos responder com uma mensagem de texto básica. Por isso, definiremos um objeto JSON com uma propriedade "text":

function handleMessage(sender_psid, received_message) {

  let response;

  // Check if the message contains text
  if (received_message.text) {    

    // Create the payload for a basic text message
    response = {
      "text": `You sent the message: "${received_message.text}". Now send me an image!`
    }
  }  
  
  // Sends the response message
  callSendAPI(sender_psid, response);    
}
5
Enviar uma mensagem com a API de Envio

Chegou a hora de enviar sua primeira mensagem com a API de Envio da plataforma do Messenger!

Em handleMessage(), faremos uma chamada a callSendAPI(). Agora, precisamos atualizar esse elemento com objetivo de criar o corpo completo da solicitação e enviá-lo para a plataforma do Messenger. A solicitação para a API de Envio tem duas propriedades:

  • recipient: define o destinatário da mensagem. Nesse caso, identificamos a pessoa usando o PSID.
  • message: define os detalhes da mensagem a ser enviada. Esse campo será definido como o objeto de mensagem que passamos com a função handleMessage().

Ao criar o corpo da solicitação, atualize o stub de callSendAPI() para o seguinte:

function callSendAPI(sender_psid, response) {
  // Construct the message body
  let request_body = {
    "recipient": {
      "id": sender_psid
    },
    "message": response
  }
}

Agora, tudo o que precisamos fazer é enviar a mensagem por meio da solicitação POST à API de Envio em https://graph.facebook.com/v2.6/me/messages.

O PAGE_ACCESS_TOKEN deve ser anexado ao parâmetro access_token da string de consulta da URL.

Fazer solicitações HTTP

Neste tutorial, usamos o módulo de solicitação Node.js para enviar solicitações HTTP de volta à plataforma do Messenger. Porém, você pode usar o cliente HTTP de sua preferência.

Para instalar o módulo de solicitação, execute npm install request --save na linha de comando. Depois, importe o módulo adicionando o seguinte ao topo de app.js:

const request = require('request');
function callSendAPI(sender_psid, response) {
  // Construct the message body
  let request_body = {
    "recipient": {
      "id": sender_psid
    },
    "message": response
  }

  // Send the HTTP request to the Messenger Platform
  request({
    "uri": "https://graph.facebook.com/v2.6/me/messages",
    "qs": { "access_token": process.env.PAGE_ACCESS_TOKEN },
    "method": "POST",
    "json": request_body
  }, (err, res, body) => {
    if (!err) {
      console.log('message sent!')
    } else {
      console.error("Unable to send message:" + err);
    }
  }); 
}

Faça o teste!

No Messenger, envie outra mensagem de texto para a sua página do Facebook. Você deverá receber uma resposta automática da sua experiência do Messenger que ecoa sua mensagem e solicita que você envie uma imagem.
6
Gerenciar anexos

Como a resposta solicita que o destinatário envie uma imagem, a próxima etapa é atualizar o código para administrar um anexo. Os anexos enviados são salvos automaticamente pela plataforma do Messenger e disponibilizados por meio de uma URL na propriedade payload.url de cada índice na matriz attachments. Por isso, também extrairemos isso do evento.

Quais tipos de anexo são compatíveis?


Sua experiência no Messenger pode enviar e receber a maioria dos tipos de ativo, incluindo imagem, áudio, vídeo e arquivo. A mídia é exibida e pode ser reproduzida na conversa, permitindo que você crie experiências multimídia.

Para determinar se a mensagem é um anexo, atualize a condicional na função handleMessage() para verificar se há a propriedade attachments na received_message. Depois, extraia a URL dela. Em um bot de verdade, repetiríamos a matriz para verificar diferentes anexos. Entretanto, usaremos apenas o primeiro anexo neste tutorial.

function handleMessage(sender_psid, received_message) {

  let response;

  // Checks if the message contains text
  if (received_message.text) {
    
    // Creates the payload for a basic text message, which
    // will be added to the body of our request to the Send API
    response = {
      "text": `You sent the message: "${received_message.text}". Now send me an attachment!`
    }

  } else if (received_message.attachments) {
  
    // Gets the URL of the message attachment
    let attachment_url = received_message.attachments[0].payload.url;
  
  } 
  
  // Sends the response message
  callSendAPI(sender_psid, response);    
}
7
Enviar uma mensagem estruturada

Depois, responderemos à imagem com uma mensagem de modelo genérica. O modelo genérico é o tipo mais usado de mensagem estruturada, que permite enviar imagem, texto e botões em uma mensagem.

Há outros modelos de mensagem disponíveis?


Sim. A plataforma do Messenger fornece um conjunto de modelos de mensagem úteis, projetados para oferecer suporte a estruturas de mensagem específicas e comuns, incluindo listas, recibos, botões e muito mais. Para saber mais, consulte Modelos de mensagem.

Os modelos de mensagens são definidos na propriedade attachment da mensagem, que contém as propriedades type e payload. Em payload, definimos os detalhes do modelo genérico nas seguintes propriedades:

  • template_type: define o tipo de modelo usado na mensagem. Estamos usando o modelo genérico, então o valor é "generic".
  • elements: define as propriedades personalizadas do modelo. Para o modelo genérico, especificaremos título, subtítulo, imagem e dois botões de postback.

Para a mensagem estruturada, usaremos a attachment_url que foi enviado como a image_url a ser exibida no modelo, além de incluir alguns botões de postback a fim de permitir que o destinatário responda à mensagem. Para criar a carga da mensagem e enviar o modelo genérico, atualize handleMessage() para o seguinte:

function handleMessage(sender_psid, received_message) {
  let response;
  
  // Checks if the message contains text
  if (received_message.text) {    
    // Create the payload for a basic text message, which
    // will be added to the body of our request to the Send API
    response = {
      "text": `You sent the message: "${received_message.text}". Now send me an attachment!`
    }
  } else if (received_message.attachments) {
    // Get the URL of the message attachment
    let attachment_url = received_message.attachments[0].payload.url;
    response = {
      "attachment": {
        "type": "template",
        "payload": {
          "template_type": "generic",
          "elements": [{
            "title": "Is this the right picture?",
            "subtitle": "Tap a button to answer.",
            "image_url": attachment_url,
            "buttons": [
              {
                "type": "postback",
                "title": "Yes!",
                "payload": "yes",
              },
              {
                "type": "postback",
                "title": "No!",
                "payload": "no",
              }
            ],
          }]
        }
      }
    }
  } 
  
  // Send the response message
  callSendAPI(sender_psid, response);    
}

Faça o teste!

No Messenger, envie uma imagem para a sua página do Facebook. Sua experiência no Messenger deverá responder com um modelo genérico.
8
Gerenciar postbacks

A última etapa é gerenciar o evento de webhook messaging_postbacks que será enviado quando o destinatário tocar em um dos botões de postback no modelo genérico.

O que posso fazer com postbacks?


O botão de postback envia um evento de webhook messaging_postbacks com uma string personalizada de até 1.000 caracteres na propriedade payload. Isso permite que você implemente facilmente diferentes cargas de postback que você pode analisar e responder com comportamentos específicos.

Como o modelo genérico permite que o destinatário escolha entre dois botões, responderemos com base no valor da propriedade payload do evento de postback. Para fazer isso, atualize o seu stub handlePostback() para o seguinte:

function handlePostback(sender_psid, received_postback) {
  let response;
  
  // Get the payload for the postback
  let payload = received_postback.payload;

  // Set the response based on the postback payload
  if (payload === 'yes') {
    response = { "text": "Thanks!" }
  } else if (payload === 'no') {
    response = { "text": "Oops, try sending another image." }
  }
  // Send the message to acknowledge the postback
  callSendAPI(sender_psid, response);
}

Faça o teste!

No Messenger, toque em cada um dos botões de postback no modelo genérico. Você receberá uma resposta de texto específica para cada botão.
9
Se tudo deu certo, você acabou de criar a sua primeira experiência no Messenger!

Suporte ao desenvolvedor