Esto es el ROLECE: el Registro Oficial de Licitadores y Empresas Clasificadas del Estado. Es un registro público de contratistas.

https://abs.twimg.com/emoji/v2/... draggable="false" alt="🚀" title="Raket" aria-label="Emoji: Raket"> Quiero descargármelo para cruzarlo con los datos de contratación pública

https://abs.twimg.com/emoji/v2/... draggable="false" alt="🚫" title="Geen doorgang teken" aria-label="Emoji: Geen doorgang teken"> Problema: el ROLECE no se puede descargar

…O no se «podía» https://abs.twimg.com/emoji/v2/... draggable="false" alt="😆" title="Lachend gezicht met open mond en dichtgeknepen ogen" aria-label="Emoji: Lachend gezicht met open mond en dichtgeknepen ogen">

https://abs.twimg.com/emoji/v2/... draggable="false" alt="🧵" title="collectie" aria-label="Emoji: collectie">https://abs.twimg.com/emoji/v2/... draggable="false" alt="👇" title="Rug van hand met omlaag wijzende wijsvinger" aria-label="Emoji: Rug van hand met omlaag wijzende wijsvinger">
Esto es el ROLECE: el Registro Oficial de Licitadores y Empresas Clasificadas del Estado. Es un registro público de contratistas.https://abs.twimg.com/emoji/v2/... draggable= Quiero descargármelo para cruzarlo con los datos de contratación públicahttps://abs.twimg.com/emoji/v2/... draggable="false" alt="🚫" title="Geen doorgang teken" aria-label="Emoji: Geen doorgang teken"> Problema: el ROLECE no se puede descargar…O no se «podía» https://abs.twimg.com/emoji/v2/... draggable="false" alt="😆" title="Lachend gezicht met open mond en dichtgeknepen ogen" aria-label="Emoji: Lachend gezicht met open mond en dichtgeknepen ogen">https://abs.twimg.com/emoji/v2/... draggable="false" alt="🧵" title="collectie" aria-label="Emoji: collectie">https://abs.twimg.com/emoji/v2/... draggable="false" alt="👇" title="Rug van hand met omlaag wijzende wijsvinger" aria-label="Emoji: Rug van hand met omlaag wijzende wijsvinger">" title="Esto es el ROLECE: el Registro Oficial de Licitadores y Empresas Clasificadas del Estado. Es un registro público de contratistas.https://abs.twimg.com/emoji/v2/... draggable="false" alt="🚀" title="Raket" aria-label="Emoji: Raket"> Quiero descargármelo para cruzarlo con los datos de contratación públicahttps://abs.twimg.com/emoji/v2/... draggable="false" alt="🚫" title="Geen doorgang teken" aria-label="Emoji: Geen doorgang teken"> Problema: el ROLECE no se puede descargar…O no se «podía» https://abs.twimg.com/emoji/v2/... draggable="false" alt="😆" title="Lachend gezicht met open mond en dichtgeknepen ogen" aria-label="Emoji: Lachend gezicht met open mond en dichtgeknepen ogen">https://abs.twimg.com/emoji/v2/... draggable="false" alt="🧵" title="collectie" aria-label="Emoji: collectie">https://abs.twimg.com/emoji/v2/... draggable="false" alt="👇" title="Rug van hand met omlaag wijzende wijsvinger" aria-label="Emoji: Rug van hand met omlaag wijzende wijsvinger">" class="img-responsive" style="max-width:100%;"/>
El acceso al ROLECE es bajo certificado digital. Pero si accedes, no puedes consultar el listado. Solo puedes ver tu propia inscripción.

https://abs.twimg.com/emoji/v2/... draggable="false" alt="🔗" title="Link symbool" aria-label="Emoji: Link symbool"> https://registrodelicitadores.gob.es/rolece ">https://registrodelicitadores.gob.es/rolece&qu... https://registrodelicitadores.gob.es/rolece 

Es">https://registrodelicitadores.gob.es/rolece&qu... la transparencia de Schrödinger: transparente y opaco a la vez. https://abs.twimg.com/emoji/v2/... draggable="false" alt="🤷" title="Worstelende persoon" aria-label="Emoji: Worstelende persoon">
El art. 344 de la Ley de Contratos del Sector Público (LCSP) establece que el ROLECE «será público y se podrá acceder de forma abierta previa identificación». Y que un reglamento «determinará modalidades y requisitos para la publicidad del Registro».

Pero no hay nada. https://abs.twimg.com/emoji/v2/... draggable="false" alt="💩" title="Hoopje poep" aria-label="Emoji: Hoopje poep">
https://abs.twimg.com/emoji/v2/... draggable="false" alt="✨" title="Vonken" aria-label="Emoji: Vonken"> El Ministerio de Hacienda tiene este servicio para la consulta de expedientes de clasificación de contratistas. ¡Parece que toma sus datos del ROLECE!

https://abs.twimg.com/emoji/v2/... draggable="false" alt="🔗" title="Link symbool" aria-label="Emoji: Link symbool"> …https://serviciostelematicosext.hacienda.gob.es/DGPE/Contratistas/paginas/ListadoEmpresas.aspx

https://serviciostelematicosext.hacienda.gob.es/DGPE/Cont... class="Emoji" style="height:16px;" src=" https://abs.twimg.com/emoji/v2/... draggable="false" alt="🚫" title="Geen doorgang teken" aria-label="Emoji: Geen doorgang teken"> Problema: tampoco permite la descarga completa del registro.
https://abs.twimg.com/emoji/v2/... draggable= El Ministerio de Hacienda tiene este servicio para la consulta de expedientes de clasificación de contratistas. ¡Parece que toma sus datos del ROLECE!https://abs.twimg.com/emoji/v2/... draggable="false" alt="🔗" title="Link symbool" aria-label="Emoji: Link symbool"> https://serviciostelematicosext.hacienda.gob.es/DGPE/Cont... class="Emoji" style="height:16px;" src=" " title="https://abs.twimg.com/emoji/v2/... draggable="false" alt="✨" title="Vonken" aria-label="Emoji: Vonken"> El Ministerio de Hacienda tiene este servicio para la consulta de expedientes de clasificación de contratistas. ¡Parece que toma sus datos del ROLECE!https://abs.twimg.com/emoji/v2/... draggable="false" alt="🔗" title="Link symbool" aria-label="Emoji: Link symbool"> https://serviciostelematicosext.hacienda.gob.es/DGPE/Cont... class="Emoji" style="height:16px;" src=" " class="img-responsive" style="max-width:100%;"/>
El buscador de Hacienda tiene seis campos. Solo uno es obligatorio: el nombre del contratista. Pero yo no quiero acceder al expediente de un contratista: ¡quiero acceder A TODOS!

Para cruzarlos informáticamente con la PLCSP y dar más transparencia a la contratación pública.
El buscador me obliga a consignar un mínimo de cuatro letras del nombre del contratista. ¿Por qué hacen esto? ¡Qué ganas de entorpecer el acceso a los datos públicos!

Puedo buscar «ZARA» o «IKEA». O Puedo teclear «FERRE» y encontrar todas las ferreterías.
Podría descargar todo el listado por fuerza bruta, automatizando búsquedas iterativas:

AAAA
AAAB
AAAC

ZZZX
ZZZY
ZZZZ

Pero sería una cochinada ineficiente:

26×26×26×26 = 456.976 búsquedas

Tiene que haber otra manera.
La validación de los datos de entrada de un formulario web puede hacerse en dos puntos del ciclo petición-respuesta:

https://abs.twimg.com/emoji/v2/... draggable="false" alt="1️⃣" title="Nummertoets een" aria-label="Emoji: Nummertoets een"> En el cliente (el navegador del usuario); o,
https://abs.twimg.com/emoji/v2/... draggable="false" alt="2️⃣" title="Nummertoets twee" aria-label="Emoji: Nummertoets twee"> En el servidor (la aplicación de Hacienda).

Siempre se recomienda validar los datos al menos en el servidor.
Observo que el buscador de Hacienda valida los datos en el cliente. Mi única esperanza es que no estén haciendo validación también en el servidor.

Juego todo a esta carta y comienzo a inspeccionar el campo de entrada que me interesa: el nombre del contratista.
Me interesa el evento «change», que se dispara después de «keypress».

Invoca una función ValidatorOnChange()
Exploro la función, voy trazando el código…
…y llego a una segunda función: ValidatorUpdateIsValid()

Que parece devolver un valor booleano:

— «verdadero» si todos los campos del formulario son válidos.
— «falso» si alguno de los seis campos tiene errores.
Vamos a ver si hay suerte…

Asigno a AllValidatorsValid una nueva función que toma la misma entrada pero que siempre devuelve «verdadero».

Y en el campo del formulario consigno un valor ilegal: «A».

¿Colará?
…Y CUELAAAAAAaaaa!!!!!!111unouno
…a la que el servidor responde un JSON con los datos de mi interés.

https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> Son datos públicos.
https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> De un registro público.
https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> Que sirve Hacienda en internet.

Esto no es ningún crimen. ¡Es liberar datos públicos para que haya más transparencia en la contratación pública!
…a la que el servidor responde un JSON con los datos de mi interés.https://abs.twimg.com/emoji/v2/... draggable= Son datos públicos.https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> De un registro público.https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> Que sirve Hacienda en internet.Esto no es ningún crimen. ¡Es liberar datos públicos para que haya más transparencia en la contratación pública!" title="…a la que el servidor responde un JSON con los datos de mi interés.https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> Son datos públicos.https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> De un registro público.https://abs.twimg.com/emoji/v2/... draggable="false" alt="✅" title="Groot wit vinkje" aria-label="Emoji: Groot wit vinkje"> Que sirve Hacienda en internet.Esto no es ningún crimen. ¡Es liberar datos públicos para que haya más transparencia en la contratación pública!" class="img-responsive" style="max-width:100%;"/>
Replico la petición desde la línea de comandos, con cURL. Encuentro los parámetros que controlan el número de resultados por respuesta y la paginación de los resultados.

Con la letra «A» hay 9.953 registros, lo que son exactamente 100 páginas de 100 elementos cada una.
Hay mil formas de hacer esto, pero opto por seguir en la terminal y usar «seq»:

$ seq 0 100 10000

Genero así los valores del parámetro «iDisplayStart», que controla dónde comienza cada página.

Un poco de bricolaje y ya tengo un cerdoscript… https://abs.twimg.com/emoji/v2/... draggable="false" alt="🐷" title="Varkensgezicht" aria-label="Emoji: Varkensgezicht">
Curiosamente el dato más importante, el término de búsqueda, no viaja en ningún parámetro de las peticiones XHR. Parece que el servidor lo almacena en una variable de sesión y lo recupera de una cookie.

Es kafkiano, pero me da igual porque en el script paso la cookie… https://abs.twimg.com/emoji/v2/... draggable="false" alt="🤷" title="Worstelende persoon" aria-label="Emoji: Worstelende persoon">
Vuelvo al campo de búsqueda.

Puedo iterar 27 veces con todas las letras del abecedario. Y, para cada una de ellas, iterar a su vez por el número de páginas de resultados.

Pero no quiero iterar tanto.

¿Qué puedo hacer?
Tengo que darle al servidor al menos un caracter que me devuelva todos los registros. Pero, ¿cuál?

Pruebo con el espacio en blanco. ¿Funcionará?
¡No funciona!

La aplicación debe de estar haciendo un trim() de la cadena de texto que yo le envío, para eliminar los espacios en blanco antes de determinar si el valor está vacío.

Pero, ¿y si les envío algo que parezca un espacio pero no lo sea?
Esto es el caracter Unicode U+2800: un espacio vacío en Braille. Al ojo humano es indistinguible de un espacio tecleado con la barra espaciadora. Pero quizá trim() sí lo distinga…

¿Servirá para confundir al servidor de Hacienda?

https://abs.twimg.com/emoji/v2/... draggable="false" alt="🔗" title="Link symbool" aria-label="Emoji: Link symbool"> https://www.compart.com/en/unicode/U+2800">https://www.compart.com/en/unicod...
Añado ocho filas más al cerdoscript y me reclino satisfecho en el estrado imaginario de mi putoamismo mientras descargan a mi portatil todos los registros.

¡Ahora tengo 10.747 expedientes más para cruzar con los datos de contratación! https://abs.twimg.com/emoji/v2/... draggable="false" alt="🥳" title="Partying face" aria-label="Emoji: Partying face">

Síganme para más recetas. https://abs.twimg.com/emoji/v2/... draggable="false" alt="🤣" title="Rollend over de vloer van het lachen" aria-label="Emoji: Rollend over de vloer van het lachen">
Añado ocho filas más al cerdoscript y me reclino satisfecho en el estrado imaginario de mi putoamismo mientras descargan a mi portatil todos los registros.¡Ahora tengo 10.747 expedientes más para cruzar con los datos de contratación! https://abs.twimg.com/emoji/v2/... draggable= Síganme para más recetas. https://abs.twimg.com/emoji/v2/... draggable="false" alt="🤣" title="Rollend over de vloer van het lachen" aria-label="Emoji: Rollend over de vloer van het lachen">" title="Añado ocho filas más al cerdoscript y me reclino satisfecho en el estrado imaginario de mi putoamismo mientras descargan a mi portatil todos los registros.¡Ahora tengo 10.747 expedientes más para cruzar con los datos de contratación! https://abs.twimg.com/emoji/v2/... draggable="false" alt="🥳" title="Partying face" aria-label="Emoji: Partying face"> Síganme para más recetas. https://abs.twimg.com/emoji/v2/... draggable="false" alt="🤣" title="Rollend over de vloer van het lachen" aria-label="Emoji: Rollend over de vloer van het lachen">" class="img-responsive" style="max-width:100%;"/>
Aquí va todo en un formato de más fácil lectura: https://typefully.com/JaimeObregon/la-yincana-de-acceder-a-los-datos-publicos-G15Eqd8

Y">https://typefully.com/JaimeObre... mi Patreon, ¡por si quieres ayudarme a seguir! https://abs.twimg.com/emoji/v2/... draggable="false" alt="👇" title="Rug van hand met omlaag wijzende wijsvinger" aria-label="Emoji: Rug van hand met omlaag wijzende wijsvinger"> https://www.patreon.com/jaime_gomez_obregon

¡Espero">https://www.patreon.com/jaime_gom... que os guste! https://abs.twimg.com/emoji/v2/... draggable="false" alt="🤓" title="Nerdgezicht" aria-label="Emoji: Nerdgezicht">
You can follow @JaimeObregon.
Tip: mention @twtextapp on a Twitter thread with the keyword “unroll” to get a link to it.

Latest Threads Unrolled: