Esta actualización reorganiza el proyecto de reverse engineering de la API de ADIF con los siguientes cambios: Estructura del proyecto: - Movida documentación principal a carpeta docs/ - Consolidados archivos markdown redundantes en CLAUDE.md (contexto completo del proyecto) - Organización de tests en carpeta tests/ con README explicativo - APK renombrado de base.apk a adif.apk para mayor claridad Archivos de código: - Movidos adif_auth.py y adif_client.py a la raíz (antes en api_testing_scripts/) - Eliminados scripts de testing obsoletos y scripts de Frida no utilizados - Nuevos tests detallados: test_endpoints_detailed.py y test_onepaths_with_real_trains.py Descubrimientos: - Documentados nuevos hallazgos en docs/NEW_DISCOVERIES.md - Actualización de onePaths funcionando con commercialNumber real (devuelve 200) - Extraídos 1587 códigos de estación en station_codes.txt Configuración: - Actualizado .gitignore con mejores patrones para Python e IDEs - Eliminados archivos temporales de depuración y logs
Tests - ADIF API
Scripts de prueba para validar la funcionalidad de la API de ADIF.
🧪 Tests Activos
test_endpoints_detailed.py
Test exhaustivo de todos los endpoints con información de debug completa.
Características:
- Muestra status codes, headers y respuesta JSON
- Prueba múltiples variaciones de payload
- Identifica errores 400, 401 y sus causas
- Útil para debugging de nuevos endpoints
Uso:
python3 tests/test_endpoints_detailed.py
Salida esperada:
- Información detallada de cada petición
- Análisis de errores con mensajes del servidor
- Diferenciación entre errores de payload vs permisos
test_onepaths_with_real_trains.py
Test funcional que obtiene trenes reales y prueba el endpoint onepaths.
Características:
- Consulta
departurespara obtener trenes circulando - Extrae
commercialNumber,launchingDate, códigos de estación - Prueba
onepathscon datos reales - Valida que el endpoint funciona correctamente
Uso:
python3 tests/test_onepaths_with_real_trains.py
Requisitos:
- Ejecutar durante el día (cuando hay trenes circulando)
- Si se ejecuta de noche/madrugada puede no encontrar trenes
Salida esperada:
======================================================================
PASO 1: Obteniendo trenes reales de Madrid Atocha
======================================================================
✅ Obtenidos 25 trenes
======================================================================
PASO 2: Probando onePaths con trenes reales
======================================================================
✅ SUCCESS! onePaths funciona con datos reales
📁 Tests Archivados
La carpeta archived/ contiene tests antiguos que fueron útiles durante el desarrollo pero ya no son necesarios:
test_all_endpoints.py- Versión simple sin debugtest_complete_bodies.py- Pruebas de payloads completostest_corrected_api.py/test_corrected_api_v2.py- Versiones anteriorestest_real_auth.py- Tests de autenticación básicostest_simple.py- Test minimalistatest_with_auth_headers.py- Validación de headerstest_without_auth.py- Test sin autenticacióndebug_auth.py- Debug del algoritmo HMAC
Estos tests se mantienen por si son útiles como referencia, pero los tests activos son más completos.
🔧 Estructura de un Test
Template Básico
from adif_auth import AdifAuthenticator
import requests
import uuid
ACCESS_KEY = "and20210615"
SECRET_KEY = "Jthjtr946RTt"
def test_endpoint():
auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY)
url = "https://circulacion.api.adif.es/portroyalmanager/secure/..."
payload = {
# Tu payload aquí
}
user_id = str(uuid.uuid4())
headers = auth.get_auth_headers("POST", url, payload, user_id=user_id)
headers["User-key"] = auth.USER_KEY_CIRCULATION
response = requests.post(url, json=payload, headers=headers, timeout=10)
assert response.status_code == 200
print(f"✅ Test passed: {response.json()}")
if __name__ == "__main__":
test_endpoint()
Análisis de Status Codes
if response.status_code == 200:
print("✅ SUCCESS - Endpoint funcional")
data = response.json()
elif response.status_code == 204:
print("⚠️ NO CONTENT - Autenticación correcta pero sin datos")
elif response.status_code == 400:
print("❌ BAD REQUEST - Payload incorrecto")
print(f"Error: {response.json()}")
elif response.status_code == 401:
print("❌ UNAUTHORIZED - Sin permisos")
print(f"Error: {response.json()}")
📊 Resultados Esperados
Endpoints Funcionales (200)
/departures/traffictype//arrivals/traffictype//onepaths/(con commercialNumber real)/stationsobservations/
Endpoints Bloqueados (401)
/betweenstations/traffictype//onestation//severalpaths//compositions/path/
💡 Tips para Crear Nuevos Tests
- Usar
test_endpoints_detailed.pycomo base - Tiene buen manejo de errores - Validar timestamps - Usar milisegundos, no segundos
- Probar con datos reales - Como hace
test_onepaths_with_real_trains.py - Diferenciar errores:
- 400 = Payload incorrecto → Revisar campos
- 401 = Sin permisos → Las claves no tienen acceso
- 204 = Sin datos → Autenticación OK, pero respuesta vacía
Última actualización: 2025-12-05