Come scrivere un AppleScript che scarica lo stato della rete Wi-Fi dall'interfaccia web del router?

3

Obiettivi:

Voglio creare un file .scpt di AppleScript che faccia quanto segue:

  1. Accede alla pagina Web di un router (ad es. il suo indirizzo IP).

  2. Da questa pagina Web, ottiene gli indirizzi IP attualmente connessi a entrambe le reti. (Con "entrambe le reti", mi riferisco alle reti wireless 2.4Ghz e 5.0Ghz separate.)

  3. Dalla pagina web, ottiene i rispettivi punti di forza del segnale Dbm di ciascun dispositivo connesso (ad esempio, ogni indirizzo IP collegato).

Implementazione:

Voglio un oggetto AppleScript list per contenere tutti gli indirizzi IP:

  • E.g .: 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"} .

(Non ho bisogno di distinguere tra gli IP che sono connessi alla rete da 2,4 GHz e gli IP che sono connessi alla rete da 5,0 GHz. Tutti gli IP dovrebbero semplicemente essere contenuti in theListOfIPs .)

E, un oggetto AppleScript list per contenere i rispettivi punti di forza del segnale:

  • E.g .: theListOfTheirSignalStrengths contiene {"0", "-75", "-40", "0", "0", "-63", "-72"} .

Note:

  • Vorrei che tutto questo fosse completato "dietro le quinte". L'indiscussa è davvero la chiave, perché lo script dovrà controllare periodicamente il sito Web del router per gli aggiornamenti di rete.

  • In definitiva, le modifiche allo stato della rete verranno scritte in un file di registro .txt e verrà visualizzata una notifica di avviso quando vengono soddisfatte determinate condizioni. So come codificare questi componenti; Ho bisogno di aiuto per importare i dati nello script.

  • Browser di scelta: Google Chrome

Sfondo:

Ho usato il comando shell, curl , prima, per importare il codice sorgente HTML completo di un determinato sito Web in un AppleScript, come oggetto text . Capisco che, purtroppo, non è possibile ottenere in modo simile o conveniente tutti gli elementi JavaScript in un AppleScript come un singolo oggetto di testo.

Invece, è necessario ottenere ogni singolo elemento JavaScript singolarmente, tramite un identificatore, come id , class , tag o name . Ciò rende le cose più complicate (perché non puoi semplicemente analizzare tutto in AppleScript).

Usando la funzione Ispeziona di Chrome e Elementi riquadro della console JavaScript di Chrome, ho determinato gli identificatori JavaScript pertinenti. I due ID elemento JavaScript che contengono tutti gli indirizzi IP, nonché i relativi punti di forza del segnale, sono wifi-24 e wifi-5 .

Qualcuno può insegnarmi come scrivere correttamente il codice JavaScript necessario e poi analizzare il testo HTML risultante, per isolare i dati di rete di base che desidero?

posta rubik's sphere 12.08.2017 - 23:01
fonte

2 risposte

3

In base alle discussioni, questo dovrebbe gestire l'ambito originale della domanda.

Nota: questo è code di esempio e non contiene molta, se non nessuna, gestione degli errori. Ti lascio questo dato che questa è solo una parte della sceneggiatura generale, una volta che hai unito tutti gli altri pezzi.

--  # 
--  #   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
--  #   
--  #########################################

Devo dire che, in generale, non si deve analizzare l'HTML con strumenti come grep e sed , tuttavia, per certe pagine, come in questo caso d'uso, è abbastanza sicuro da fare. Anche se, se si rompe, non è difficile da risolvere.

    
risposta data 14.08.2017 - 05:04
fonte
0
  1. Vai alla pagina web nel browser Chrome.
  2. Apri il browser JavaScript di Dev Tools.
  3. Attaccalo nella console e premi invio:

$('script').each(function(){
    console.log($(this).html())
});
    
risposta data 13.08.2017 - 03:10
fonte

Leggi altre domande sui tag