Cómo crear imágenes a partir de HTML para crear tarjetas enriquecidas dinámicas

Uno de los tipos de contenido más potentes y versátiles de RCS Business La mensajería es la tarjeta enriquecida. Con una tarjeta enriquecida, puedes enviar información relacionada en un solo mensaje, incluidos una imagen o un video, un título, una descripción y hasta cuatro respuestas o acciones sugeridas.

Las tarjetas enriquecidas independientes y los carruseles de tarjetas enriquecidas son funciones potentes que pueden: te ayudan a crear experiencias atractivas para los usuarios. Funcionan muy bien siempre que que debes compartir son imágenes estáticas, como un cupón o un producto. Pero lo que si debes enviar contenido dinámico basado en información sobre el usuario como una tarjeta de embarque?

En este documento, te mostraré cómo crear imágenes al instante con HTML y Incorpora esas imágenes en las tarjetas enriquecidas que envía tu agente. Ver cómo convertir HTML en una imagen.

De HTML a imagen

HTML es ideal para diseñar combinaciones de texto y medios. Como desarrolladores, si necesitamos crear un producto para enviarle a un usuario algo como una tarjeta de embarque, datos gráfico de uso o cualquier otro tipo de información específica del usuario, es probable que el HTML generado sea la herramienta que utilizaremos. En RCS Business Messaging, enriquecida las tarjetas solo admiten tipos de medios de imagen y video, así que para usar el el poder del HTML para la generación de contenido dinámico, el HTML primero debe estar se convierten en imágenes.

Afortunadamente, la mayoría de los lenguajes de programación modernos admiten bibliotecas para llevar capturas de pantalla de páginas web o componentes que pueden renderizar al menos HTML básico (para ejemplo, JEditorPane), que puedes usar para generar una imagen.

También hay APIs disponibles para tomar fotos de páginas web. Por ejemplo: API de Page Insights de Google pueden generar capturas de pantalla automáticamente a partir de una URL.

Ejemplo:

https://www.googleapis.com/pagespeedonline/v1/runPagespeed?url=https://www.google.com&screenshot=true

A continuación, usaremos una app exprés de Node.js para generar una red tarjeta de embarque con HTML, conviértela en una imagen y súbela a una URL accesible y, luego, adjunta la imagen en una tarjeta enriquecida para enviarla a un usuario.

Cómo crear una tarjeta de embarque dinámica

Para comenzar, necesitamos el código HTML para generar una tarjeta de embarque como la siguiente imagen.

Muestra de tarjeta de embarque

Existen muchas formas de hacerlo, pero vamos a definir un extremo de URL. en una app de Node.js llamada /getTicket?msisdn=+12223334444, que renderiza el HTML que necesitamos para la tarjeta de embarque con el motor de vistas EJS.

Supongamos que hay una función llamada getUserTicket que toma el número de teléfono y devuelve un objeto ticket que contiene información como la hora de salida, el asiento, el tipo de boleto y la ubicación de partida.

Dentro del router de la app Express, definimos el extremo getTicket, llamamos al getUserTicket y pasa el ticket a la plantilla EJS.

router.get('/getTicket', function(req, res, next) {
    // Get the passed in phone number
    let msisdn = req.body.msisdn;

    // Get the ticket object for this user
    let ticket = getUserTicket(msisdn);

    // Render the ticket in HTML using an EJS template
    res.render('ticket', {ticket: ticket});
});

La plantilla EJS del ticket define el siguiente HTML para renderizar el Bonjour de muestra Boleto de tren.

<div>
  <div>
    <div class="left"><img width="200" src="/images/bonjour-rail-logo.png" /></div>
    <div class="right muted-text"><%= ticket.dateOfDeparture; %></div>
    <div class="cl"></div>
  </div>
  <div>
    <div class="left highlighted-text-color"><h2><%= ticket.startingLocation.city %></h2><br/><%= ticket.startingLocation.station %></div>
    <div class="right highlighted-text-color"><h2><%= ticket.endingLocation.city %></h2><br/><%= ticket.endingLocation.station %></div>
    <div class="cl"></div>
  </div>

  <div>
    <div class="left">
        <h3>PLATFORM <%= ticket.platform %></h3>
      <div>
        <div class="left">
          <div><h4>DEPART</h4></div>
          <div><%= ticket.departureTime %></div>
        </div>
        <div class="left">
          <div><h4>ARRIVE</h4></div>
          <div><%= ticket.arrivalTime %></div>
        </div>
        <div class="cl"></div>
      </div>
      <div>
        <div class="left">
          <div><h4>TICKET TYPE</h4></div>
          <div><%= ticket.ticketType %></div>
        </div>
        <div class="left">
          <div><h4>SEAT</h4></div>
          <div><%= ticket.seat %></div>
        </div>
        <div class="cl"></div>
      </div>
    </div>
    <div class="right">
      <img src="<%= ticket.qrCode %>" width="170" />
    </div>
    <div class="cl"></div>
  </div>
</div>

Cómo crear una imagen a partir de HTML

Definimos el código HTML para construir la tarjeta de embarque, pero necesitamos una manera de convertirlo en una imagen.

Existen muchos módulos Node.js de código abierto disponibles para convertir HTML sin procesar. y URLs en imágenes. Para este ejemplo, usaremos node-webshot que es un wrapper ligero alrededor de PhantomJS.

PhantomJS es un navegador sin interfaz gráfica que admite secuencias de comandos y que puede convertir HTML en imágenes. Como PhantomJS se basa en WebKit para la renderización, puede manejar páginas complejas con imágenes, CSS y JavaScript.

Después de instalar el webhook del nodo (npm install --save node-webshot), convierte HTML a una imagen es sencillo.

var webshot = require('node-webshot');
let url = '/getTicket?msisdn=' + msisdn;
let htmlAsImageFileLocation = 'ticket.png';

// Define screenshot options
var options = {
      screenSize: {
            width: 550,
            height: 450
      },
      shotSize: {
            width: 550,
            height: 450
      },
      userAgent: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g'
    };

// Save html as an image
webshot(url, htmlAsImageFileLocation, options, function(err) {
  // TODO: Upload image to a publicly accessible URL
});

Almacena archivos en una URL de acceso público

Para usar la imagen que generó webshot, necesitamos una imagen de acceso público URL. Si generas la imagen en un servidor web dedicado, tal vez puedas para guardar el archivo en una carpeta pública, pero, en este ejemplo, vamos a subir a Google Cloud Storage.

La siguiente función toma una ubicación de imagen local y la sube a Google Cloud Storage, que muestra el vínculo de medios recién creado.

function uploadImage(imageLocation) {
    const {Storage} = require('@google-cloud/storage');

    // Creates a client
    const storage = new Storage();

    // Define the Cloud storage location and filename
    const bucketName = 'sample-image-uploads';
    const yourFileDestination = 'uploaded-image.png';

    // Set the options for the upload to be readable by anyone
    const options = {
        destination: yourFileDestination,
        predefinedAcl: 'publicRead'
    };

    // Return a promise that includes the storage upload
    return new Promise(function(resolve, reject) {
        // Uploads a local file to the bucket
        storage.bucket(bucketName).upload(imageLocation, options)
            .then(results => {
                // Return the image URL
                resolve(results[0].metadata.mediaLink);
            }).catch(error => {
                reject(error);
            });
    });
}

A continuación, debemos reemplazar el comentario TODO anterior por una llamada a usar esta función uploadImage.

// Save html as image
webshot(url, htmlAsImageFileLocation, options, function(err) {
      let uploadRequest = uploadImage(filename);

      uploadRequest.then(function(imageUrl) {
         // TODO: Use the imageUrl in a rich card to send to the user
      });
});

Enviar una tarjeta enriquecida con la imagen

Ya casi terminamos. Para completar el paso final, define la Función sendBoardingPass(imageUrl, msisdn), que crea una tarjeta enriquecida de RBM con la imagen creada en el paso anterior y se la envía al usuario.

Para enviar la tarjeta enriquecida con RBM, uso el mismo SDK de Node.js que está disponible en Ejemplo del primer agente.

function sendBoardingPass(imageUrl, msisdn) {
    let title = 'Here is your boarding pass.';

    let suggestions = [
                {
                    reply: {
                        text: 'See more options',
                        postbackData: 'more_options',
                    }
                },
            ];

    let params = {
        messageText: title,
        msisdn: msisdn,
        imageUrl: imageUrl,
        suggestions: suggestions,
        height: 'TALL',
    };

    // Send the boarding pass
    rbmApiHelper.sendRichCard(params);
}

A continuación, se incluye una captura de pantalla del resultado final.

Imagen dinámica en una tarjeta enriquecida

Actividad de cierre y resumen

La forma más sencilla de hacer que las tarjetas enriquecidas sean más versátiles es usar HTML dinámico y convertir el HTML en imágenes. La mayoría de los lenguajes de programación modernos son compatibles bibliotecas o APIs que te ayudarán a completar la conversión. Es posible que debas jueguen con el tamaño de las imágenes a fin de que se vean bien para su caso de uso pero es un enfoque fantástico para crear elementos visuales más atractivos Agentes de RBM.

Buena suerte y ¡feliz programación!