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:
204
tests/test_endpoints.py
Executable file
204
tests/test_endpoints.py
Executable file
@@ -0,0 +1,204 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script para probar diferentes endpoints de la API de Adif
|
||||
"""
|
||||
|
||||
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
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
# Headers descubiertos
|
||||
HEADERS_CIRCULATION = {
|
||||
"Content-Type": "application/json;charset=utf-8",
|
||||
"User-key": "f4ce9fbfa9d721e39b8984805901b5df"
|
||||
}
|
||||
|
||||
HEADERS_STATIONS = {
|
||||
"Content-Type": "application/json;charset=utf-8",
|
||||
"User-key": "0d021447a2fd2ac64553674d5a0c1a6f"
|
||||
}
|
||||
|
||||
HEADERS_AVISA = {
|
||||
"Content-Type": "application/json;charset=utf-8",
|
||||
"Authorization": "Basic YXZpc3RhX2NsaWVudF9hbmRyb2lkOjh5WzZKNyFmSjwhXypmYXE1NyNnOSohNElwa2MjWC1BTg=="
|
||||
}
|
||||
|
||||
# URLs base
|
||||
BASE_CIRCULATION = "https://circulacion.api.adif.es"
|
||||
BASE_STATIONS = "https://estaciones.api.adif.es"
|
||||
BASE_AVISA = "https://avisa.adif.es"
|
||||
|
||||
|
||||
def test_endpoint(name, method, url, headers, data=None):
|
||||
"""Probar un endpoint y mostrar resultado"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"TEST: {name}")
|
||||
print(f"{'='*60}")
|
||||
print(f"Method: {method}")
|
||||
print(f"URL: {url}")
|
||||
print(f"Headers: {json.dumps(headers, indent=2)}")
|
||||
|
||||
if data:
|
||||
print(f"Body: {json.dumps(data, indent=2)}")
|
||||
|
||||
try:
|
||||
if method == "GET":
|
||||
response = requests.get(url, headers=headers, timeout=10)
|
||||
elif method == "POST":
|
||||
response = requests.post(url, headers=headers, json=data, timeout=10)
|
||||
else:
|
||||
print(f"❌ Método {method} no soportado")
|
||||
return
|
||||
|
||||
print(f"\nStatus: {response.status_code}")
|
||||
|
||||
if response.status_code == 200:
|
||||
print("✅ SUCCESS")
|
||||
result = response.json()
|
||||
print(f"\nResponse Preview:")
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False)[:1000] + "...")
|
||||
else:
|
||||
print(f"❌ ERROR")
|
||||
print(f"Response: {response.text[:500]}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ EXCEPTION: {str(e)}")
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print("PRUEBAS DE ENDPOINTS DE ADIF API")
|
||||
print("=" * 60)
|
||||
|
||||
# Test 1: Obtener salidas con diferentes formatos de body
|
||||
test_endpoint(
|
||||
"Salidas - Formato Simple",
|
||||
"POST",
|
||||
f"{BASE_CIRCULATION}/portroyalmanager/secure/circulationpaths/departures/traffictype/",
|
||||
HEADERS_CIRCULATION,
|
||||
{
|
||||
"stationCode": "10200",
|
||||
"commercialService": "BOTH",
|
||||
"commercialStopType": "BOTH",
|
||||
"page": {"pageNumber": 0},
|
||||
"trafficType": "CERCANIAS"
|
||||
}
|
||||
)
|
||||
|
||||
# Test 2: Probar con State YES
|
||||
test_endpoint(
|
||||
"Salidas - State YES",
|
||||
"POST",
|
||||
f"{BASE_CIRCULATION}/portroyalmanager/secure/circulationpaths/departures/traffictype/",
|
||||
HEADERS_CIRCULATION,
|
||||
{
|
||||
"stationCode": "10200",
|
||||
"commercialService": "YES",
|
||||
"commercialStopType": "YES",
|
||||
"page": {"pageNumber": 0},
|
||||
"trafficType": "ALL"
|
||||
}
|
||||
)
|
||||
|
||||
# Test 3: Detalles de una ruta específica
|
||||
test_endpoint(
|
||||
"Detalles de Ruta",
|
||||
"POST",
|
||||
f"{BASE_CIRCULATION}/portroyalmanager/secure/circulationpathdetails/onepaths/",
|
||||
HEADERS_CIRCULATION,
|
||||
{
|
||||
"commercialNumber": "C1",
|
||||
"allControlPoints": False
|
||||
}
|
||||
)
|
||||
|
||||
# Test 4: Entre estaciones
|
||||
test_endpoint(
|
||||
"Entre Estaciones",
|
||||
"POST",
|
||||
f"{BASE_CIRCULATION}/portroyalmanager/secure/circulationpaths/betweenstations/traffictype/",
|
||||
HEADERS_CIRCULATION,
|
||||
{
|
||||
"originStationCode": "10200",
|
||||
"destinationStationCode": "10302",
|
||||
"commercialService": "BOTH",
|
||||
"commercialStopType": "BOTH",
|
||||
"page": {"pageNumber": 0},
|
||||
"trafficType": "ALL"
|
||||
}
|
||||
)
|
||||
|
||||
# Test 5: Detalles de estación
|
||||
test_endpoint(
|
||||
"Detalles de Estación",
|
||||
"POST",
|
||||
f"{BASE_STATIONS}/portroyalmanager/secure/stations/onestation/",
|
||||
HEADERS_STATIONS,
|
||||
{
|
||||
"stationCode": "10200"
|
||||
}
|
||||
)
|
||||
|
||||
# Test 6: Observaciones de estación
|
||||
test_endpoint(
|
||||
"Observaciones de Estación",
|
||||
"POST",
|
||||
f"{BASE_STATIONS}/portroyalmanager/secure/stationsobservations/",
|
||||
HEADERS_STATIONS,
|
||||
{
|
||||
"stationCode": "10200"
|
||||
}
|
||||
)
|
||||
|
||||
# Test 7: Composición de tren
|
||||
test_endpoint(
|
||||
"Composición de Tren",
|
||||
"POST",
|
||||
f"{BASE_CIRCULATION}/portroyalmanager/secure/circulationpaths/compositions/path/",
|
||||
HEADERS_CIRCULATION,
|
||||
{
|
||||
"commercialNumber": "AVE 1001",
|
||||
"originStationCode": "10200",
|
||||
"destinationStationCode": "71801"
|
||||
}
|
||||
)
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("RESUMEN")
|
||||
print("="*60)
|
||||
print("""
|
||||
Las pruebas han finalizado. Revisa los resultados arriba.
|
||||
|
||||
NOTAS:
|
||||
- Algunos endpoints pueden requerir códigos/números válidos
|
||||
- Los códigos de estación son numéricos (ej: 10200 para Madrid Atocha)
|
||||
- Los números comerciales varían según el tipo de tren
|
||||
- Algunos datos pueden no estar disponibles en tiempo real
|
||||
|
||||
CÓDIGOS DE ESTACIÓN COMUNES:
|
||||
- 10200: Madrid Puerta de Atocha
|
||||
- 10302: Madrid Chamartín
|
||||
- 71801: Barcelona Sants
|
||||
- 50000: Valencia Nord
|
||||
- 11401: Sevilla Santa Justa
|
||||
|
||||
TIPOS DE TRÁFICO:
|
||||
- CERCANIAS: Trenes de cercanías
|
||||
- MEDIA_DISTANCIA: Media distancia
|
||||
- LARGA_DISTANCIA: Larga distancia
|
||||
- ALL: Todos los tipos
|
||||
|
||||
ESTADOS:
|
||||
- YES: Solo servicios/paradas comerciales
|
||||
- NOT: Sin servicios/paradas comerciales
|
||||
- BOTH: Ambos tipos
|
||||
""")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user