Primer paso de la investigacion. Se aportan el .apk, las carpetas con el apk extraido y el apk descompilado. El archivo API_DOCUMENTATION.md es un archivo donde se anotaran los descubrimientos del funcionamiento de la API, y los .py son scripts para probar la funcionalidad de la API con los métodos que vayamos encontrando. Finalmente, los archivos .js son scripts de Frida para extraer informacion de la APP durante la ejecucion.
This commit is contained in:
199
api_testing_scripts/test_endpoints.py
Executable file
199
api_testing_scripts/test_endpoints.py
Executable file
@@ -0,0 +1,199 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script para probar diferentes endpoints de la API de Adif
|
||||
"""
|
||||
|
||||
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