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

  • Instala un certificado SSL en tres pasos

    Escenario Todavía tienes una aplicación web, servida por nginx, a la que solo se puede acceder por http. Objetivo Instalar el certificado de SSL gratuito en tres pasos. Usaremos a modo de ejemplo el subdominio certbot.technoage.net. Pasos 1. Añadir el repositorio $ sudo add-apt-repository ppa:certbot/certbot 2. Instalar el paquete de cerbot para nginx $ sudo apt-get update && sudo apt-get install python-certbot-nginx 3. Obtener el certificado…

  • Argument list too long!

    Escenario Después de más de 11 años de fiel servicio ha llegado el momento de cambiar de NAS. Hasta ahora había estado usando una máquina con FreeBSD y la interfaz web Nas4Free. Para el nuevo servidor, he optado por instalar Ubuntu y gestionar la administración web con webmin. El soporte de Ubuntu para el sistema…

  • Spring boot y websockets

    Escenario Un usuario se conecta con el móvil a su aplicación de empresa. Si es la primera vez que lo hace ésta le pide autorización para recabar su localización. La aplicación manda la localización al servidor y desde el servidor se informa a una página de monitorización. Dicha página está conectada por websocket con el…

  • Hibernate no puede resolver la propiedad…

    Escenario En una aplicación Spring Boot v2.3.4 hay dos entidades Balance y Shop. Una tienda (shop) puede tener varios saldos y un saldo (Balance) ha de estar relacionado con una tienda. Además existen panaderías (Bakery) y sastrerías (TailorShop) que extienden la clase Shop:

    Y necesito saber cuál es la fecha del…

  • Extracción del texto de un pdf creado a partir de una imagen

    Escenario Una manera de preparar los exámenes es practicando con aquellos de años anteriores. Para los que estudiamos en la UNED, el centro de Calatayud cuenta con un extenso repositorio de PDFs de exámenes de previas convocatorias. Problema Los PDFs suelen ser de aquellos generados a partir de imágenes y no de texto lo que…

  • |

    Cómo ampliar el espacio en disco en 1and1

    Escenario Hemos contratado un servidor dedicado en 1and1 (ubuntu 14.04) y al acceder por ssh constatamos que no disponemos de todo el espacio en disco disponible: $ df -hFilesystem Size Used Avail Use% Mounted onudev 3.9G 4.0K 3.9G 1% /devtmpfs 798M 592K 797M 1% /run/dev/md1 4.0G 990M 3.0G 25% /none 4.0K 0 4.0K 0% /sys/fs/cgroupnone 5.0M 0 5.0M 0% /run/locknone 3.9G 0 3.9G 0% /run/shmnone 100M 0 100M 0% /run/user/dev/mapper/vg00-usr 4.8G 1.3G 3.3G 28% /usr/dev/mapper/vg00-var 4.8G 812M 3.8G 18% /var/dev/mapper/vg00-home 4.8G 10M 4.6G 1% /home Objetivo Aumentar el espacio disponible para dar cabida a nuestros recursos. Solución Nota: sólo aplicable a sistemas linux Primer paso Comprobamos el espacio en disco real: ~$ sudo fdisk -lDisk /dev/sda: 240.1 GB, 240057409536 bytes255 heads, 63 sectors/track, 29185 cylinders, total 468862128 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 4096 bytesI/O size (minimum/optimal): 4096 bytes / 4096 bytesDisk identifier: 0x24e3fc12   Device Boot      Start         End      Blocks   Id  System/dev/sda1            2048     8390655     4194304   fd  Linux raid autodetect/dev/sda2         8390656    12584959     2097152   82  Linux swap / Solaris/dev/sda3        12584960   468862127   228138584   fd  Linux raid autodetect Segundo…

Deja una respuesta

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