Files
adif-api-reverse-engineering/tests/test_onepaths_with_real_trains.py
Dasemu 68fac80520 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
2025-12-05 11:22:13 +01:00

127 lines
4.1 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Primero obtenemos trenes reales de departures, y luego probamos onePaths con esos números
"""
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
ACCESS_KEY = "and20210615"
SECRET_KEY = "Jthjtr946RTt"
auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY)
# Paso 1: Obtener trenes reales de departures
print("="*70)
print("PASO 1: Obteniendo trenes reales de Madrid Atocha")
print("="*70)
url = "https://circulacion.api.adif.es/portroyalmanager/secure/circulationpaths/departures/traffictype/"
payload = {
"commercialService": "BOTH",
"commercialStopType": "BOTH",
"page": {"pageNumber": 0},
"stationCode": "10200", # Madrid Atocha
"trafficType": "AVLDMD" # Alta Velocidad
}
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)
if response.status_code != 200:
print(f"❌ Error obteniendo departures: {response.status_code}")
print(response.text)
exit(1)
data = response.json()
trains = data.get('circulations', [])
print(f"✅ Obtenidos {len(trains)} trenes\n")
# Mostrar los primeros 5 trenes
print("Primeros 5 trenes:")
for i, train in enumerate(trains[:5]):
commercial_number = train.get('commercialNumber')
destination = train.get('destination', {})
dest_name = destination.get('longName', 'Unknown')
origin = train.get('origin', {})
origin_name = origin.get('longName', 'Unknown')
planned_time = train.get('plannedTime', 'Unknown')
print(f"\n{i+1}. Tren {commercial_number}")
print(f" Origen: {origin_name}")
print(f" Destino: {dest_name}")
print(f" Hora salida: {planned_time}")
# Paso 2: Probar onePaths con trenes reales
print("\n" + "="*70)
print("PASO 2: Probando onePaths con trenes reales")
print("="*70)
for i, train in enumerate(trains[:3]): # Probar los primeros 3
commercial_number = train.get('commercialNumber')
destination = train.get('destination', {})
dest_code = destination.get('stationCode')
origin = train.get('origin', {})
origin_code = origin.get('stationCode')
# Obtener launchingDate del tren
planned_time_str = train.get('plannedTime', '')
# El plannedTime es algo como "08:30" - necesitamos convertirlo a timestamp
now = datetime.now()
today_start = int(datetime(now.year, now.month, now.day).timestamp() * 1000)
print(f"\n{'='*70}")
print(f"Test {i+1}: Tren {commercial_number}")
print(f"{'='*70}")
url_onepaths = "https://circulacion.api.adif.es/portroyalmanager/secure/circulationpathdetails/onepaths/"
payload_onepaths = {
"allControlPoints": True,
"commercialNumber": commercial_number,
"destinationStationCode": dest_code,
"launchingDate": today_start,
"originStationCode": origin_code
}
print(f"Payload: {json.dumps(payload_onepaths, indent=2)}")
user_id = str(uuid.uuid4())
headers = auth.get_auth_headers("POST", url_onepaths, payload_onepaths, user_id=user_id)
headers["User-key"] = auth.USER_KEY_CIRCULATION
response = requests.post(url_onepaths, json=payload_onepaths, headers=headers, timeout=10)
print(f"\nStatus: {response.status_code}")
if response.status_code == 200:
print("✅ SUCCESS!")
try:
data = response.json()
print(f"Response: {json.dumps(data, indent=2, ensure_ascii=False)[:2000]}")
except:
print(f"Response text: {response.text[:500]}")
elif response.status_code == 204:
print("⚠️ 204 No Content - Autenticación correcta pero sin datos")
else:
print(f"❌ FAILED - Status {response.status_code}")
try:
print(f"Error: {response.json()}")
except:
print(f"Response text: {response.text}")
print("\n" + "="*70)
print("PRUEBA COMPLETADA")
print("="*70)