BiciMAD + Shortcuts
Todo comenzó cuando empecé a usar BiciMAD y me obligaban a usar su aplicación... Al principio estaba bien, pero con los constantes errores, la lentitud y el hecho de que la UI es terrible, decidí hacer lo que mejor se me da: usar la API.
Error de la EMT número 1... La API no es pública. Digo error, porque esto me alentó a intentar averiguar a donde se conectaba la aplicación para sacar las bicicletas. Aquí es donde entra mitmproxy, un fantástico proxy que, al hacer que todo el tráfico de mi móvil pase por el ordenador, puedo ver a que se conecta, y qué pide (y lo más importante, cómo lo pide).
![#python from Random stream](https://64.media.tumblr.com/93077115fcf6344fefdfa8381a37b0e7/0e08bfea412a18df-e1/s540x810/f620e229b6e5e8c1e8f2839a15f6665a5a5f4ecf.png)
Aja! Me dije a mi mismo cuando conseguí ver a que llamaba. Logré obtener los endpoints con los que la app obtiene el estado de la bicicleta, el estado del sistema y la información sobre el usuario, ahora me faltaba el endpoint de eyección (el sacar la bici, vamos). Tras trastear un poco con las bicicletas que hay en el campus de la universidad, me dí cuenta de que había llegado a un callejón sin salida. La aplicación envía un "hashcode" (luego veréis porque está entre comillas) con toda la información necesaria para desanclar la bicicleta, no bueno, sin embargo todas las strings tenían algo en común, ¡tenían la misma longitud! Así que tras mover bicicletas de sitio y un poco de ingenio (lo cual quizás involucrara descompilar la app y examinar su funcionamiento interno, con mucha ayuda, debo decir) logramos descifrar el "hashcode" que no era uno (Error de la EMT número 2), en realidad es un string encriptado de una forma especial (así que o lo pusieron para despistar o los que hicieron la app no tienen ni idea de qué es un hashcode...)
En fin... Gracias a que Shortcuts (thanks Apple) te deja hacer scripts a través de SSH, mi función encriptadora reside en mi servidor, y lo único que tengo que hacer es... darle la matrícula de la bicicleta!
![](https://blog.intron014.com/content/images/2023/11/Monday--27-Nov-2023-15-23-16-1.png)
![](https://blog.intron014.com/content/images/2023/11/Monday--27-Nov-2023-15-22-31-1.png)
![](https://blog.intron014.com/content/images/2023/11/Monday--27-Nov-2023-15-23-07-1.png)
Funcionamiento básico del atajo
Así que nada, un problema más solucionado gracias a la magia de las APIs!