1 votos

¿Cómo escribir un AppleScript que descargue el estado de la red Wi-Fi desde la interfaz web del router?

Objetivos:

Quiero crear un archivo AppleScript .scpt que haga lo siguiente:

  1. Accede a la página web de un router (es decir, a su dirección IP).

  2. Desde esta página web, obtiene las direcciones IP que están actualmente conectadas a ambas redes. (Por "ambas redes", me refiero a las redes inalámbricas de 2,4Ghz y 5,0Ghz por separado).

  3. Desde la página web, obtiene las respectivas intensidades de señal Dbm de cada dispositivo conectado (es decir, cada dirección IP conectada).


La puesta en práctica:

Quiero un AppleScript list para contener todas las direcciones IP:

  • Por ejemplo: theListOfIPs contiene {"192.168.0.1", "192.168.0.", "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6.", "192.168.0.7"} .

(No tengo la necesidad de diferenciar entre las IPs que están conectadas a la red de 2.4GHz y las IPs que están conectadas a la red de 5.0GHz. Todas las IPs deben estar simplemente contenidas en theListOfIPs .)

Y, un AppleScript list para contener sus correspondientes intensidades de señal:

  • Por ejemplo: theListOfTheirSignalStrengths contiene {"0", "-75", "-40", "0", "0", "-63", "-72"} .

Notas:

  • Me gustaría que todo esto se completara "entre bastidores". La discreción es realmente clave, porque el script</strkeep><strkeep> tendrá que comprobar periódicamente el sitio web del router para las actualizaciones de la red.

  • Finalmente, los cambios en el estado de la red se escribirán en un archivo de registro .txt, y se mostrará una notificación de alerta, cuando se cumplan ciertas condiciones. Sé cómo codificar estos componentes; necesito ayuda para importar los datos en el script.

  • Navegador de elección: Google Chrome


Antecedentes:

He utilizado el comando shell , curl Antes, para importar el código fuente HTML no abreviado de un determinado sitio web a un AppleScript, como text objeto. Entiendo que, lamentablemente, no se pueden introducir de forma similar o conveniente todos los elementos de JavaScript en un AppleScript como un único objeto de texto.

En cambio, hay que obtener todos y cada uno de los elementos de JavaScript individualmente, por algún identificador, como su id , class , tag o name . Esto hace las cosas más complicadas (porque no se puede simplemente analizar todo en AppleScript).

Utilizando la función de Chrome Inspect y la función Elements panel de la consola JavaScript de Chrome, he determinado los identificadores JavaScript relevantes. Los dos identificadores de elementos JavaScript que contienen todas las direcciones IP, así como su intensidad de señal, son wifi-24 y wifi-5 .

¿Puede alguien enseñarme a escribir correctamente el código JavaScript necesario, y luego analizar el texto HTML resultante, para aislar los datos básicos de la red que deseo?


3voto

user3439894 Puntos 5883

En base a las discusiones mantenidas, esto debería manejar el alcance original de la pregunta.

Nota: Este es un ejemplo código y no contiene mucho, si es que hay algún, manejo de errores. Te lo dejaré a ti, ya que esto es sólo una parte del conjunto del script, una vez que se juntan todas las demás piezas.

--  # 
--  #   Get the target information from theTargetURL in Google Chrome.
--  #   
--  #   Do this in the background, so get the 'tab id' and 'window id' of
--  #   the target URL ('theTargetURL') if it exists, and process accordingly. 

set theTargetURL to "http://192.168.1.1/0.1/gui/#/"

tell application "Google Chrome"
    if running then
        set theWindowList to every window
        repeat with thisWindow in theWindowList
            set theTabList to every tab of thisWindow
            repeat with thisTab in theTabList
                if theTargetURL is equal to (URL of thisTab as string) then

                    --  #   Get the targeted content of the web page which contains the information.
                    --  #   Note that document.getElementById(elementID) can only query one
                    --  #   element at a time, therefore call it twice, once with each elementID.

                    set rawWiFi24HTML to thisTab execute javascript "document.getElementById('wifi-24').innerHTML;"
                    set rawWiFi5HTML to thisTab execute javascript "document.getElementById('wifi-5').innerHTML;"

                    tell current application

                        --  #   Process the 'rawWiFi24HTML' and 'rawWiFi5HTML' variables.
                        --  #   Setup some temporary files to handle the processing.

                        set rawHTML to "/tmp/rawHTML.tmp"
                        set rawIP to "/tmp/rawIP.tmp"
                        set rawDBM to "/tmp/rawDBM.tmp"

                        --  #   Combine the value of  the'rawWiFi24HTML' and 'rawWiFi5HTML' variables into the 'rawHTML' temporary file.

                        do shell script "echo " & quoted form of rawWiFi24HTML & " > " & rawHTML & "; echo " & quoted form of rawWiFi5HTML & " >> " & rawHTML

                        --  # Process the 'rawHTML' into the 'rawIP' and 'rawDBM' temporary files.
                        --  # These files will contain comma delimited content of the targeted info.

                        do shell script "grep 'IP:' " & rawHTML & " | sed -e 's:</span>.*$::g' -e 's:^.*>::g' | tr '\\12' ',' > " & rawIP & "; grep 'device.parsedSignalStrength' " & rawHTML & " | sed -e 's: dBM.*$::g' -e 's:^.*\"::g' | tr '\\12' ',' > " & rawDBM

                        -- Process 'rawIP' and 'rawDBM' temporary files into 'theIPAddressList' and 'theSignalStrengthList' lists.

                        set theIPAddressList to my makeListFromCSVFile(rawIP)
                        set theSignalStrengthList to my makeListFromCSVFile(rawDBM)

                        --  #   Clean up, remove temporary files.

                        do shell script "rm /tmp/raw*.tmp"

                    end tell

                end if
            end repeat
        end repeat
    end if
end tell

--  # Handler used to create a list from a CSV file.

on makeListFromCSVFile(thisFile)
    set thisFilesContents to (read thisFile)
    set AppleScript's text item delimiters to {","}
    set thisList to items 1 thru -2 of text items of thisFilesContents as list
    set AppleScript's text item delimiters to {}
    return thisList
end makeListFromCSVFile

--  #########################################
--  #   
--  #   Checking the output of the code:
--  #   
--  #   The following commands are here just to show the contents
--  #   of the two lists displayed in a default list box, and then a way 
--  #   both lists might be combined, the output of which is logged.
--  #   
--  #   This of course can be removed after testing is finished.
--  #   
tell current application
    --  #
    choose from list theIPAddressList & theSignalStrengthList
    --  #
    repeat with i from 1 to (count of theIPAddressList)
        log "IP: " & item i of theIPAddressList & " @ " & item i of theSignalStrengthList & " Dbm"
    end repeat
    --  #
end tell
--  #   
--  #########################################

Tengo que decir que, en general, no se supone que uno analice el HTML con herramientas como grep y sed Sin embargo, para ciertas páginas, como en este caso de uso, es bastante seguro hacerlo. Aunque, si se rompe, no es difícil de arreglar.

0voto

Mr. Kennedy Puntos 146
  1. Vaya a la página web en el navegador Chrome.
  2. Abra el navegador de JavaScript de Dev Tools.
  3. Mete esto en la consola y dale a enter:

    $('script').each(function(){ console.log($(this).html()) });

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X