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

🚀 Quiero descargármelo para cruzarlo con los datos de contratación pública

🚫 Problema: el ROLECE no se puede descargar

…O no se «podía» 😆

🧵👇
El acceso al ROLECE es bajo certificado digital. Pero si accedes, no puedes consultar el listado. Solo puedes ver tu propia inscripción.

🔗 registrodelicitadores.gob.es/rolece registrodelicitadores.gob.es/rolece

Es la transparencia de Schrödinger: transparente y opaco a la vez. 🤷
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. 💩
✨ El Ministerio de Hacienda tiene este servicio para la consulta de expedientes de clasificación de contratistas. ¡Parece que toma sus datos del ROLECE!

🔗 …rviciostelematicosext.hacienda.gob.es/DGPE/Contratis…

🚫 Problema: tampoco permite la descarga completa del registro.
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:

1️⃣ En el cliente (el navegador del usuario); o,
2️⃣ 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.
Tiene asociados dos manejadores de eventos:

1️⃣ Uno al evento «change», que se dispara cuando el campo cambia.

2️⃣ Otro al evento «keypress», que se dispara cuando el usuario presiona una tecla con el foco en el campo.
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.
Quiero modificar esta función. Pero si está encapsulada en un módulo, una clase o un objeto, será complicado hacer nada con ella…

Afortunadamente para mí, está definida en el «scope» global 🎉. ¡Esto significa que puedo redefinirla desde el confort de mi navegador! 😜
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
🎉 Con esto puedo sortear la validación del formulario. YEAH!

Ahora tengo que ver cómo iterar por las 26 letras del abecedario y bajarme todas las páginas del tirón. 🤓

Observo las peticiones al servidor y encuentro una llamada GET por XHR (Ajax).…
…a la que el servidor responde un JSON con los datos de mi interés.

✅ Son datos públicos.
✅ De un registro público.
✅ 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!
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… 🐷
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… 🤷
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?

🔗 compart.com/en/unicode/U+2…
🚀 ¡HASTA LA COCINA!
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! 🥳

Síganme para más recetas. 🤣
Aquí va todo en un formato de más fácil lectura: typefully.com/JaimeObregon/l…

Y mi Patreon, ¡por si quieres ayudarme a seguir! 👇patreon.com/jaime_gomez_ob…

¡Espero que os guste! 🤓

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Jaime Gómez-Obregón

Jaime Gómez-Obregón Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @JaimeObregon

Mar 21
Hello, @EU_opendata! 👋

Regarding this dataset of companies classified to contract with the government, published by the Ministry of Finance and Public Administrations of Spain…

🔗 data.europa.eu/data/datasets/… Image
The «Download» link provided by the Ministry leads to a site from which there is no way to actually download any data.

The public registry is partly searchable, with limitations. And there is no download link whatsoever.

The Ministry might be afraid of transparency! Image
Let's help them overcome their fears. 😊

Please, consider changing your link to point to this alternative, downloadable, fully searchable, spreadsheet.

All of the data. None of the hassle to deal with a gatekeeping search engine.

🔗 docs.google.com/spreadsheets/d… Image
Read 4 tweets
Mar 19
Ayer estuve trabajando en la exportación a XLSX (Excel…) de los resultados de las búsquedas de contratos y contratistas.

Hubiera bastado con exportar a CSV, pero he implementado la generación de una tabla con autofiltros, enlaces, formatos… Está quedando guay™️. 😃
El interfaz web que estoy programando es suficiente para explorar los datos. Pero las búsquedas están paginadas. Al darle al ciudadano un botón de descarga XLSX, puede bajarse todo de golpe. Y utilizar Excel o LibreOffice o lo que quiera… para hacer el análisis que desee.
Para el caso de Cantabria ya implementé un botón de descarga directa con el que quien quiera puede bajarse todo y trabajarlo plácidamente desde la intimidad de su hogar 😂. El Gobierno no ofrece tal opción… Fue un placer programarlo; especialmente si molesta a algún político. 👌🏼
Read 4 tweets
Mar 17
Álvaro es interventor del Estado e intenta compartir un enlace a una información del portal estatal de contratación pública.

👉🏻 Pero las páginas de este portal caducan a los pocos minutos de abrirlas y es imposible enlazarlas.

¿Cómo es posible, Ministerio de @Haciendagob?
¡Miremos lo que tiene que hacer un auditor de cuentas del Estado para enlazar una página! Pegar una captura de pantalla porque los enlaces funcionan.

¿Qué insulto es este? ¿Qué falta de respeto a la ciudadanía y a los propios funcionarios es andar así en 2022?
Esto, sencillamente, *no puede ser*. Impacta en la productividad de los miles de personas que desde dentro de las AAPP utilizan este tipo de servicios. Y obstaculiza el acceso de las personas a los datos y documentos públicos.

¡Es ignominioso! 👇
Read 8 tweets
Mar 10
‼️ Una dificultad que encuentro al analizar la contratación pública: las UTE. Es algo a lo que ya me enfrenté cuando hice esto en Cantabria, pero no di con ninguna solución buena.

Lo explico en este hilo, por si me lee algún gurú de estas cosas y puede iluminarme la senda… 🧵👇
✅ A efectos del análisis informático que estoy programando, ACME SA y la UTE entre ACME e IKEA son dos contratistas distintos e independientes. Esto es formalmente correcto, pues en el fondo son dos empresas diferentes, con personalidad jurídica independiente. De acuerdo.
Pero desde la óptica del ciudadano o el investigador que escudriña los datos —que son los ojos que me interesan y para los que hago todo esto— la realidad no es así. Una UTE es una unión temporal de empresas. Y quien investigue ACME querrá investigar las UTE de ACME con terceros.
Read 17 tweets
Mar 1
¿Qué organismos públicos españoles contratan con empresas radicadas en Rusia?

1️⃣ Extremadura Avante (@e_avante) tiene este contrato de 112.000 € con la consultora ЕВРАЗИЙСКОЕ АГЕНТСТВО РАЗВИТИЯ БИЗНЕСА, radicada en Moscú.

🔗 contrataciondelestado.es/wps/poc?uri=de…
2️⃣ El Centro de Investigaciones Energéticas, Medioambientales y Tecnológicas (@CIEMAT_OPI), ha contratado la semana pasada a НТЦ ИНМАРКОН, compañía domiciliada en Moscú. Constan dos contratos que suman 62.710 €.

🔗 contrataciondelestado.es/wps/poc?uri=de…
🔗 contrataciondelestado.es/wps/poc?uri=de…
3️⃣ El Centro Superior de Investigaciones Científicas (@CSIC) es cliente de la compañía informática rusa ДЕКО Геофизика, que licencia un software por la cantidad de 11.138 €.

🔗 contrataciondelestado.es/wps/poc?uri=de…
Read 6 tweets
Mar 1
Tras unas semanas avanzando en la limpieza de datos y su cruce con otras fuentes, ayer retomé el trabajo en el interfaz web de mi explorador de contratos públicos.

Que no solo busca contratos: también muestra empresas y organismos, y calcula en tiempo real sus cifras. 💰

[WIP]
…y sí, sale también *ese* contrato. 😅

Voy a seguir trabajando en esto. Creo que será algo bueno y útil para muchas personas.
Como curiosidad, la ficha-resumen de cuatro empresas cualquiera. Lo chulo es que sale en menos de un segundo y para cualquier empresa con solo teclear su nombre. Y al hacer clic se abre ya el detalle. Es lo mismo que hice en contratosdecantabria.es, pero nacional.

Voy a seguir.
Read 4 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(