#!/usr/bin/env python3 """ Script de prueba con autenticación real Usar después de extraer las claves con Ghidra INSTRUCCIONES: 1. Extraer ACCESS_KEY y SECRET_KEY con Ghidra (ver GHIDRA_GUIDE.md) 2. Reemplazar las claves en las líneas 16-17 3. Ejecutar: python3 test_real_auth.py """ import requests from adif_auth import AdifAuthenticator import json # ============================================================ # REEMPLAZAR ESTAS CLAVES CON LAS EXTRAÍDAS DE GHIDRA # ============================================================ ACCESS_KEY = "and20210615" # ✅ Extraído con Ghidra SECRET_KEY = "Jthjtr946RTt" # ✅ Extraído con Ghidra # ============================================================ def test_departures(user_id=None): """ Prueba 1: Salidas desde Madrid Atocha """ print("\n" + "="*70) print("TEST 1: Salidas desde Madrid Atocha") print("="*70) auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY) url = "https://circulacion.api.adif.es/portroyalmanager/secure/circulationpaths/departures/traffictype/" payload = { "commercialService": "BOTH", "commercialStopType": "BOTH", "page": {"pageNumber": 0}, "stationCode": "10200", # Madrid Atocha "trafficType": "ALL" } headers = auth.get_auth_headers("POST", url, payload, user_id=user_id) headers["User-key"] = auth.USER_KEY_CIRCULATION print(f"\nURL: {url}") print(f"Payload: {json.dumps(payload, indent=2)}") print(f"\nHeaders generados:") for key, value in headers.items(): if key == "Authorization": print(f" {key}: {value[:50]}... (truncado)") else: print(f" {key}: {value}") print("\nEnviando petición...") response = requests.post(url, json=payload, headers=headers, timeout=10) print(f"\nStatus Code: {response.status_code}") if response.status_code == 200: print("✅ ¡ÉXITO! Autenticación funcionando correctamente") data = response.json() print(f"\nTotal de salidas encontradas: {data.get('totalElements', 'N/A')}") if 'departures' in data and len(data['departures']) > 0: print(f"\nPrimera salida:") first = data['departures'][0] print(f" - Número: {first.get('commercialNumber', 'N/A')}") print(f" - Origen: {first.get('originStationName', 'N/A')}") print(f" - Destino: {first.get('destinationStationName', 'N/A')}") print(f" - Tipo: {first.get('trafficType', 'N/A')}") return True else: print(f"❌ Error: {response.status_code}") print(f"Respuesta: {response.text[:500]}") return False def test_between_stations(user_id=None): """ Prueba 2: Trenes entre Madrid y Barcelona """ print("\n" + "="*70) print("TEST 2: Trenes entre Madrid Atocha y Barcelona Sants") print("="*70) auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY) url = "https://circulacion.api.adif.es/portroyalmanager/secure/circulationpaths/betweenstations/traffictype/" payload = { "commercialService": "BOTH", "commercialStopType": "BOTH", "originStationCode": "10200", # Madrid Atocha "destinationStationCode": "71801", # Barcelona Sants "page": {"pageNumber": 0}, "trafficType": "ALL" } headers = auth.get_auth_headers("POST", url, payload, user_id=user_id) headers["User-key"] = auth.USER_KEY_CIRCULATION print(f"\nURL: {url}") print(f"Ruta: Madrid Atocha (10200) → Barcelona Sants (71801)") print("\nEnviando petición...") response = requests.post(url, json=payload, headers=headers, timeout=10) print(f"\nStatus Code: {response.status_code}") if response.status_code == 200: print("✅ ¡ÉXITO! Autenticación funcionando correctamente") data = response.json() print(f"\nTotal de trenes encontrados: {data.get('totalElements', 'N/A')}") if 'betweenStations' in data and len(data['betweenStations']) > 0: print(f"\nPrimer tren:") first = data['betweenStations'][0] print(f" - Número: {first.get('commercialNumber', 'N/A')}") print(f" - Origen: {first.get('originStationName', 'N/A')}") print(f" - Destino: {first.get('destinationStationName', 'N/A')}") print(f" - Tipo: {first.get('trafficType', 'N/A')}") return True else: print(f"❌ Error: {response.status_code}") print(f"Respuesta: {response.text[:500]}") return False def test_station_info(user_id=None): """ Prueba 3: Información de estación """ print("\n" + "="*70) print("TEST 3: Información detallada de Madrid Atocha") print("="*70) auth = AdifAuthenticator(access_key=ACCESS_KEY, secret_key=SECRET_KEY) url = "https://estaciones.api.adif.es/portroyalmanager/secure/stations/onestation/" payload = { "stationCode": "10200", # Madrid Atocha "detailedInfo": { "extendedStationInfo": True, "stationActivities": True, "stationBanner": True, "stationCommercialServices": True, "stationInfo": True, "stationServices": True, "stationTransportServices": True } } headers = auth.get_auth_headers("POST", url, payload, user_id=user_id) headers["User-key"] = auth.USER_KEY_STATIONS print(f"\nURL: {url}") print(f"Estación: Madrid Atocha (10200)") print("\nEnviando petición...") response = requests.post(url, json=payload, headers=headers, timeout=10) print(f"\nStatus Code: {response.status_code}") if response.status_code == 200: print("✅ ¡ÉXITO! Autenticación funcionando correctamente") data = response.json() if 'stationName' in data: print(f"\nNombre: {data.get('stationName', 'N/A')}") print(f"Código: {data.get('stationCode', 'N/A')}") print(f"Dirección: {data.get('address', 'N/A')}") if 'stationServices' in data: print(f"\nServicios disponibles: {len(data['stationServices'])}") return True else: print(f"❌ Error: {response.status_code}") print(f"Respuesta: {response.text[:500]}") return False def main(): """ Ejecutar todas las pruebas """ print("\n" + "╔"+"═"*68+"╗") print("║" + " "*15 + "PRUEBA DE AUTENTICACIÓN ADIF API" + " "*21 + "║") print("╚"+"═"*68+"╝") # Verificar que las claves fueron cambiadas if ACCESS_KEY == "YOUR_ACCESS_KEY_FROM_GHIDRA" or SECRET_KEY == "YOUR_SECRET_KEY_FROM_GHIDRA": print("\n⚠️ ERROR: Debes reemplazar las claves en las líneas 16-17") print(" Ver GHIDRA_GUIDE.md para instrucciones de extracción") print("\n Pasos:") print(" 1. Abrir Ghidra") print(" 2. Analizar lib/x86_64/libapi-keys.so") print(" 3. Buscar funciones getAccessKeyPro y getSecretKeyPro") print(" 4. Copiar las claves del código decompilado") print(" 5. Reemplazar en este archivo (líneas 16-17)") return # Generar un USER_ID persistente para toda la sesión import uuid user_id = str(uuid.uuid4()) print(f"\n📋 Configuración:") print(f" ACCESS_KEY: {ACCESS_KEY[:10]}...{ACCESS_KEY[-10:]} ({len(ACCESS_KEY)} chars)") print(f" SECRET_KEY: {SECRET_KEY[:10]}...{SECRET_KEY[-10:]} ({len(SECRET_KEY)} chars)") print(f" USER_ID: {user_id}") # Ejecutar pruebas results = [] try: results.append(("Salidas desde Madrid", test_departures(user_id=user_id))) except Exception as e: print(f"❌ Error en test_departures: {e}") results.append(("Salidas desde Madrid", False)) try: results.append(("Trenes Madrid-Barcelona", test_between_stations(user_id=user_id))) except Exception as e: print(f"❌ Error en test_between_stations: {e}") results.append(("Trenes Madrid-Barcelona", False)) try: results.append(("Info de estación", test_station_info(user_id=user_id))) except Exception as e: print(f"❌ Error en test_station_info: {e}") results.append(("Info de estación", False)) # Resumen print("\n" + "="*70) print("RESUMEN DE PRUEBAS") print("="*70) success_count = sum(1 for _, success in results if success) total_count = len(results) for test_name, success in results: status = "✅ PASS" if success else "❌ FAIL" print(f"{status} - {test_name}") print(f"\nResultado: {success_count}/{total_count} pruebas exitosas") if success_count == total_count: print("\n🎉 ¡FELICIDADES! Todas las pruebas pasaron") print(" La autenticación está funcionando correctamente") print("\n📚 Próximos pasos:") print(" - Explorar otros endpoints en API_REQUEST_BODIES.md") print(" - Implementar tu aplicación usando adif_auth.py") print(" - Revisar FINAL_SUMMARY.md para más información") elif success_count > 0: print(f"\n⚠️ Algunas pruebas fallaron ({total_count - success_count}/{total_count})") print(" - Verifica que las claves sean correctas") print(" - Revisa los mensajes de error arriba") else: print("\n❌ Todas las pruebas fallaron") print(" Posibles problemas:") print(" 1. Las claves extraídas son incorrectas") print(" 2. Hay un error en el proceso de extracción") print(" 3. Las claves han cambiado en una nueva versión de la app") print("\n Soluciones:") print(" - Revisar GHIDRA_GUIDE.md paso a paso") print(" - Verificar que analizaste el archivo correcto") print(" - Asegurarte de copiar las claves completas (sin espacios)") if __name__ == "__main__": main()