512kg / dima
Comercial

Lanzo herramientas pequeñas

Un descargador de tableros de Pinterest que conserva la calidad original de las imágenes. Existe como web y como extensión de Chrome, con una sola suscripción para las dos. Casi todo lo que lo hace mejor que las alternativas salió de medir en vez de suponer.

Por qué las demás herramientas te dan miniaturas

Casi todas leen la miniatura de la página y reescriben su dirección, cambiando el tamaño por la carpeta de originales. La miniatura siempre es un .jpg. El original a menudo es un .png o un .gif, así que la dirección reescrita no existe y el servidor responde 403. Cuando eso pasa, se quedan con la miniatura y no dicen nada.

Medido en tableros reales: en uno de fotografías fallaron 30 de 52 direcciones reescritas. En uno de gráficos fallaron 18 de 48, y otros 10 GIF llegaron como un JPEG congelado.

Esta herramienta pide la dirección real de cada fichero, con su extensión correcta.

Una pasada no basta

Este fue el hallazgo que más cambió el resultado. Leer un tablero una vez no devuelve el tablero. Cada intento devuelve un subconjunto distinto, con mucho solape. En un tablero de pruebas de 580 pines:

Fig. 1 — Imágenes obtenidas de un tablero de 580 pines, según el método. Medido en un tablero de pruebas. La parte más clara de la segunda barra es la variación entre intentos. 446 es lo máximo que alcanzó un visitante anónimo, uniendo muchas pasadas; solo una sesión iniciada devolvió las 580.

Dos causas eran mías y están corregidas: fijar el tamaño de página empeoraba el reparto, y leer una sola vez dejaba fuera un tercio del tablero. La tercera no es mía. Unos 446 es lo que puede ver un visitante anónimo, y ningún reintento lo supera. Con la sesión iniciada, que solo tiene la extensión, el mismo tablero devuelve 580 de 580.

La lección que saqué: un resultado corto tenía exactamente el mismo aspecto que uno correcto. No había ningún error en ningún sitio. Por eso la herramienta compara ahora lo recogido con lo que declara el tablero y, si tiene menos de la mitad, lo dice, en vez de presentar tres imágenes como si fueran todas.

Una suscripción, nada que teclear

La suscripción vale en la web y en la extensión, y la licencia viaja sola:

  1. El cliente paga. Un webhook de Stripe crea la licencia y la web guarda su clave en una cookie.
  2. La cookie es HttpOnly, así que ni los scripts de la propia página pueden leerla. Un pequeño script puente le pide la clave al servidor, y el servidor solo se la da a una petición de su mismo origen con la licencia viva.
  3. El puente le pasa la clave a la extensión por un canal fijado al identificador de la extensión oficial.
  4. La extensión valida la clave contra el servidor antes de guardarla y la revalida cada doce horas. Una baja deja de valer el mismo día.

Un límite honesto, no una cerradura

El cupo gratuito de la extensión, cinco al día, se cuenta en el equipo del usuario. Es deliberado. Contarlo en el servidor obligaría a avisar al servidor de cada descarga, y la promesa de la extensión es justo que no lo hace. Sin suscripción, la extensión no contacta con la web en absoluto.

Quien quiera saltarse ese límite puede. Decidí que prefiero un límite que respeta al usuario y se puede saltar a uno que no se puede saltar y lo vigila. En la web, donde las peticiones llegan a mi servidor de todos modos, el contador es exacto. Cómo está hecho ese.

Lo que destapó el primer uso real

  • 580 diálogos de confirmación. Con «preguntar dónde guardar cada archivo» activado en el navegador, cada descarga abría un diálogo. Una opción explícita en la llamada de descarga ignora esa preferencia.
  • Un minuto de espera para nada. Tras encontrar las 580, releía el tablero dos veces más para confirmar que no salía nada nuevo. Ahora corta en cuanto alcanza el total declarado.
  • La extensión entera rechazada, sin motivo. El manifiesto declaraba un idioma por defecto sin la carpeta de traducciones. El navegador rechaza la extensión entera en ese caso y no dice por qué.

Lo que tiene que ser exacto

  • El proxy de imágenes solo acepta direcciones de ficheros originales.
  • Las miniaturas van por una ruta que decide el tamaño en el servidor, así que por ahí no se puede sacar un original.
  • Los endpoints de consulta tienen un tope diario por visitante. Sin él eran un raspador abierto a costa de mi cuota. Un tablero grande gasta unas 200 llamadas y el tope es de 1.000, así que el uso real no lo nota.
  • Pro cuesta 5 $ al mes. El plan gratuito de la web son cinco originales al día, y ojear un tablero no cuesta nada.
  • HTML63.2%
  • JavaScript36.8%