3 votes

Comment écrire un AppleScript qui télécharge le statut du réseau Wi-Fi à partir de l'interface web du routeur ?

Objectifs :

Je veux créer un fichier AppleScript .scpt qui fait ce qui suit :

  1. Permet d'accéder à la page Web d'un routeur (c'est-à-dire à son adresse IP).

  2. À partir de cette page Web, obtenez les adresses IP qui sont actuellement connectées aux deux réseaux. (Par "les deux réseaux", je fais référence aux réseaux sans fil 2.4Ghz et 5.0Ghz séparés).

  3. À partir de la page Web, obtenez les intensités de signal Dbm respectives de chaque dispositif connecté (c'est-à-dire chaque adresse IP connectée).


Mise en œuvre :

Je veux un AppleScript list pour contenir toutes les adresses IP :

  • Par exemple : theListOfIPs contient {"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"} .

(Je n'ai pas besoin de faire la différence entre les IP qui sont connectées au réseau 2.4GHz et celles qui sont connectées au réseau 5.0GHz. Toutes les IPs doivent simplement être contenues dans theListOfIPs .)

Et, un AppleScript list pour contenir leurs forces de signal correspondantes :

  • Par exemple : theListOfTheirSignalStrengths contient {"0", "-75", "-40", "0", "0", "-63", "-72"} .

Notes :

  • J'aimerais que tout cela soit réalisé "en coulisses". La discrétion est vraiment la clé, car le script devra vérifier périodiquement le site web du routeur pour les mises à jour du réseau.

  • Enfin, les modifications de l'état du réseau seront enregistrées dans un fichier journal .txt et une notification d'alerte sera affichée lorsque certaines conditions seront remplies. Je sais comment coder ces composants ; j'ai besoin d'aide pour importer réellement les données dans le script.

  • Navigateur de choix : Google Chrome


Le contexte :

J'ai utilisé la commande shell , curl auparavant, afin d'importer le code source HTML intégral d'un site web donné dans un AppleScript, sous forme de text objet. Je comprends que, malheureusement, il n'est pas possible d'intégrer de manière similaire ou pratique tous les éléments JavaScript dans un AppleScript sous la forme d'un seul objet texte.

Au lieu de cela, il faut récupérer chaque élément JavaScript individuellement, par un identifiant quelconque, comme son id , class , tag ou name . Cela rend les choses plus compliquées (parce que vous ne pouvez pas simplement tout analyser en AppleScript).

En utilisant la fonction Inspect et la fonction Elements panneau de la console JavaScript de Chrome, j'ai déterminé les identifiants JavaScript pertinents. Les deux identifiants d'éléments JavaScript qui contiennent toutes les adresses IP, ainsi que la puissance de leur signal, sont wifi-24 y wifi-5 .

Quelqu'un peut-il m'apprendre à écrire correctement le code JavaScript nécessaire, puis à analyser le texte HTML résultant, afin d'isoler les données de base du réseau que je souhaite ?


3voto

user3439894 Points 52496

Sur la base des discussions qui ont eu lieu, cela devrait répondre à la portée initiale de la question.

Note : Ceci est un exemple code et ne contient pas beaucoup, voire pas du tout, de gestion des erreurs. Je vous laisse faire puisque ce n'est qu'une partie du script global, une fois que vous avez assemblé tous les autres morceaux.

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

Je dois dire qu'en général, on n'est pas censé analyser le HTML avec des outils tels que grep y sed Cependant, pour certaines pages, comme dans ce cas d'utilisation, il est assez sûr de le faire. En revanche, s'il se casse, il n'est pas difficile à réparer.

0voto

MmmHmm Points 2463
  1. Allez sur la page web dans le navigateur Chrome.
  2. Ouvrez le navigateur JavaScript de Dev Tools.
  3. Mettez ça dans la console et appuyez sur Entrée :

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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X