Mit AutoIt Wert aus HTML Tabelle auslesen und verarbeiten

  • Kurz: Ich möchte: IP-Statistik in unserem LAN mit Internet Explorer aufrufen,
    verbrauchtes Volumen für Internettraffic auslesen
    Nachrichtenbox soll ab bestimmtem Wert warnen
    am Besten in einer Schleife jede Stunde.

    Hallo zusammen, ich hoffe ich habs hier richtig platziert.
    In meinem Netzwerk ist für jeden Benutzer ein Traffic-Limit für das Internet vergeben.
    Um nicht aus versehen, das Limit zu überschreiten, möchte ich ein Programm schreiben, dass automatisch jede Stunde über eine Internetadresse (LAN) eine Statistik ausliest, den Gesamttraffic aus der Tabelle (1.141889) mit einem Schwellenwert vergleicht und ab diesem bestimmten Wert (z.B. 1800 Mb) eine Warnung ausgibt.

    Ich bin leider Anfänger, habe daher leider keine Ahnung, wie man dieses Script umschreibt, dass es nicht die Formularfelder zählt, sondern die Tabellenzellen.
    Vielen Dank für Eure Hilfe!

    Liebe Grüße!

    Vielleicht eine Kombination aus:
    #include <IE.au3>
    $oIE = _IE_Example ("table")
    $oTable = _IETableGetCollection ($oIE, 1)
    $aTableData = _IETableWriteToArray ($oTable)

    und:

    Spoiler anzeigen

    #include <ie.au3>
    ;Einfaches Beispiel für das Anmelden an Webseiten mit Benutzer und Passwort am Beispiel des Autoit.de-Forums
    ;Autoit-Version:3.2

    ;Erstellt eine Instanz (neues Fenster) des InternetExplorers und gibt ein entsprechendes Objekt zurück.
    $oIE = _IECreate ("http://www.autoit.de/portal.php")
    ;Prüfen ob ein Objekt erzeugt wurde
    If IsObj($oIE) Then
    ;warten bis die Seite komplett geladen wurde
    _IELoadWait($oIE)
    ;Erzeugen eines HTML-Formular-Objekts mit Hilfe des Index
    ;In diesem Beispiel ist das gesuchte Formular, das fünfte in der Webseite.
    $oForm = _IEFormGetCollection ( $oIE, 4 )
    ;Erzeugen eines Formularfeld-Objekts mit Hilfe des Index
    ;In diesem Beispiel muss Index 2 verwendet werden, da zwei versteckte Felder index 0 und 1 belegen.
    $oUsername = _IEFormElementGetCollection ( $oForm, 2)
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oUsername, "Benutzer")
    ;Erzeugen eines Formularfeld-Objekts mit Hilfe des Index
    $oPasswd = _IEFormElementGetCollection ( $oForm, 3)
    ;Setzen des Formularfeldinhalts
    _IEFormElementSetValue($oPasswd, "Password")
    ;Absenden des Formulars
    _IEFormSubmit($oForm)

    ;wenn kein Objekt erzeugt wurde, Fehlermeldung ausgeben.
    Else
    ;Detailierte Fehlerbehandlung überlasse ich einem separaten Tutorial ;)
    MsgBox(48,"Erstellen des IE-Objekts fehlgeschlagen","Es konnte keine neue InternetExplorer-Instanz erzeugt werden!")
    EndIf
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    Die Statistik ist nur intern abrufbar unter http://statistik.xxxxx.de/monatsstat.php und sieht so aus:

    Spoiler anzeigen

    Einmal editiert, zuletzt von Poloshirt (27. November 2008 um 05:19)

    • Offizieller Beitrag

    Hiermit liest du die Tabelle in ein Array aus, das dann identisch, wie die Tabelle ist.
    Kannst dann die gewünschten Werte aus den Arrayelementen abfragen und vergleichen.

    [autoit]

    #include <IE.au3>
    #include <array.au3>
    Local $url = 'http://statistik.xxxxx.de/monatsstat.php'
    Local $oIE = _IECreate($url, 0, 0)
    Local $oTable = _IETableGetCollection($oIE, 0)
    Local $array = _IETableWriteToArray($oTable, True)
    _ArrayDisplay($array)
    _IEQuit($oIE)

    [/autoit]
  • Vielen Dank schonmal für die schnelle Hilfe!

    Ich habe jetzt folgendes draus gemacht. Nur funktioniert leider nicht die neue Abfrage,
    es wird immer ausgegeben, dass das Limit noch nicht überschritten ist, obwohl der Traffic zu hoch ist.
    Irgendeine Idee, woran das liegt? ?(

    [autoit]

    ; Trafficlimit-Projekt
    #include <IE.au3>
    #include <array.au3>
    Local $url = 'http://statistik.uni-trier.de/monatsstat.php'
    Local $oIE = _IECreate($url, 0, 0)
    Local $oTable = _IETableGetCollection($oIE, 0)
    Local $array = _IETableWriteToArray($oTable, True) ; liest Tabelle in einen 2D-Array
    ;_ArrayDisplay($array) ; gibt Array auf dem Bildschirm aus -> Messagebox einfügen!
    $traffic = $array[3][2] ;soll Gesamttraffic anzeigen: 4.Zeile (Zählung beginnt mit 0, 2.Spalte
    $schwellenwert = 1.000000
    If $traffic > $schwellenwert Then
    MsgBox(0, "Gesamttraffic", "Limitüberschreitung" & $traffic) ;Vergleichsfunktion mit Schwellenwert
    ElseIf $traffic <= $schwellenwert Then
    MsgBox(0, "Gesamttraffic", "Das Limit wurde noch nicht überschritten. Zur Information: Der verbrauchte Traffic beträgt:" & $traffic)
    EndIf
    _IEQuit($oIE) ; schließt IE

    [/autoit]

    Inhalt des Arrays:
    [0]| |Rang |GB Gesamt |GB gesendet |GB empfangen
    [1]|Verbindungen ins Internet |1062 |1.348149 |0.098122 |1.250027
    [2]|Verbindungen über den Proxy |0 |0.000000 |0.000000 |0.000000
    [3]|Gesamt |1254 |1.348149 |0.098122 |1.250027

  • Also bei mir funktioniert das Script soweit ich es testen kann.
    Zeigt denn die Messagebox den richtigen Trafficwert an ?


    EDIT
    Ah gerade gesehen im Array steht noch ein Leerzeichen am Ende der Zelle, also

    [autoit]

    $traffic = $array[3][2] ;soll Gesamttraffic anzeigen: 4.Zeile (Zählung beginnt mit 0, 2.Spalte
    $traffic = StringStripWS ( $traffic, 2 )

    [/autoit]


    und es sollte funktionieren

  • So: das ist meine neue Version.
    Leider klappts nicht so ganz, wie ich mir das vorgestellt hatte:
    Immer wenn ich eine Warnung ausgegeben habe, in Form einer messagebox, dann pausiert die Skriptabarbeitung.
    Wie könnte man den Code ändern, damit das Programm weiterläuft, ohne darauf zu warten, dass der Benutzer die Meldung wegklickt? Außerdem werden alle Meldungen angezeigt, wenn ich über den Exitbutton im Traymenü das Programm verlassen will, man befindet sich quasi in einer Endlosschleife. Ich verstehe irgendwie nicht, warum nicht aus der While schleife rausgesprungen wird...
    Wäre echt toll, wenn Sie noch einmal einen Blick drauf werfen könnten...
    Vielen Dank im Voraus
    LG Poloshirt

    [autoit]

    #cs => um mehrere Zeilen auszukommentieren
    Trafficlimit-Projekt
    #ce

    [/autoit][autoit][/autoit][autoit]

    #include <IE.au3>
    #include <array.au3>
    #Include <Constants.au3>

    [/autoit][autoit][/autoit][autoit]

    Local $schwellenwert = 1.980000
    $Uhrzeit = @HOUR & ":" & @MIN & ":" & @SEC & "Uhr"

    Traymenue () ; führt den Menüteil zum Traysymbol aus (NOTAUS)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Funktion die die Traffic ausliest und Meldung ausgibt
    Local $url = 'http://statistik.uni-trier.de/monatsstat.php'
    Local $oIE = _IECreate($url, 0, 0)
    Local $oTable = _IETableGetCollection($oIE, 0)
    Local $array = _IETableWriteToArray($oTable, True) ; liest Tabelle in einen 2D-Array

    ;_ArrayDisplay($array) ; gibt Array auf dem Bildschirm aus -> zum Test

    [/autoit][autoit][/autoit][autoit]

    $traffic = $array[3][2] ;soll Gesamttraffic anzeigen: 4.Zeile (Zählung beginnt mit 0, 2.Spalte
    $traffic = StringStripWS ( $traffic, 2 ) ;entfernt Leerzeichen u.ä. am Anfang und Ende von $traffic (führt sonst zu Überspringen von if-Abfrage)
    _IEQuit($oIE) ; schließt IE

    [/autoit][autoit][/autoit][autoit]

    Ueberwachung ()

    [/autoit][autoit][/autoit][autoit]

    Exit

    [/autoit][autoit][/autoit][autoit]

    ;hier folgt das Tray-Menue

    [/autoit][autoit][/autoit][autoit]

    Func Traymenue ()

    Opt("TrayMenuMode",1) ; 1 will hide Default tray menu items (Script Paused/Exit) will not be shown.

    [/autoit][autoit][/autoit][autoit]

    ;$settingsitem = TrayCreateMenu("Settings") ; => die Untermenü-Wurzel
    ;$displayitem = TrayCreateItem("Display", $settingsitem)
    ;$printeritem = TrayCreateItem("Printer", $settingsitem)
    TrayCreateItem("")
    $settingsitem = TrayCreateItem("Einstellungen")
    TrayCreateItem("")
    $checkitem = TrayCreateItem("Traffic sofort überprüfen")
    TrayCreateItem("")
    $aboutitem = TrayCreateItem("Über")
    TrayCreateItem("")
    $exititem = TrayCreateItem("Beenden")

    [/autoit][autoit][/autoit][autoit]

    TraySetState()

    [/autoit][autoit][/autoit][autoit]

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = 0
    ContinueLoop
    Case $msg = $settingsitem
    Case $msg = $checkitem
    check ()
    Case $msg = $aboutitem
    Msgbox(64,"About:","Copyright (c) MM")
    Case $msg = $exititem
    Exit
    EndSelect
    WEnd
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Fehler ()
    MsgBox(64, "Fehler", "Ein Fehler ist aufgetreten.")
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Info ()
    MsgBox(48, "Internetkontingent-Information " & $Uhrzeit, "Aktuell sind: " & $traffic & " Gbyte verbraucht")
    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Ueberschreitung ()
    MsgBox(16, "Achtung: Kontingent erschöpft! " & $Uhrzeit, "Das Internetkontingent wurde erreicht." & @CR & @CR & _
    "Aktuell: " & $traffic & " Gbyte" & @CR & "Das Netzwerkkabel ziehen wäre jetzt die einfachste Lösung ;-)")
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Ueberwachung () ; ruft UDF=User defined function auf mit Namen Ueberwachung

    [/autoit][autoit][/autoit][autoit]

    func Ueberwachung ()
    Local $grenze1 = 1.500000 ;hier die variablen definieren,
    Local $grenze2 = 1.800000 ;Local gilt hier nur als defaultwert, kann mit global über menü überschrieben werden
    Local $grenze3 = 1.900000
    Local $sleeptime1 = 3600000 ; 1000 = 1 Sekunde => 3600000 = 60 Min
    Local $sleeptime2 = 1800000 ; = 30 Min
    Local $sleeptime3 = 300000 ;5 Min

    While 1 ;Endlosschleife, das Programm terminiert somit erst beim Abmelden und läuft stetig im Hintergrund
    Select
    Case $traffic < $grenze1
    Info ()
    Sleep ($sleeptime1)
    Case $traffic >= $grenze1 < $grenze2
    Info ()
    Sleep ($sleeptime2)
    Case $traffic >= $grenze3 < $schwellenwert
    Info ()
    Sleep ($sleeptime3)
    Case $traffic >= $schwellenwert
    Ueberschreitung ()
    Case Else
    Fehler()
    Exit
    EndSelect

    WEnd

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit][autoit][/autoit][autoit]

    Func Check() ;Funktion die einmal den Traffic ausliest

    Local $url = 'http://statistik.uni-trier.de/monatsstat.php'
    Local $oIE = _IECreate($url, 0, 0)
    Local $oTable = _IETableGetCollection($oIE, 0)
    Local $array = _IETableWriteToArray($oTable, True) ; liest Tabelle in einen 2D-Array
    ;_ArrayDisplay($array) ; gibt Array auf dem Bildschirm aus -> Messagebox einfügen!
    $traffic = $array[3][2] ;soll Gesamttraffic anzeigen: 4.Zeile (Zählung beginnt mit 0, 2.Spalte
    $traffic = StringStripWS ( $traffic, 2 ) ;entfernt Leerzeichen u.ä. am Anfang und Ende von $traffic (führt sonst zu Überspringen von if-Abfrage)
    _IEQuit($oIE) ; schließt IE

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Dein Skript ist vom logischen Ablauf falsch.
    Du hast zwei Endlosschleifen, verwendest Sleep - da läuft nichts richtig zusammen. Auch deine Statements mußt du dringend auf Syntax prüfen (z.B.: $traffic >= $grenze3 < $schwellenwert).
    Du willst die Uhrzeit in eine Nachricht einfügen - die Zeit liest du aber einmalig am Skriptanfang in eine Variable.
    Dein Ablauf sollte in etwas folgendermaßen sein (Tray erst al ganz rauslassen, bring das Grundkonzept zum Laufen, dann kannst du erweitern):
    - Hauptprogramm ist Überwachung und läuft in Endlosschleife
    - Aber NICHT innerhalb einer Funktion!
    - Verwende kein Sleep (in der Zeit rührt sich das Programm nicht!), sondern TimerInit / TimerDiff (den Sinn der Sleeps kann ich auch nicht erkennen - oder soll damit der nächste Prüfzeitpunkt festgelegt werden?)
    - Überprüfe intervallmäßig den Traffic (UDF aufrufen, aber besser mit Return $traffic in der UDF)
    - wenn du Tray einfügen willst, dann auch NICHT in einer Funktion, sondern in der existierenden Schleife - es kann in einem Skript NUR eine Endlosschleife laufen