Last active
August 9, 2024 13:55
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- | |
-- 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