Ir al contenido principal

Menús Persistentes para tus Bots de Facebook Messenger



Un Menú Persistente es un menú con diferentes opciones siempre visibles para nuestros usuarios. Así como las respuestas rápidas y los botones, la función del menú persistente es evitar que nuestros usuarios tengan que escribir para obtener alguna respuesta al interactuar con nuestros chatbots.






En este tutorial vamos a crear una aplicación de fotos de perritos usando la API de DOG CEO. El reto de esta aplicación es que los usuarios puedan usar la aplicación sin ningún problema y sin necesidad de escribir nada: con solo nuestro menú persistente deben poder interactuar con nosotros al 100%.
Recuerda que debes leer el artículo completo de Cómo crear un bot para Facebook Messenger  

Programando nuestra aplicación

Vamos a configurar nuestro servidor de Node.js para enviar las fotos de los perritos. Necesitamos instalar las siguientes dependencias:
npm install -S express body-parser request
Comenzamos configurando un servidor común y corriente:
'use strict';

// Nuestras dependencias
const express = require('express');
const bodyParser = require('body-parser');
const request = require('request');

// Algunas cosas que necesitaremos más adelante...
const { PORT = 5000, NODE_ENV = 'development' } = process.env;
const ACCESS_TOKEN = 'Nuestro Token de Facebook';
const FACEBOOK_URI = 'https://graph.facebook.com/v2.6/me/messages';
const API = {
  breed: breed => `https://dog.ceo/api/breed/${breed}/images`,
  random: 'https://dog.ceo/api/breeds/image/random',
};

// La configuración de siempre con express.js
const app = express();
app.set('port', PORT);
app.use(bodyParser.json());

// Configuración de nuestras rutas
app.get('/', function (req, res) {
  res.send('Hello World!');
});

// Corremos el servidor :D
app.listen(app.get('port'), function () {
  console.log('Node app is running on port', app.get('port'));
});

Configuración de Facebook

Para enviar y recibir mensajes de nuestros usuarios debemos configurar las rutas a las cuales Facebook enviará los mensajes de nuestros usuarios. Recuerda que puedes leer más sobre estas configuraciones en: Setting Up Your Webhook - FB Docs.
// Verificación, sólo vamos a utilizar esta ruta 1 vez
app.get('/webhook', function (req, res) {
  const token = req.query['hub.verify_token'];
  const challenge = req.query['hub.challenge'];

  if (token === 'Token de verificación de Facebook') res.send(challenge);
  else res.send('Ups! You need to provide the correct token.');
});

// Facebook entra a esta ruta cada vez que
// nuestros usuarios envían un mensaje
app.post('/webhook/', function (req, res) {
  const events = req.body.entry[0].messaging;
  if (!events) return res.sendStatus(404);
  // Por cada mensaje llamamos a la función "handleEvent"
  events.forEach(handleEvent);
  res.sendStatus(200);
});
Al recibir los mensajes llamaremos a la función handleEvent:
functionhandleEvent(event) {
  const senderId = event.sender.id;

  // No vamos a responder mensajes de texto, solo las acciones del menú
  // if (event.message) return handleMessage(senderId, event.message);
  if (event.postback) return handlePostback(senderId, event.postback);
}




Respuestas a los eventos del menú

A diferencia de los mensajes de texto normales, Facebook nos da la opción de configurar mensajes especiales con variables ocultas que podemos recibir cuando nuestros usuarios usen el menú. Estos mensajes se llaman postbacks y dentro de ellos vamos a encontrar nuestras variables ocultas como payloads.
Más adelante vamos a configurar estos mensajes especiales. Por ahora vamos a crear la función handlePostback para responder dependiendo la opción que escojan nuestros usuarios, además de las funciones necesarias para responder correctamente.
functionhandlePostback(id, postback) {
  const { title, payload } = postback;

  if (payload === 'ABOUT_PAYLOAD' || payload === 'GET_STARTED_PAYLOAD')
    return aboutMessage(id);
  if (payload === 'RANDOM_PAYLOAD') return randomImage(id);
  if (payload.endsWith('_BREED_PAYLOAD')) return breedImage(id, title);
}

functionbreedImage(id, title) {
  const data = { uri: API.breed(title.toLowerCase()) };

  request(data, function (err, res, body) {
    if (err) returnconsole.log(err);

    const image = JSON.parse(body).message[0];

    const message = {
      "recipient": { "id": id },
      "message": {
        "attachment": {
          "type": "image",
          "payload": {
            "url": image,
          },
        },
      }
    };

    return sendMessage(message);
  })
}

functionrandomImage(id) {
  const data = { uri: API.random };

  request(data, function (err, res, body) {
    if (err) returnconsole.log(err);

    const image = JSON.parse(body).message;

    const message = {
      "recipient": { "id": id },
      "message": {
        "attachment": {
          "type": "image",
          "payload": {
            "url": image,
          },
        },
      }
    };

    return sendMessage(message);
  })
}

functionaboutMessage(id) {
  const message = {
    "recipient": { "id": id },
    "message": {
      "text": "👋 ¡Hola! 🤖 Soy un bot de messenger. Es mejor usar el menú 👇"
    }
  };
  
  return sendMessage(message);
}
Lo último que debemos programar es la función sendMessage para, enviar los mensajes:
functionsendMessage(message) {
  const data = {
    "uri": FACEBOOK_URI,
    "qs": { "access_token": ACCESS_TOKEN },
    "method": "POST",
    "json": message,
  };
  
  request(data, function (err) {
      if (err) returnconsole.log('Ha ocurrido un error')
      returnconsole.log('Mensaje enviado')
    }
  );
}

Creación del Menú Persistente

¡Nuestra aplicación está casi lista! Solo hace falta la parte más importante: Crear el menú persistente.
Para esto vamos a usar curl, una herramienta para hacer peticiones HTTP a un servidor. No te preocupes, no hace falta que tengas conocimientos extraordinarios para completar esta etapa.
Necesitamos hacer tres peticiones. Las primeras dos van a configurar los botones y mensajes de bienvenida. Y con la tercera vamos a configurar nuestro menú con las opciones que necesita nuestra aplicación.
1:
curl -X POST -H "Content-Type: application/json"-d'{
  "get_started": {
    "payload": "GET_STARTED_PAYLOAD"
  }
}'"https://graph.facebook.com/v2.6/me/messenger_profile?access_token=TOKEN_DE_FACEBOOK"
2:
curl -X POST -H "Content-Type: application/json"-d'{
  "greeting": [
    {
      "locale": "default",
      "text": "Hello {{user_first_name}}!"
    }
  ]
}'"https://graph.facebook.com/v2.6/me/messenger_profile?access_token=TOKEN_DE_FACEBOOK"
3:
curl -X POST -H "Content-Type: application/json"-d'{
"persistent_menu": [{
  "locale": "default",
  "composer_input_disabled": true,
  "call_to_actions": [
    {
      "title": "🐶 Razas disponibles",
      "type": "nested",
      "call_to_actions": [
        {
          "title": "Affenpinscher",
          "type": "postback",
          "payload": "AFFENPINSCHER_BREED_PAYLOAD"
        },
        {
          "title": "African",
          "type": "postback",
          "payload": "AFRICAN_BREED_PAYLOAD"
        },
        {
          "title": "Airedale",
          "type": "postback",
          "payload": "AIREDALE_BREED_PAYLOAD"
        }
      ]
    },
    {
      "title": "🔁 Perrito Random",
      "type": "postback",
      "payload": "RANDOM_PAYLOAD"
    },
    {
      "title": "💚 Sobre Nosotros",
      "type": "postback",
      "payload": "ABOUT_PAYLOAD"
    }
  ]
}]
}'"https://graph.facebook.com/v2.6/me/messenger_profile?access_token=TOKEN_DE_FACEBOOK"
Aunque todas las peticiones se ejecuten correctamente puede pasar mucho tiempo hasta que veamos los cambios reflejados en nuestro chatbot. Te recomiendo seguir el tutorial hasta aquí, tomar un café, solucionar algunos pendientes, contarle a tu mamá sobre el proyecto en el que estás trabajando, etc. Después de un rato puedes volver para probar y verás cómo funcionan el menú y mensaje de bienvenida.

Conclusión

¡Felicitaciones! Tu chatbot funciona a la perfección y sin necesidad de que nuestros usuarios escriban una sola palabra. Ahora depende de tí: ¿Qué uso le darás a esto que aprendiste?
Espero que te haya gustado esta guía para construir chatbots funcionales sin necesidad de que los usuarios escriban una sola palabra, todo esto gracias al menú persistente. No olvides dejar en los comentarios las aplicaciones increíbles que vas a construir con FB Messenger.








Comentarios

Entradas populares de este blog

MANTENER UNA PÁGINA WEB SEGURA, CLAVE PARA LOGRAR VISIBILIDAD Y AUMENTAR LA CONFIANZA DE LOS VISITANTES

El comercio global y los modelos de negocio se encuentran en pleno proceso de adaptación al mundo digital, que es ya toda una realidad. En este sentido, el 62.6% de los españoles realizó compras a través de Internet en 2020, frente al 58% que lo hicieron en el año anterior, según la Encuesta sobre Equipamiento y Uso de Tecnologías de Información y Comunicación en los Hogares, elaborada por el Instituto Nacional de Estadística. Estamos, por tanto, ante una tendencia al alza en la que las tiendas online están cobrando un peso cada vez más importante para los consumidores.

Crea apps sin programar

Ahora más que nunca, son diversos los medios que permiten tener conocimiento en áreas como la tecnología junto a los sitios web y apps móviles.

Aprende con Platzi | Metodología Ágil y SCRUM para tu vida diaria | Platzi

Usar Metodolgias Agiles para tu dia a dia. Platzi es ese amigo que siempre está aprendiendo cosas nuevas que nunca le sirven a él para gran cosa, pero que cuando viene y te cuenta sobre algo nuevo que aprendió tu puedes hacer clic con algunos conceptos bastante interesantes que a ti si te pueden servir para algo. Yo no critico Platzi y su necesidad de producir contenido a los fines de vender entretenimiento disfrazado de conocimiento, vendiendo una falsa ilusión de aprendizaje, ya que es la unica forma que ellos tienen para ser el mostruo tecnologico que son hoy dia, ademas, si sabes escarbar, te puedes topar con grandes joyitas como este video. Ahora bien, debes ser lo suficientemente inteligente para abandonar un "Curso" lo suficientemente rapido, si el mismo no te está aportando nada. Incluso, perder el tiempo criticando a Platzi y su metodologia, es una gran perdida de tiempo, para mi, Platzi es una genial plataforma, donde puedes, de una manera profesional, conocer de di...