Wie schreibe ich ein AppleScript, das den Wi-Fi-Netzwerkstatus von der Weboberfläche des Routers herunterlädt?

Ziele:

Ich möchte eine AppleScript .scpt-Datei erstellen, die Folgendes tut:

  1. Greift auf die Webseite eines Routers zu (dh seine IP-Adresse).

  2. Ruft von dieser Webseite die IP-Adressen ab, die derzeit mit beiden Netzwerken verbunden sind. (Mit „beide Netzwerke“ beziehe ich mich auf die separaten drahtlosen 2,4-GHz- und 5,0-GHz-Netzwerke.)

  3. Ruft von der Webseite die jeweiligen DBM-Signalstärken jedes verbundenen Geräts (dh jeder verbundenen IP-Adresse) ab.


Implementierung:

Ich möchte, dass ein AppleScript- listObjekt alle IP-Adressen enthält:

  • Bsp.: theListOfIPsenthält {"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"}.

(Ich muss nicht zwischen den IPs unterscheiden, die mit dem 2,4-GHz-Netzwerk verbunden sind, und den IPs, die mit dem 5,0-GHz-Netzwerk verbunden sind. Alle IPs sollten einfach in enthalten sein. theListOfIPs)

Und ein AppleScript- listObjekt, das die entsprechenden Signalstärken enthält:

  • Bsp.: theListOfTheirSignalStrengthsenthält {"0", "-75", "-40", "0", "0", "-63", "-72"}.

Anmerkungen:

  • Ich möchte, dass all dies „hinter den Kulissen“ abgeschlossen wird. Unaufdringlichkeit ist wirklich der Schlüssel, da das Skript regelmäßig die Website des Routers auf Netzwerkaktualisierungen überprüfen muss.

  • Letztendlich werden Änderungen am Netzwerkstatus in eine .txt-Protokolldatei geschrieben und eine Warnmeldung wird angezeigt, wenn bestimmte Bedingungen erfüllt sind. Ich weiß, wie man diese Komponenten codiert; Ich brauche Hilfe beim Importieren der Daten in das Skript.

  • Browser der Wahl: Google Chrome


Hintergrund:

Ich habe zuvor den Shell-Befehl , curl, verwendet, um den ungekürzten HTML-Quellcode einer bestimmten Website als textObjekt in ein AppleScript zu importieren. Ich verstehe, dass man leider nicht alle JavaScript-Elemente auf ähnliche Weise oder bequem als einzelnes Textobjekt in ein AppleScript einfügen kann.

Stattdessen muss jedes einzelne JavaScript-Element einzeln durch einen Bezeichner wie id, class, tag, oder abgerufen werden name. Das macht die Sache komplizierter (weil Sie nicht einfach alles in AppleScript parsen können).

Mithilfe Inspectder Funktion von Chrome und des ElementsBereichs der JavaScript-Konsole von Chrome habe ich die relevanten JavaScript-Kennungen ermittelt. Die beiden JavaScript-Element-IDs, die alle IP-Adressen sowie deren Signalstärken enthalten, sind wifi-24und wifi-5.

Kann mir jemand beibringen, wie ich den erforderlichen JavaScript-Code richtig schreibe und dann den resultierenden HTML-Text parst, um die grundlegenden Netzwerkdaten zu isolieren, die ich möchte?


Das Problem ist, dass sich die gewünschte URL hinter einer Benutzername/Passwort-Seite befindet. Wenn ich die URL hier einfügen würde, wäre sie für Sie bedeutungslos.
Okay. Ich habe nicht nach einer maßgeschneiderten Lösung gefragt. Ich möchte nur wissen, ob dies überhaupt möglich ist, und wenn ja, eine allgemeine Vorstellung davon, wie man es angeht. Hier ist eine direktere Version meiner Frage: Ist es möglich, alle JavaScript-Elemente von einer Website zu entfernen? Ihr Kommentar lässt mich glauben, dass die Antwort auf diese Frage von Website zu Website erheblich variiert, aber ich verstehe nicht, warum die Antwort unterschiedlich sein sollte. Ist das nicht eine Ja/Nein-Frage?
Ihre Frage ist überall. Ja, es ist möglich. Ohne ein tatsächliches Beispiel für eine Website, die Sie am .js-Scraping interessiert, gibt es keinen Ansatz, der für alle Applescripts geeignet ist.
@Mr.Kennedy Können Sie mich in die richtige Richtung weisen, damit ich anfangen kann, etwas darüber zu lernen? Was ist der relevante Befehl, um dies zu erreichen? Ich weiß nicht, wo ich anfangen soll.
Um das ganze Javascript zu kratzen, müssen Sie lernen, wie HTML und Javascript zusammenarbeiten. Zeigen Sie den Quell-HTML an - suchen Sie nach den *.jsDateien. Dynamische Seiten zeigen mehr Probleme. Beginnen Sie mit einem einfachen und kleinen HTML/JS-Beispiel und erstellen Sie Ihr AppleScript. Finden Sie dann komplexere HTML/JS-Situationen heraus und entwickeln Sie Ihr Tool, um sie zu berücksichtigen.
Sehen Sie sich beispielsweise die Quelle dieser Webseite an. Suchen javascriptund .jsversuchen Sie herauszufinden, was alles im Skript vor sich geht. Wenn Sie neu in HTML sind ... nun, es ist kein Malen nach Zahlen.
@Mr.Kennedy Die URL ist die IP eines WLAN-Routers. Okay, aus dem HTML-Quellcode konnte ich die entsprechende .jsDatei finden. Hier ist der HTML-Quellcode. Hier ist der vollständige Text der entsprechenden .jsDatei. Die Daten, die ich letztendlich in mein AppleScript importieren möchte, sind jede device.ipAddressund ihre entsprechende wifiStrengthFigur (oder alternativ ihre entsprechende device.signalStrengthFigur).
Ich habe den relevanten Code aus dem JavaScript-Elementfenster von Chrome kopiert und diesen Text in TextEdit eingefügt, damit ich den Text einfärben kann, um besser zu demonstrieren, was ich möchte: Hier ist ein Screenshot. Der Text in Blau sind die Daten, die ich in mein AppleScript importieren möchte; Letztendlich benötige ich zwei, korrespondierende Listen in meinem AppleScript. In diesem Screenshot theListOfIPswürde enthalten {"192.168.1.9", "192.168.1.10"}und theListOfTheirSignalStrengthsenthalten {"0", "-75"}. (In Wirklichkeit enthält jede Liste mehr als zwei Elemente.)
@ user3439894 Keine Sorge, ich werde die Frage überarbeiten, damit sie klarer ist, wenn wir alle gesagt und getan haben. Können Sie sich bei Gelegenheit meinen Fehlerbehandlungsversuch für Ihren Code ansehen und ihn nach Belieben verbessern? Danke schön.
Sehr schöne Bearbeitung / Umschreibung der Frage. Wenn ich noch einmal +1 könnte, würde ich es tun! :) Ich werde versuchen, morgen das Update zu meiner Antwort hinzuzufügen, das behandelt, was in den do shell script Befehlen passiert und den HTML-Code analysiert.

Antworten (2)

Basierend auf den Diskussionen sollte dies den ursprünglichen Umfang der Frage behandeln.

Hinweis: Dies ist Beispielcode und enthält nicht viel, wenn überhaupt, Fehlerbehandlung. Das überlasse ich Ihnen, da dies nur ein Teil des gesamten Skripts ist, sobald Sie alle anderen Teile zusammengefügt haben.

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

grepIch muss sagen, dass man HTML im Allgemeinen nicht mit Tools wie und parsen sollte sed, aber für bestimmte Seiten, wie in diesem Anwendungsfall, ist es ziemlich sicher, dies zu tun. Wenn es jedoch kaputt geht, ist es nicht schwer zu reparieren.

Als ich Ihren Code in mein größeres Skript einfügte, erhielt ich den Fehler: Can’t make current application into type file.. Ich stellte fest, dass die folgende Zeile in meinem Skript für den Fehler verantwortlich war: use framework "Foundation". Nachdem ich Ihre Zeile (read POSIX file thisFile)in (read POSIX path of thisFile)oder einfach in geändert habe (read thisFile), funktioniert Ihr Code jetzt ohne Fehler ordnungsgemäß in meinem Skript.
Ja, deshalb habe ich gesagt "Hinweis: Dies ist Beispielcode ... ", denn wenn Sie den Code so nehmen und in ein neues Dokument im Skripteditor als einzigen Code im Skript kopieren, funktioniert es, aber wann Wenn man anfängt, Code aus anderen Quellen zu integrieren, gibt es zwangsläufig Probleme, die angegangen werden müssen.
Liegt es nur an mir oder sind die endgültigen Listenobjekte verschachtelte Versionen von sich selbst? Das heißt, wenn Sie return theIPAddressListoder wenn Sie return theSignalStrengthList, werden Sie sehen, dass item xjede Liste (wobei xein beliebiges Element der Liste ist) tatsächlich die gewünschte Liste selbst ist. Diese Besonderheit wird maskiert, wenn Sie verwenden choose from list, aber Sie können den wahren Listeninhalt sehen, wenn Sie verwenden return. Hier sind Screenshots .
@rubik's sphere, ich habe den Code geändert, um durch Kommas getrennte temporäre Dateien zu erstellen, und die Art und Weise, wie der Inhalt dieser Dateien in die gewünschten Listen umgewandelt wird.
Sie haben geschrieben: "Im Allgemeinen sollte man HTML nicht mit Tools wie grep und sed parsen." Können Sie erklären, warum das genau so ist? Was ist die Alternative zum Parsen von HTML-Text?
@rubiks Sphäre, ich werde in dem Update, das ich machen werde.
  1. Rufen Sie die Webseite im Chrome-Browser auf.
  2. Öffnen Sie den JavaScript-Browser der Dev Tools.
  3. Kleben Sie dies in die Konsole und drücken Sie die Eingabetaste:

 

$('script').each(function(){
    console.log($(this).html())
});
Ich habe diese Anweisungen befolgt. Worauf muss ich achten oder was ist der nächste Schritt? Danke schön.
Sie hätten es zumindest protokollieren können, anstatt zu alarmieren, das ist nur schmerzhaft.
@ Sirenen, bitte schön. Mein Hauptpunkt war zu zeigen, dass das OP in die falsche Richtung ging. Laut Chatroom-Gespräch haben sie einen besseren Weg gefunden.