Jaime Gómez-Obregón Profile picture
Mar 20, 2022 28 tweets 10 min read Read on X
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

Nov 21
¡Me toca renovar el DNI! Deseadme suerte. 😂

En este hilo voy a compartir mi análisis de «experiencia ciudadana» sobre este trámite digital que tarde o temprano todos tenemos que cursar.

¡Vamos allá! 🧵👇 Image
1️⃣ Abro un navegador y busco «cita previa para renovar el DNI». Aterrizo en citapreviadnie.es. Un sitio que parece oficial. No lo digo por los emblemas institucionales, sino por el diseño estilo «Microsoft Frontpage 1998».

Lo primero que me llama la atención es que el ¿botón? para iniciar el trámite sea el enlace más discreto de la página, abajo y en pequeño.

No es que sea un drama, pero bueno, seguimos.Image
Dejando a un lado la estética cutre, comienzo a leer y encuentro la redacción intrincada y confusa.

El título dice que el trámite es para la «solicitud, consulta o anulación» de cita previa del DNI o pasaporte. Pero la siguiente línea habla de «obtención o renovación». Es decir, el trámite parece servir para cinco acciones:

—Solicitar
—Consultar
—Anular
—Obtener
—Renovar

Los tres primeros, de la cita previa. Los otros dos, del DNI o pasaporte.

Pero el título habla de «DNI», mientras que el primer párrafo, en cambio, de «DNIe». No sé si es un error o que aquí no puedo pedir cita para el DNIe. Si así fuera, ¿dónde podría?

Un poco más abajo pone «Se recuerda a todos los ciudadanos que deben acudir a su cita puntualmente». Vale, pero eso no es importante ahora. Dime eso cuando haya obtenido mi cita, no antes. Es más fácil que lo tenga en cuenta si me lo pones en la cita que si me lo dices al principio del trámite.

Pone también «Recuerden también consultar en dnielectronico.es, en el menú […] los requisitos necesarios para […]» Hmmm... vale; entendido. Así que hay dos portales:

citapreviadnie.es ← donde estoy ahora
dnielectronico.es

Y tengo que consultar los dos. No es que sea el fin del mundo pero, ¿no sería todo más fácil en un solo sitio web?

Y, en lugar de mandarme de un portal a otro, ¿no sería más lógico que el trámite me informara directamente de cuáles son esos requisitos?

Y, una vez más, ¿es necesaria esa advertencia justo ahora, en vez de posponerla a cuando haya progresado más en el trámite digital?Image
Read 14 tweets
Oct 25
💸 ¡Vamos a mejorar un trámite digital sin gastar un euro!

Muchos trámites parecen diseñados en el séptimo círculo del averno. Y cuando se lo digo a mis amigos funcionarios, me salen por bulerías con el mismo cante jondo de siempre:

—Es que no hay dinero.

Pero payo… ¿cuándo lo ha habido? ¡Gestionar es un arte que florece justo en la escasez!

He aquí una idea muy loca:

✨ Podemos mejorar los trámites digitales de nuestro país sin gastar (apenas) ✨

¡Veámoslo con un ejemplo!

Y ve situando tu dedo —tú, sí; te lo digo a ti 🫵— sobre el botón de «retuit» para difundir este evangelio, que he echado medio sábado en él. 😜

📣 ¡Necesitamos que llegue a nuestros gobernantes y gestores!

¡Vamos allá! 🥳🧵👇Una señora —la Administración pública— cincelándole a un señor —usted y yo— en la córnea con un martillo —el trámite digital—.
Destripemos una interacción relevante de un trámite digital real que utilizan cientos de miles de españoles:

🌈 El servicio de notificaciones electrónicas de la Junta de Andalucía.

Es un trámite que ayer no funcionaba, y un tuitero publicó, cabreado, un vídeo del que he extraído este fotograma.

Asusta, ¿eh?Image
Hagamos lo que se llama un «prototipo de baja fidelidad» de la vista.

❓ ¿Y eso qué es?

Es un esbozo esquemático al que despojamos de todo diseño, de toda distracción, de todo ornato. Así podemos fijarnos mejor en los elementos constructivos de la interfaz con que el ciudadano interacciona: textos, botones, enlaces…

✨ Y cuando escribo «el ciudadano» yo pienso siempre en mi madre ❤️, que a menudo se agobia con estos trámites porque son confusos. ¡Diseñarlos bien es también un acto de amor hacia nuestros mayores y convecinos!

Mira el boceto de abajo,
¿ves qué problemas tiene?

1️⃣ Hay mucho texto.

El texto es largo e intrincado, está jalonado de referencias legales y contiene errores: pone «Prodecimiento» (sic) y la última frase es gramaticalmente errónea.

La Administración y quienes construyen estos trámites tienen que saber dos cosas:

1. Que los usuarios no leemos parrafadas en la pantalla. Ojeamos; escaneamos con la mirada…

2. Que la jerga legal intimida al lector no experto, que somos la mayoría. Provoca distancia e inseguridad.

2️⃣ Hay demasiados controles interactivos.

«Leer», «Rechazar», «Aceptar» y «Cerrar». Y las áreas cliclables de los dos primeros son diminutas. Apuntar y hacer clic en un área tan pequeña supone un esfuerzo.¹ ¡Mi madre no es francotiradora! 😃🔫

3️⃣ Hay un callejón sin salida.

Por ejemplo, puedo hacer clic en «Aceptar» sin elegir antes entre «Leer» o «Rechazar». ¿Qué pasará entonces? ¿Veré un mensaje de error?

Una interacción bien hecha no te castiga con un error, sino que evita, por diseño, que lo cometas.

En resumen…

👉 Como la interacción no ha sido bien pensada, han tenido que añadir un ladrillo de texto con unas intrincadas instrucciones de uso.

¡Esto no debería ser así!

Cuando los trámites están bien diseñados no hacen falta parrafadas ni manuales de usuario.

___
¹ Si te interesa ahondar, se llama Ley de Fitts y está en Wikipedia.Image
Read 7 tweets
May 30
🔴 El Gobierno Vasco ha enviado al Parlamento la memoria del gasto en campañas de comunicación institucional.

⚠️ Es un documento importante en una democracia, porque rinde cuentas de buena parte del dinero público que sale del Gobierno hacia los medios de comunicación.

🤦 Como todos los años, el documento oficial contiene errores y partidas mal sumadas

🚨 Pero el verdadero problema no son los errores, sino las trabas que los parlamentarios y la ciudadanía se encuentran al ejercer revisar los datos.

❓ ¿Cuánto dinero se ha llevado El Correo Vasco? ¿Y Gara? ¿Y Noticias de Álava? ¿Y COPE, Facebook o la SER?

☹️ El documento oficial es un ladrillo PDF que no responde a estas preguntas.

😩 ¿Quién en su sano juicio recorrería sus 237 páginas sumando, partida a partida, los cientos de campañas contratadas a cada medio?

⚠️ Esto es un ejemplo de «transparencia translúcida» gubernamental: «te doy un océano de datos, pero en un formato con el que no puedes hacer nada». Formalmente cumplen la ley, pero ¿de qué sirve?

👨🏻‍💻 En 2023 programé una herramienta que procesa todas estas memorias para ayudar a los parlamentarios vascos —y a la ciudadanía— a auditar el dinero público que va a los medios de comunicación.

📅 Justo ahora acabo de actualizarla con los datos de la última memoria, recién publicada (2024).👇Image
Lo tenéis en , que ya suma casi 2000 campañas de publicidad institucional explorables con un cómodo buscador y totales agregados por cada medio.gobiernovasco.marketing
Aquí va un ejemplo de partida mal sumada.

El error en el total parcial lo arrastran al total de la inversión de la campaña (en la imagen, arriba). Así que las cifras oficiales son incorrectas.

Estos errores los encuentra mi programa, pues encontrarlos a mano sería extremadamente tedioso.

El Gobierno Vasco debería publicar estos datos en un formato abierto y estructurado que permita a la ciudadanía realizar análisis. PDF no sirve.

Si un particular como yo puede hacerlo, ¿por qué el Gobierno Vasco no lo hace?Image
Read 4 tweets
Mar 27
🎉 Un pueblo de Ávila ha pillado 476.000 euros de fondos NextGenerationEU y han tenido una idea genial:

Intentar lo mismo que ya fracasó en Logroño, Utrera, Benicarló, Antequera, Sevilla, Vizcaya, Torrelavega, Toledo, Vigo, Altea, Huelva, Cáceres, Brunete, Badajoz, Algeciras, Ciudad Real, Alzira, Cartagena, Valladolid, Dénia, Murcia, Beniel, Almería, l'Alfàs del Pi, Benavente, Cuenca, Soria, Lugo, Jaén, Ceuta, Burgos, Manacor y Ponferrada.Nace 'Marketplace La Adrada' para apoyar la digitalización del comercio
Esto ya era un escándalo en 2021, cuando estudié más de un centenar de estas inversiones y escribí y envié a esto a un diario nacional para visibilizarlo e intentar que dejara de suceder:

jaime.gomezobregon.com/la-pandemia-de…
¡Qué fabulosos ingredientes!

1️⃣ Exceso de dinero público.

2️⃣ «Expertos» en políticas de digitalización cuya máxima referencia intelectual es la PCWorld.

3️⃣ Periodismo local subvencionado incapaz de todo análisis crítico.

2021 👇
jaime.gomezobregon.com/la-fiebre-de-l…
Read 5 tweets
Mar 10
El Servicio Público de Empleo de la Junta de Castilla y León tiene 6,8 millones para formación y está ofertando cursos de:

— Flash
— Dreamweaver
— Borland
— Joomla!

¡Que alguien les quite urgentemente el dinero público, por favor! Image
Image
Image
Image
En comparación, sus cursos de Oracle Database 10g (2003), parecen modernos. 😂 Image
Es la convocatoria 2023/2024 de su catálogo de acciones formativas en transformación digital y están ofertando tecnologías obsoletas e incluso desaparecidas.

🔗 infosubvenciones.es/bdnstrans/GE/e…Image
Read 10 tweets
Nov 28, 2024
😃 ¡Mañana es el día! Intervengo en el Congreso sobre el uso de datos en la definición de políticas públicas que organiza en Mallorca la Escuela Balear de Administración Pública. ¡Muchas gracias por invitarme!

🧵 Un breve hilo… 👇Image
Es la oportunidad de explicar de tú a tú a un auditorio de servidores públicos la importancia de la transparencia y los datos abiertos.

¡Aunque la mayoría ya lo saben! Así que mañana trataré de darles más argumentos para que peleen esto en sus organismos y con los políticos. Image
Tengo que resumir cinco años de trabajo en hora y media. ¡Llevo 88 páginas! Pero no será un ladrillo, sino todo lo contrario: ¡nos vamos a reír! Mirarse al espejo y reírse del reflejo es una sana actitud para abordar cualquier proceso de mejora. Image
Read 11 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!

:(