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

  • Cómo forzar a Firefox para que use el explorador de ficheros del sistema

    Escenario Llevo tiempo lamentándome cada vez que, con Firefox, tengo que abrir el explorador de ficheros. Por ejemplo para elegir una fichero para subir a un sitio o elegir la carpeta donde quiero dejar un fichero que voy a descargar. Problema Firefox, en vez de usar el explorador de ficheros del sistema —en mi caso…

  • 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…

  • Can’t connect to local MySQL server through socket

    Escenario No conseguimos conectarnos al servidor de mysql desde la propia máquina, pero sí remotamente. Cuando el cliente de MySQL se conecta a localhost, lo intenta usando un fichero socket en vez de el protocolo TCP/IP. Una manera pues de solucionar el problema es especificando la IP del host: mysql -uroot -p -h 127.0.0.1 Para solucionarlo de manera permanente,…

  • Partición adicional en disco con tabla MBR

    Escenario Tengo un disco de 4TB que usa una tabla de particiones MBR. Hay una partición de 2TB ya creada y necesito crear otra en el espacio disponible. Problema Según parted para crear la nueva partición por el siguiente problema: Error: starting sector number, 4294967296 exceeds the msdos-partition-table-imposed maximum of 4294967295 [plain]marcos@technoage:~$ sudo parted /dev/sdb…

  • |

    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 *