Ich möchte eine AppleScript .scpt-Datei erstellen, die Folgendes tut:
Greift auf die Webseite eines Routers zu (dh seine IP-Adresse).
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.)
Ruft von der Webseite die jeweiligen DBM-Signalstärken jedes verbundenen Geräts (dh jeder verbundenen IP-Adresse) ab.
Ich möchte, dass ein AppleScript- list
Objekt alle IP-Adressen enthält:
theListOfIPs
enthä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- list
Objekt, das die entsprechenden Signalstärken enthält:
theListOfTheirSignalStrengths
enthält {"0", "-75", "-40", "0", "0", "-63", "-72"}
.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
Ich habe zuvor den Shell-Befehl , curl
, verwendet, um den ungekürzten HTML-Quellcode einer bestimmten Website als text
Objekt 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-24
und 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?
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
-- #
-- #########################################
grep
Ich 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.
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.return theIPAddressList
oder wenn Sie return theSignalStrengthList
, werden Sie sehen, dass item x
jede Liste (wobei x
ein 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 .
$('script').each(function(){
console.log($(this).html())
});
Rubiks Sphäre
Rubiks Sphäre
Mmmhmm
Rubiks Sphäre
Mmmhmm
*.js
Dateien. 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.Mmmhmm
javascript
und.js
versuchen Sie herauszufinden, was alles im Skript vor sich geht. Wenn Sie neu in HTML sind ... nun, es ist kein Malen nach Zahlen.Rubiks Sphäre
.js
Datei finden. Hier ist der HTML-Quellcode. Hier ist der vollständige Text der entsprechenden.js
Datei. Die Daten, die ich letztendlich in mein AppleScript importieren möchte, sind jededevice.ipAddress
und ihre entsprechendewifiStrength
Figur (oder alternativ ihre entsprechendedevice.signalStrength
Figur).Rubiks Sphäre
theListOfIPs
würde enthalten{"192.168.1.9", "192.168.1.10"}
undtheListOfTheirSignalStrengths
enthalten{"0", "-75"}
. (In Wirklichkeit enthält jede Liste mehr als zwei Elemente.)Mmmhmm
Rubiks Sphäre
Benutzer3439894
do shell script
Befehlen passiert und den HTML-Code analysiert.