Bots y Open Graph dinámico generado por JavaScript

Igual no sabes que es Open Graph, pero seguro que lo has visto en acción cuando, al compartir un enlace de una web por un chat, por arte de magia aparece una imagen representativa de la página compartida. En cualquier caso, si no has oído hablar de OG, lo más seguro es que no te vaya a interesar el resto del artículo.

Para verse en la situación de la que que voy a hablar tienen que cumplirse dos requisitos:

  • Necesidad de generar dinámicamente una etiqueta de tipo OG
  • Incrustar dicha etiqueta en la página de una SPA

En mi caso pretendía que el enlace de una imagen representada al vuelo en un componente de React.js fuera incluido en la etiqueta OG correspondiente de la cabecera HTML, a fin de que apareciera al compartir el enlace por las redes sociales.

Una búsqueda rápida me llevó al react-helmet, un paquete de React con más de 17 mil estrellas en GitHub y escasa utilidad para la funcionalidad que buscada. No me servía por la sencilla razón que, para generar las etiquetas, es necesario ejecutar JavaScript y los bots de WhatsApp y compañía se limitan a analizar el HTML ya generado.

Ni Google ni Gepeto me fueron de ayuda en este caso. Así que me tocó pensar un rato. Se me ocurrió crear dos direcciones, una con /share al final otra sin. La primera si la invoca un bot, devuelve la plantilla HTML generada en el servidor con los metadatos deseados, si por el contrario la invoca un navegador devuelve la página del app.

Para identificar si la petición de la página provenía de un bot, el controlador comprueba que el User-Agent se encuentre en esta lista. De ser así, genera las etiquetas OG y devuelve un HTML con el bloque META y poco más.

Dado que la aplicación es una SPA servida por nginx, tuve que modificar la manera en la que el proxy trataba las peticiones que provenían de /share a fin de que gunicorn devolviera la plantilla HTML con los metadatos y no el index.html del app.

Este bloque debe encontrarse antes del que devuelve la app:

Publicaciones Similares

  • |

    Sobrepasando el límite

    Por lo que he podido probar, de momento los modelos generativos locales están lejos de acercarse al rendimiento de los modelos de OpenAI, GPT-3 y GPT-4. Por otro lado el API de OpenAI impone un límite al tamaño de nuestras preguntas que, dependiendo del modelo que empleemos, será menor o mayor. Con GPT-3.5 no puedes…

  • |

    Mi blog puede contener programas dañinos

    Escenario Cuál fue mi sorpresa cuando la semana pasada al intentar acceder a este blog me encontré que estaba bloqueado por Firefox. Probé con Chrome, misma situación. En vez de cargar la página, el navegador mostraba una pantalla en rojo avisando que el sitio puede contener programas dañinos para mi ordenador. Problema Aunque los dos…

  • Valor por defecto en un combo de una plantilla de Thymeleaf

    Escenario En Thymleaf podemos usar el atributo th:field para enlazar la vista con el modelo:

    En caso de que hubiéramos cargado estos datos del servidor, nuestro select tendría esta pinta:

    Problema ¿Qué pasa si queremos seleccionar una divisa por defecto? En el caso de que fuera el euro tendríamos que hacer algo así,…

  • La tabla mysql.plugin no existe

    Escenario Después de necesitar restaurar tres veces el servidor de MySql por culpa de varios crashs provocados por un fallo en el disco duro, encuentro en los logs entradas de este tipo: 2020-09-12T18:46:22.347957Z 5 [Warning] InnoDB: Cannot open table mysql/help_relation from the internal data2020-09-12T18:46:22.348985Z 5 [Warning] InnoDB: Cannot open table mysql/innodb_index_stats from the internal data dictionary of InnoDBdictionary Problema En varios foros leo que la solución pasa por hacer un:

    La cuestión es que, cuando lo intento, me encuentro…

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *