Skip to content

Instantly share code, notes, and snippets.

@soukron
Last active August 9, 2024 13:55
Show Gist options
  • Save soukron/3cfb245dfb97f9c95c90aa037acecbe0 to your computer and use it in GitHub Desktop.
Save soukron/3cfb245dfb97f9c95c90aa037acecbe0 to your computer and use it in GitHub Desktop.
Apple Script para rellenar automáticamente el formulario del Ministerio del Interior para vuelo de drones
--
-- Script para rellenar automaticamente los campos estrictamente necesarios de la comuncacion
-- al Ministerio del Interior. Si quieres que rellene más, tienes que modificarlo usando
-- el contenido actual como ejemplo.
--
-- Instrucciones:
-- - ejecutar "Script Editor"
-- - pegar el contenido del script
-- - modifica los valores de operador, pilotos y UAS
-- - abre Safari
-- - ve a la web e inicia sesion con tu certificado digital o Cl@ve
-- - ejecuta el script, elige el piloto y UAS cuando se te pregunte
-- - no toques nada y sigue las instrucciones (ya que tendras que poner la fecha del seguro manualmente)
--
-- Sergio G. <[email protected]>
--
-- Ultimos cambios:
-- - 2024-08-08 - agregado soporte para multiples drones
-- - 2024-08-08 - agregado soporte para multiples pilotos
-- - 2024-08-08 - agregado control sobre el campo "modelo" de UAS ya que está limitado a 4 caracteres en el formulario
--
-- Declaraciones globales
global listaDrones
global listaPilotos
global delayEntrePaginas
-- Configuración de delay entre páginas (en segundos)
set delayEntrePaginas to 2
-- Datos del operador
set operadorCalle to "calle"
set operadorDireccion to "nombre_de_calle"
set operadorNumero to "00"
set operadorPortal to "A"
set operadorProvincia to "valencia"
set operadorLocalidad to "valencia"
set operadorCodigoPostal to "46001"
set operadorTelefono to "+34000000000"
set operadorEmail to "[email protected]"
set operadorRegistro to "ESPXXXXXXXXXX"
-- Lista de drones (actualizada con modelos DJI)
set listaDrones to {¬
{nombre:"DJI Mini 4 Pro", tipo:"Rotor", fabricante:"DJI", codModelo:"Mini4Pro", desModelo:"Mini 4 Pro", numeroSerie:"XXXXXXXXXXXX1", MTOM:"249", autonomia:"34", banda:"2.4ghz,5.8ghz", color:"gris", luces:"si", carga:"no", VHF:"no", equipoEmergencia:"no", vision:"si"}, ¬
{nombre:"DJI Air 3", tipo:"Rotor", fabricante:"DJI", codModelo:"Air3", desModelo:"Air 3", numeroSerie:"XXXXXXXXXXXX2", MTOM:"720", autonomia:"46", banda:"2.4ghz,5.8ghz", color:"gris", luces:"si", carga:"no", VHF:"no", equipoEmergencia:"no", vision:"si"}, ¬
{nombre:"DJI Mavic 3", tipo:"Rotor", fabricante:"DJI", codModelo:"Mavic3", desModelo:"Mavic 3", numeroSerie:"XXXXXXXXXXXX3", MTOM:"895", autonomia:"46", banda:"2.4ghz,5.8ghz", color:"gris", luces:"si", carga:"no", VHF:"no", equipoEmergencia:"no", vision:"si"} ¬
}
-- Lista de pilotos
set listaPilotos to {¬
{nombre:"Nombre1", apellido:"Apellido1", DNI:"53205772X", competencia:"abierta", autopractica:"abierta", seguroClase:"profesional", seguroEntidad:"Aseguradora1"}, ¬
{nombre:"Nombre2", apellido:"Apellido2", DNI:"11111111Y", competencia:"específica", autopractica:"específica", seguroClase:"recreativo", seguroEntidad:"Aseguradora2"} ¬
}
-- Función para enviar teclas
on enviarTecla(tipo, tabDespues)
tell application "System Events"
if tipo is "Tab" then
keystroke tab
delay 0.2
else if tipo is "Space" then
keystroke space
delay 1
else if tipo is "Return" then
keystroke return
delay 0.5
else if tipo is "CtrlReturn" then
keystroke return using {control down}
delay 2
else
keystroke tipo
delay 0.2
end if
end tell
if tabDespues is not 0 then
repeat tabDespues times
tell application "System Events"
keystroke tab
delay 0.2
end tell
end repeat
end if
end enviarTecla
-- Función para rellenar un campo
on rellenarCampo(campo, valor)
tell application "Safari"
activate
do JavaScript "document.querySelector('input[name=\"formCampos:" & campo & "\"]').value = '" & valor & "';" in current tab of window 1
end tell
end rellenarCampo
-- Función para apretar un botón
on apretaBoton(clase)
tell application "Safari"
delay 1
do JavaScript "document.querySelector('" & clase & "').click();" in current tab of window 1
end tell
end apretaBoton
-- Función para buscar Safari
on buscaSafari()
tell application "Safari"
activate
set targetWindow to null
repeat with w in windows
if name of w contains "Drones" then
set targetWindow to w
exit repeat
end if
end repeat
if targetWindow is null then
error "No se encontró una ventana con 'Drones' en el título."
end if
set index of targetWindow to 1
end tell
delay 1
end buscaSafari
-- Función para seleccionar un drone
on seleccionarDrone()
global listaDrones
if listaDrones is {} then
error "La lista de drones está vacía."
end if
set opciones to {}
repeat with drone in listaDrones
set end of opciones to (nombre of drone)
end repeat
set droneSeleccionado to choose from list opciones with prompt "Selecciona el drone para rellenar el formulario:" default items {item 1 of opciones}
if droneSeleccionado is false then
error "No se seleccionó ningún drone."
end if
repeat with drone in listaDrones
if (nombre of drone) is equal to item 1 of droneSeleccionado then
return drone
end if
end repeat
error "No se pudo encontrar el drone seleccionado en la lista."
end seleccionarDrone
-- Función para rellenar los campos del UAS
on rellenarCamposUAS(drone)
rellenarCampo("nomFabricanteRpa", fabricante of drone)
rellenarCampo("codModeloRpa", (characters 1 thru 4 of codModelo of drone))
rellenarCampo("desModeloRpa", desModelo of drone)
rellenarCampo("numSerieRpa", numeroSerie of drone)
rellenarCampo("mtomRpa_input", MTOM of drone)
rellenarCampo("mtomRpa_hinput", MTOM of drone)
rellenarCampo("autonomiaRpa_hinput", autonomia of drone)
rellenarCampo("autonomiaRpa_input", autonomia of drone)
rellenarCampo("bandaRpa", banda of drone)
rellenarCampo("colorRpa", color of drone)
rellenarCampo("lucesRpa", luces of drone)
rellenarCampo("cargaRpa", carga of drone)
rellenarCampo("vhfRpa", VHF of drone)
rellenarCampo("eqEmergenciaRpa", equipoEmergencia of drone)
rellenarCampo("visionRpa", vision of drone)
end rellenarCamposUAS
-- Función para seleccionar un piloto
on seleccionarPiloto()
global listaPilotos
if listaPilotos is {} then
error "La lista de pilotos está vacía."
end if
set opciones to {}
repeat with piloto in listaPilotos
set end of opciones to ((nombre of piloto) & " " & (apellido of piloto))
end repeat
set pilotoSeleccionado to choose from list opciones with prompt "Selecciona el piloto para rellenar el formulario:" default items {item 1 of opciones}
if pilotoSeleccionado is false then
error "No se seleccionó ningún piloto."
end if
repeat with piloto in listaPilotos
if ((nombre of piloto) & " " & (apellido of piloto)) is equal to item 1 of pilotoSeleccionado then
return piloto
end if
end repeat
error "No se pudo encontrar el piloto seleccionado en la lista."
end seleccionarPiloto
-- Función para rellenar los campos del piloto
on rellenarCamposPiloto(piloto)
rellenarCampo("nombreRazonPILOTO", nombre of piloto)
rellenarCampo("apellido1PILOTO", apellido of piloto)
rellenarCampo("documentoPILOTO", DNI of piloto)
rellenarCampo("desCertCompetPil", competencia of piloto)
rellenarCampo("desCertFormacionPil", autopractica of piloto)
rellenarCampo("desCertSeguroPil", seguroClase of piloto)
rellenarCampo("entidadCertSeguroPil", seguroEntidad of piloto)
end rellenarCamposPiloto
-- Función principal para ejecutar el script
global delayEntrePaginas
try
-- Selección inicial de drone y piloto
set droneElegido to seleccionarDrone()
set pilotoElegido to seleccionarPiloto()
-- Página principal
buscaSafari()
apretaBoton(".botonGen")
-- Operador
delay delayEntrePaginas
enviarTecla("Tab", 0)
enviarTecla("Space", 0)
enviarTecla(operadorCalle, 0)
enviarTecla("Return", 7)
enviarTecla("Space", 0)
enviarTecla(operadorProvincia, 0)
enviarTecla("Return", 1)
enviarTecla("Space", 0)
enviarTecla(operadorLocalidad, 0)
enviarTecla("Return", 1)
rellenarCampo("viaOPERADOR", operadorDireccion)
rellenarCampo("numeroOPERADOR", operadorNumero)
rellenarCampo("portalOPERADOR", operadorPortal)
rellenarCampo("codPostalOPERADOR", operadorCodigoPostal)
rellenarCampo("emailOPERADOR", operadorEmail)
rellenarCampo("codigoOp", operadorRegistro)
apretaBoton(".btnSig")
-- Piloto
delay delayEntrePaginas
rellenarCamposPiloto(pilotoElegido)
-- Introducir fecha de caducidad del seguro manualmente
display dialog "Introduce la fecha de caducidad del seguro manualmente y pulsa 'Continuar'..." buttons {"Cancelar", "Continuar"} default button "Continuar" cancel button "Cancelar"
buscaSafari()
apretaBoton(".btnSig")
-- UAS
delay delayEntrePaginas
enviarTecla("Tab", 2)
enviarTecla("Space", 0)
enviarTecla(tipo of droneElegido, 0)
enviarTecla("Return", 1)
rellenarCamposUAS(droneElegido)
apretaBoton(".btnSig")
-- Observadores
delay delayEntrePaginas
apretaBoton(".btnSig")
-- Operacion
display dialog "Script finalizado, continua rellenando el formulario de forma manual. Buen vuelo!"
on error errMsg
display dialog "Error en la ejecución del script: " & errMsg buttons {"OK"} default button "OK"
end try
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment