Refactor: reorganización completa del proyecto y documentación consolidada

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
This commit is contained in:
2025-12-05 11:22:13 +01:00
parent aa02d7c896
commit 68fac80520
42 changed files with 66402 additions and 4876 deletions

View File

@@ -0,0 +1,182 @@
#!/usr/bin/env python3
"""
Prueba detallada de endpoints con mensajes de error completos
"""
import sys
from pathlib import Path
# Agregar raíz del proyecto al path para importar adif_auth
sys.path.insert(0, str(Path(__file__).parent.parent))
import requests
from adif_auth import AdifAuthenticator
import uuid
import json
from datetime import datetime, timedelta
import time
ACCESS_KEY = "and20210615"
SECRET_KEY = "Jthjtr946RTt"
def test_endpoint_detailed(name, url, payload, use_stations_key=False):
"""
Prueba un endpoint y muestra información detallada
"""
auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY)
user_id = str(uuid.uuid4())
headers = auth.get_auth_headers("POST", url, payload, user_id=user_id)
if use_stations_key:
headers["User-key"] = auth.USER_KEY_STATIONS
else:
headers["User-key"] = auth.USER_KEY_CIRCULATION
print(f"\n{'='*70}")
print(f"Testing: {name}")
print(f"{'='*70}")
print(f"URL: {url}")
print(f"Payload: {json.dumps(payload, indent=2)}")
try:
response = requests.post(url, json=payload, headers=headers, timeout=10)
print(f"\nStatus Code: {response.status_code}")
print(f"Headers: {dict(response.headers)}")
try:
response_json = response.json()
print(f"Response Body: {json.dumps(response_json, indent=2, ensure_ascii=False)[:1000]}")
except:
print(f"Response Body (text): {response.text[:500]}")
if response.status_code == 200:
print("✅ SUCCESS")
return True
else:
print(f"❌ FAILED - Status {response.status_code}")
return False
except Exception as e:
print(f"❌ ERROR: {e}")
return False
# Obtener timestamps
now = datetime.now()
# Fecha actual al inicio del día en milisegundos
today_start = int(datetime(now.year, now.month, now.day).timestamp() * 1000)
# Fecha de mañana al inicio del día
tomorrow_start = int((datetime(now.year, now.month, now.day) + timedelta(days=1)).timestamp() * 1000)
print(f"Testing con fechas:")
print(f"Today (start): {today_start} = {datetime.fromtimestamp(today_start/1000)}")
print(f"Tomorrow (start): {tomorrow_start} = {datetime.fromtimestamp(tomorrow_start/1000)}")
# Test betweenStations (401)
test_endpoint_detailed(
"BetweenStations",
"https://circulacion.api.adif.es/portroyalmanager/secure/circulationpaths/betweenstations/traffictype/",
{
"commercialService": "BOTH",
"commercialStopType": "BOTH",
"originStationCode": "10200",
"destinationStationCode": "71801",
"page": {"pageNumber": 0},
"trafficType": "ALL"
}
)
# Test onePaths con variaciones (400)
print("\n\n" + "="*70)
print("TESTING ONEPATHS CON DIFERENTES VARIACIONES")
print("="*70)
# Variación 1: Con commercialNumber válido
test_endpoint_detailed(
"OnePaths - Con commercialNumber '03194'",
"https://circulacion.api.adif.es/portroyalmanager/secure/circulationpathdetails/onepaths/",
{
"allControlPoints": True,
"commercialNumber": "03194",
"destinationStationCode": "71801",
"launchingDate": today_start,
"originStationCode": "10200"
}
)
# Variación 2: Sin commercialNumber
test_endpoint_detailed(
"OnePaths - Sin commercialNumber (null)",
"https://circulacion.api.adif.es/portroyalmanager/secure/circulationpathdetails/onepaths/",
{
"allControlPoints": True,
"commercialNumber": None,
"destinationStationCode": "71801",
"launchingDate": today_start,
"originStationCode": "10200"
}
)
# Variación 3: Sin el campo commercialNumber completamente
test_endpoint_detailed(
"OnePaths - Sin campo commercialNumber",
"https://circulacion.api.adif.es/portroyalmanager/secure/circulationpathdetails/onepaths/",
{
"allControlPoints": True,
"destinationStationCode": "71801",
"launchingDate": today_start,
"originStationCode": "10200"
}
)
# Variación 4: Solo con originStationCode (sin destination)
test_endpoint_detailed(
"OnePaths - Solo originStationCode",
"https://circulacion.api.adif.es/portroyalmanager/secure/circulationpathdetails/onepaths/",
{
"allControlPoints": True,
"launchingDate": today_start,
"originStationCode": "10200"
}
)
# Variación 5: Estructura mínima
test_endpoint_detailed(
"OnePaths - Estructura mínima",
"https://circulacion.api.adif.es/portroyalmanager/secure/circulationpathdetails/onepaths/",
{
"commercialNumber": "03194",
"launchingDate": today_start
}
)
# Test OneStation con onestation (401)
test_endpoint_detailed(
"OneStation",
"https://estaciones.api.adif.es/portroyalmanager/secure/stations/onestation/",
{
"stationCode": "10200",
"detailedInfo": {
"extendedStationInfo": True,
"stationActivities": True,
"stationBanner": True,
"stationCommercialServices": True,
"stationInfo": True,
"stationServices": True,
"stationTransportServices": True
}
},
use_stations_key=True
)
# Variación: OneStation simple
test_endpoint_detailed(
"OneStation - Simple",
"https://estaciones.api.adif.es/portroyalmanager/secure/stations/onestation/",
{
"stationCode": "10200"
},
use_stations_key=True
)
print("\n" + "="*70)
print("PRUEBA COMPLETADA")
print("="*70)