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

3

Objectives:

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

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

  2. Desde esta página web, obtiene las direcciones IP que actualmente están conectadas a ambas redes. (Por "ambas redes", me refiero a las redes inalámbricas separadas de 2.4GHz y 5.0GHz).

  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).

Implementation:

Quiero que un objeto AppleScript list contenga 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 IP que están conectadas a la red de 2.4GHz y las IP que están conectadas a la red de 5.0GHz. Todas las IP simplemente deben estar contenidas en theListOfIPs .)

Y, un objeto AppleScript list que contenga sus potencias de señal correspondientes:

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

Notas:

  • Me gustaría que todo esto se complete "detrás de escena". La falta de atención es realmente clave, ya que el script deberá revisar periódicamente el sitio web del enrutador para obtener actualizaciones de la red.

  • En última instancia, 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 realmente los datos al script.

  • Navegador preferido: Google Chrome

Background:

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

En su lugar, uno debe obtener cada elemento de JavaScript individualmente, por algún identificador, como id , class , tag o name . Esto hace que las cosas sean más complicadas (porque no puede simplemente analizar todo en AppleScript).

Al utilizar la función Inspeccionar de Chrome y la función Elements panel de la consola de JavaScript de Chrome, he determinado los identificadores de JavaScript relevantes. Los dos ID de elementos de JavaScript que contienen todas las direcciones IP, así como sus intensidades 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 de red básicos que deseo?

pregunta rubik's sphere 12.08.2017 - 23:01

2 respuestas

3

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

Nota: Este es un ejemplo de código y no contiene mucho, si lo hay, manejo de errores. Te lo dejaré ya que esto es solo una parte del guión general, una vez que hayas juntado 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, se supone que uno no debe analizar 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.

    
respondido por el user3439894 14.08.2017 - 05:04
0
  1. Vaya a la página web en el navegador Chrome.
  2. Abra el navegador de JavaScript de las herramientas de desarrollo.
  3. Pega esto en la consola y pulsa enter:

$('script').each(function(){
    console.log($(this).html())
});
    
respondido por el Mr. Kennedy 13.08.2017 - 03:10

Lea otras preguntas en las etiquetas