Benachrichtigung bei Sonderangeboten

  • Morgen ;)

    Ich habe öfters das Problem, dass ich bei ZackZack oder ähnlichem vorbeischaue, und einen ausnahmsweise nützlichen Artikel verpasst habe.
    Damit mir das nicht mehr passiert, habe ich mir einen kleineren AutoIt-Script geschrieben.
    Der Script speichert sämtliche Einstellungen in einer config.ini, welche in dem selben Verzeichnis erzeugt wird.

    Funktionen:

    • Beim Erststart wird automatisch die Konfigurationsdatei erzeugt und die Konfiguration aufgerufen (meine erste GUI bei AutoIt)
    • Dann kann das Abrufungsintervall festgelegt werden. Alle X Minuten werden die Daten aktualisiert.
    • Bei den Benachrichtigungsoptionen stehen TrayTips und MessageBoxes zur Verfügung
    • Sofern nur gemeldet werden soll, wenn gewünschte Produkte verfügbar sind, gibt es die Option Selektive Benachrichtigung
    • Dies kann mittels Angabe eines Modellnamens oder Hersteller passieren.
    • Bisher wird nur ZackZack.com unterstützt, soweit ich noch Zeit und Lust habe, sollen noch MindStar von MindFactory und die Sonderposten von HoH folgen.


    Bekannte Bugs:

    • 0.6a: Suchmuster für Selektive Benachrichtigung erfordern Neustart (Behoben in 0.61a)
    • 0.61a: Akustische Benachrichtigung ohne Funktion (Noch nicht implementiert, in Bearbeitung)


    Im Script ist noch eine Funktion enthalten, die für den einen oder anderen vielleicht praktisch sein könnte, sofern etwas mit ZackZack gemacht wird ;)
    Die Funktion _GetZackZack() gibt ein Array mit den aktuellen Angeboten zurück.
    Die Position 0 enthält ein Array aus den Namen, Position 1 die Kategorien, Position 2 den Preis, Position 3 die noch verfügbare Prozentzahl, und Position 4 die ID's, um gleich auf die Homepage weiterzuleiten o.Ä.
    Genutzt wird vom Script bisher lediglich der Name, der Preis und die Prozentzahl.

    Tja, auch wenn es bis jetzt nur bei ZackZack funktioniert, wollte ich euch mal fragen, ob des so passt :D
    Ich nutze AutoIt erst seit vll 2 Wochen für etwas größeres als simple Installationsautomatisierung, deshalb verzeiht mit Sicherheit vorhandene Anfängerfehler.
    Was würdet ihr anders machen?

    Veralteter Quellcode: 0.61a
    [autoit]


    ; =============================================================================
    ; HotPrice 0.61a
    ; 7. August 2011
    ; =============================================================================
    ; Dieses Script ruft selbstständig aktuelle Sonderangebote ab
    ; Es besteht die Möglichkeit, bei gesuchten Produkten benachrichtigt zu werden
    ; =============================================================================
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #include <String.au3>
    #include <Array.au3>
    ; Einstellungen
    Global $UseZack
    Global $NoticeUpdate
    Global $UseTrayTip
    Global $UseSound
    Global $MessageBox
    Global $Selective
    Global $SelectivePArray
    Global $GUIActive
    Global $data_zack
    ; Intervall für Aktualisierung, Einstellung in GUI folgt
    TraySetToolTip("HotPrice - Zeichne Benutzeroberfläche");
    ; TrayMenü-Einträge anpassen
    Opt("TrayMenuMode", 1)
    $show = TrayCreateItem("Nochmal anzeigen")
    $refr = TrayCreateItem("Aktualisieren")
    $conf = TrayCreateItem("Konfiguration")
    $ends = TrayCreateItem("Beenden")
    ; Erzeuge GUI
    $Form1_1 = GUICreate("Benachrichtigungsoptionen", 501, 321, 360, 285)
    $Group1 = GUICtrlCreateGroup("Verbindung", 8, 8, 209, 65)
    $Checkbox1 = GUICtrlCreateCheckbox("ZackZack", 16, 24, 97, 17)
    $Checkbox7 = GUICtrlCreateCheckbox("Mindstar (Mindfactory)", 16, 48, 145, 17)
    ; Mindfactory Mindstar wird derzeit nicht unterstützt
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Benachrichtigung", 8, 80, 209, 169)
    $Checkbox2 = GUICtrlCreateCheckbox("Bei Update benachrichtigen", 16, 96, 185, 17)
    $Checkbox3 = GUICtrlCreateCheckbox("Verwende TrayTip", 16, 120, 137, 17)
    $Checkbox4 = GUICtrlCreateCheckbox("Akustische Benachrichtigung", 16, 144, 177, 17)
    $Checkbox5 = GUICtrlCreateCheckbox("Meldungsfenster öffnen", 16, 168, 161, 17)
    $Checkbox6 = GUICtrlCreateCheckbox("Selektive Benachrichtigung", 16, 192, 169, 17)
    $Input1 = GUICtrlCreateInput("", 112, 216, 73, 21)
    $Label5 = GUICtrlCreateLabel("Intervall (Minuten):", 16, 216, 91, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Selektive Benachrichtigung", 232, 8, 257, 241)
    $Edit1 = GUICtrlCreateEdit("", 240, 48, 241, 185)
    $Label1 = GUICtrlCreateLabel("Suchmuster (1 pro Zeile)", 240, 24, 243, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Speichern", 8, 256, 209, 25, 0)
    $Button2 = GUICtrlCreateButton("Verstecken", 8, 288, 209, 25, 0)
    $Group4 = GUICtrlCreateGroup("Über HotPrice", 232, 256, 257, 57)
    $Label2 = GUICtrlCreateLabel("Version 0.61a", 240, 272, 213, 17)
    $Label3 = GUICtrlCreateLabel("", 240, 288, 4, 4)
    $Label4 = GUICtrlCreateLabel("7. August 2011", 240, 288, 114, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    TraySetToolTip("HotPrice - Lade Konfiguration");
    ; Überprüfe, ob Konfigurationsdatei existiert
    if Not FileExists(@ScriptDir & "\config.ini") Then
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "10")
    IniWrite(@ScriptDir & "\config.ini", "Selective", "Line1", "")
    ; Wenn ja, dann war das der Erststart
    $firstrun = 1;
    Else
    ; Wenn nein, dann wurde das Programm bereits ausgeführt
    $firstrun = 0;
    EndIf
    ; Lese gespeicherte Werte aus
    $UseZack = IniRead(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "")
    $NoticeUpdate = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "")
    $UseTrayTip = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "")
    $UseSound = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "")
    $MessageBox = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "")
    $Selective = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "")
    $interval = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "")
    ; Selektive Benachrichtigung wird etwas schwieriger, da variable Anzahl von Suchstrings
    ; Erste Zeile: Zeile 1
    $i = 1
    ; Erzeuge Array der Länge 1, da 0 nicht möglich.
    Dim $SelectivePArray[1]
    ; Pseudoendlosschleife, wird abgebrochen, wenn keine Zeile mehr vorhanden ist
    while True
    $pattern = IniRead(@ScriptDir & "\config.ini", "Selective", "Line"&$i, "")
    if $pattern = '' Then
    ExitLoop
    Else
    _ArrayAdd ($SelectivePArray, $pattern)
    EndIf
    $i = $i+1;
    WEnd
    ; Lösche ersten Eintrag
    _ArrayDelete($SelectivePArray, '')
    ; Text für Bearbeitung wird generiert
    $SelectivePattern = _ArrayToString($SelectivePArray, @CRLF)
    ; Setze GUI-Anzeigeelemente
    if $UseZack == 1 Then
    GUICtrlSetState($Checkbox1, $GUI_CHECKED)
    EndIf
    if $NoticeUpdate == 1 Then
    GUICtrlSetState($Checkbox2, $GUI_CHECKED)
    EndIf
    if $UseTrayTip == 1 Then
    GUICtrlSetState($Checkbox3, $GUI_CHECKED)
    EndIf
    if $UseSound == 1 Then
    GUICtrlSetState($Checkbox4, $GUI_CHECKED)
    EndIf
    if $MessageBox == 1 Then
    GUICtrlSetState($Checkbox5, $GUI_CHECKED)
    EndIf
    if $Selective == 1 Then
    GUICtrlSetState($Checkbox6, $GUI_CHECKED)
    EndIf
    GUICtrlSetData($Edit1, $SelectivePattern);
    GUICtrlSetData($Input1, $interval);
    ; Prüfe, ob Erststart
    If $firstrun = 1 Then
    ; Wenn ja, zeige GUI und überspringe ersten Abruf
    GUISetState(@SW_SHOW)
    $GUIActive = 1;
    TraySetToolTip("Erststart - Konfiguration");
    Else
    ; Wenn nein, verstecke GUI und beginne mit Abruf
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    $timestamp = TimerInit()
    $data_zack = _GetZackZack();
    _DoMessage();
    EndIf
    ; Endlosschleife - Programm läuft
    While 1
    ; Interaktion mit GUI
    $nMsg = GUIGetMsg()
    Switch $nMsg
    ; X gedrückt
    Case $GUI_EVENT_CLOSE
    ; Möglichkeit: Beenden, Verstecken, Abbrechen
    $end = MsgBox(291, "HotPrice - Programm beenden", "Wollen Sie HotPrice vollständig beenden? Bei Nein wird das Programm in den SystemTray minimiert.")
    if $end == 6 Then
    exit;
    ElseIf $end == 2 Then
    $timestamp = TimerInit()
    Else
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    $timestamp = TimerInit()
    $data_zack = _GetZackZack();
    _DoMessage();
    EndIf
    Case $Button1
    ; Speichere Einstellungen in Ini
    ; == Nicht implementiert, da ZackZack einzige bisher unterstützte Quelle
    ;if GUICtrlRead($Checkbox1) == $GUI_CHECKED Then
    ; IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
    ; $UseZack = 1
    ;Else
    ; IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "0")
    ; $UseZack = 0
    ;EndIf
    ; == MARKIERUNG
    $UseZack = 1
    GUICtrlSetState($Checkbox1, $GUI_CHECKED)
    if GUICtrlRead($Checkbox2) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
    $NoticeUpdate = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "0")
    $NoticeUpdate = 0
    EndIf
    if GUICtrlRead($Checkbox3) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
    $UseTrayTip = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "0")
    $UseTrayTip = 0
    EndIf
    if GUICtrlRead($Checkbox4) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "1")
    $UseSound = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
    $UseSound = 0
    EndIf
    if GUICtrlRead($Checkbox5) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "1")
    $MessageBox = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
    $MessageBox = 0
    EndIf
    if GUICtrlRead($Checkbox6) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "1")
    $Selective = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
    $Selective = 0
    EndIf
    $interval = GUICtrlRead($Input1)
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", $interval)
    ; Selektive Benachrichtigung: Lösche zuerst letzte Einträge in Ini
    IniDelete(@ScriptDir & "\config.ini", "Selective")
    ; Trenne Eingabe in einzelne Suchanfragen
    $SelectivePArray = _StringExplode(GUICtrlRead($Edit1), @CRLF)
    ; Schreibe Zeilen in INI
    For $i = 0 to UBound($SelectivePArray) - 1
    IniWrite(@ScriptDir & "\config.ini", "Selective", "Line"&$i+1, $SelectivePArray[$i])
    Next
    MsgBox(64, "HotPrice - Information", "Einstellungen wurden gespeichert")
    Case $Button2
    MsgBox(64, "HotPrice - Programm minimieren", "HotPrice wird nun in den SystemTray minimiert.")
    ; Bei Betätigung des Verstecken-Buttons wird das Programm in den Systemtray minimiert
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    ; Neue Daten werden abgerufen
    $timestamp = TimerInit()
    $data_zack = _GetZackZack()
    _DoMessage()
    EndSwitch
    ; Interaktion durch TrayIcon
    $msg = TrayGetMsg()
    Switch $msg
    ; Konfiguration
    case $conf
    ; Konfiguration: Zeige Fenster an
    GUISetState(@SW_SHOW)
    $GUIActive = 1
    ; Beenden
    case $ends
    ; Beende Programm
    $end = MsgBox(324, "HotPrice - Programm beenden", "Wollen Sie HotPrice wirklich vollständig beenden?")
    if $end == 6 Then
    exit;
    EndIf
    ; Aktualisieren
    case $refr
    ; Rufe Daten von ZackZack ab.
    $data_zack = _GetZackZack()
    $timestamp = TimerInit()
    _DoMessage()
    ; Nochmal anzeigen
    case $show
    ; Letzte Meldung ausgeben
    _DoMessage()
    EndSwitch
    ; Nach 10 Minuten erneuter Abruf
    if TimerDiff($timestamp) > ($interval*60000) AND $GUIActive = 0 Then
    $timestamp = TimerInit()
    _DoMessage()
    EndIf
    WEnd
    ; UDF: DoZackMessage gibt Informationen von ZackZack aus
    Func _DoMessage()
    ; Übersichtlichkeit: Array der Abruffunktion aufteilen
    $name = $data_zack[0]
    $prs = $data_zack[2]
    $proz = $data_zack[3]
    ; Generiere Text für Benachrichtigung
    Dim $astrng[UBound($name)]
    For $i = 0 to UBound($name)-1
    $astrng[$i] = $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")"
    Next
    ; Füge generiertes Array zusammen
    $string = _ArrayToString($astrng, @CRLF)
    ; Benachrichtige bei normalem Preisabruf?
    if $NoticeUpdate = 1 Then
    ; Verwende TrayTip (Fenster am Tray) ?
    if $UseTrayTip = 1 Then
    TrayTip("Preisinformationen", $string, 15)
    EndIf
    ; Verwende Informationsfenster (Nervig) ?
    if $MessageBox = 1 Then
    MsgBox(0,"HotPrice - Preisinformationen", $string)
    EndIf
    EndIf
    TraySetToolTip("HotPrice - Aktuelle Daten abgerufen");
    ; Selektive Benachrichtigung beginnt hier
    ; Prüfe, ob aktiviert
    If $Selective = 1 Then
    ; Wieder Array der Länge 1, 0 geht ja nicht....
    Dim $selectiveresult[1]
    ; Suche alle angegebenen Produkte nach Übereinstimmungen ab (Durchsucht nur Name)
    For $i = 0 to UBound($name) - 1
    For $y = 0 to UBound($SelectivePArray) - 1
    if StringInStr(StringUpper($name[$i]), StringUpper($SelectivePArray[$y])) Then
    _ArrayAdd($selectiveresult, $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")")
    EndIf
    Next
    Next
    ; Gibt es welche, also Länge vom Array größer 1
    if UBound($selectiveresult) > 1 Then
    ; Entferne Pseudoeintrag
    _ArrayDelete($selectiveresult, '')
    ; Meldung generieren
    $string = _ArrayToString($selectiveresult, @CRLF)
    ; Ausgabe
    TraySetToolTip("HotPrice - Suche erfolgreich!");
    ; Verwende TrayTip (Fenster am Tray) ?
    if $UseTrayTip = 1 Then
    TrayTip("Suche erfolgreich!", $string, 20)
    EndIf
    ; Verwende Informationsfenster (Nervig) ?
    if $MessageBox = 1 Then
    MsgBox(0,"HotPrice - Suche erfolgreich!", $string)
    EndIf
    EndIf
    EndIf
    EndFunc
    ; UDF: GetZackZack holt Daten von ZackZack-Homepage
    Func _GetZackZack()
    TraySetToolTip("HotPrice - Rufe neue Daten ab");
    ; ZackZack-Seite aufrufen und Quelltext ausgeben
    $source = _INetGetSource ("http://www.zack-zack.com/html/index.html")
    ; Suche nach Begrenzer für Produkte und trenne alles davor und dannach ab
    $temp = _StringExplode($source, '<div class="highlightsArea">')
    $source = $temp[1]
    $temp = _StringExplode($source, '<div id="footer">')
    $source = $temp[0]
    ; Zeilenumbrüche entfernen, übernommen aus vorherigem PHP-Script
    $source = StringReplace($source, '\r', "");
    $source = StringReplace($source, '\n', "");
    ; Produkt-ID herausbekommen
    $id = _StringBetween($source, '<span id="percent_', '">')
    ; Anzahl der Produkte herausfinden
    $anzahl = UBound($id);
    ; Verfügbarkeit der angegebenen Produkte herausfinden
    Dim $prozent[$anzahl]
    For $i = 0 to $anzahl - 1
    $percent = _StringBetween($source, '<span id="percent_' & $id[$i] & '">', '</span>')
    $prozent[$i] = $percent[0] & "%";
    Next
    ; Artikeldaten rausbekommen
    $cat = _StringBetween($source, '<div class="category">', '</div>')
    $name = _StringBetween($source, '<div class="articleName">', '</div>')
    $prs = _StringBetween($source, '<span style="font-size:18px;">nur &euro; ', '*</span>')
    ; Leerzeichen korrigieren
    For $i = 0 to $anzahl - 1
    $name[$i] = Stringreplace($name[$i], "&nbsp;", " ")
    Next
    ; Datenarray, welches zurückgegeben wird
    Dim $data_zack[5]
    $data_zack[0] = $name;
    $data_zack[1] = $cat;
    $data_zack[2] = $prs;
    $data_zack[3] = $prozent;
    $data_zack[4] = $id;
    Return $data_zack;
    EndFunc

    [/autoit]
  • Hey, erstmal:
    Du hast vergessen eine Variable zu deklarieren, und zwar $timestamp.
    Das würde dann so aussehen:

    [autoit]


    ; Einstellungen
    Global $UseZack
    Global $NoticeUpdate
    Global $UseTrayTip
    Global $UseSound
    Global $MessageBox
    Global $Selective
    Global $SelectivePArray
    Global $GUIActive
    Global $data_zack
    Global $timestamp ;Hier

    [/autoit]


    Ich würde die Meldung bei Zeile 284 in eine Info (also Flag 64) ändern.
    Mit welcher Soundbenachrichtigung willst du es denn machen?
    Ich würde Windows-Pling empfehlen.
    Habe dein Skript mal entsprechend umgeändert:

    Spoiler anzeigen
    [autoit]


    ; =============================================================================
    ; HotPrice 0.61a
    ; 7. August 2011
    ; =============================================================================
    ; Dieses Script ruft selbstständig aktuelle Sonderangebote ab
    ; Es besteht die Möglichkeit, bei gesuchten Produkten benachrichtigt zu werden
    ; =============================================================================
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #include <String.au3>
    #include <Array.au3>
    ; Einstellungen
    Global $UseZack
    Global $NoticeUpdate
    Global $UseTrayTip
    Global $UseSound
    Global $MessageBox
    Global $Selective
    Global $SelectivePArray
    Global $GUIActive
    Global $data_zack
    Global $timestamp
    ; Intervall für Aktualisierung, Einstellung in GUI folgt
    TraySetToolTip("HotPrice - Zeichne Benutzeroberfläche");
    ; TrayMenü-Einträge anpassen
    Opt("TrayMenuMode", 1)
    $show = TrayCreateItem("Nochmal anzeigen")
    $refr = TrayCreateItem("Aktualisieren")
    $conf = TrayCreateItem("Konfiguration")
    $ends = TrayCreateItem("Beenden")
    ; Erzeuge GUI
    $Form1_1 = GUICreate("Benachrichtigungsoptionen", 501, 321, 360, 285)
    $Group1 = GUICtrlCreateGroup("Verbindung", 8, 8, 209, 65)
    $Checkbox1 = GUICtrlCreateCheckbox("ZackZack", 16, 24, 97, 17)
    $Checkbox7 = GUICtrlCreateCheckbox("Mindstar (Mindfactory)", 16, 48, 145, 17)
    ; Mindfactory Mindstar wird derzeit nicht unterstützt
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Benachrichtigung", 8, 80, 209, 169)
    $Checkbox2 = GUICtrlCreateCheckbox("Bei Update benachrichtigen", 16, 96, 185, 17)
    $Checkbox3 = GUICtrlCreateCheckbox("Verwende TrayTip", 16, 120, 137, 17)
    $Checkbox4 = GUICtrlCreateCheckbox("Akustische Benachrichtigung", 16, 144, 177, 17)
    $Checkbox5 = GUICtrlCreateCheckbox("Meldungsfenster öffnen", 16, 168, 161, 17)
    $Checkbox6 = GUICtrlCreateCheckbox("Selektive Benachrichtigung", 16, 192, 169, 17)
    $Input1 = GUICtrlCreateInput("", 112, 216, 73, 21)
    $Label5 = GUICtrlCreateLabel("Intervall (Minuten):", 16, 216, 91, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Selektive Benachrichtigung", 232, 8, 257, 241)
    $Edit1 = GUICtrlCreateEdit("", 240, 48, 241, 185)
    $Label1 = GUICtrlCreateLabel("Suchmuster (1 pro Zeile)", 240, 24, 243, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Speichern", 8, 256, 209, 25, 0)
    $Button2 = GUICtrlCreateButton("Verstecken", 8, 288, 209, 25, 0)
    $Group4 = GUICtrlCreateGroup("Über HotPrice", 232, 256, 257, 57)
    $Label2 = GUICtrlCreateLabel("Version 0.61a", 240, 272, 213, 17)
    $Label3 = GUICtrlCreateLabel("", 240, 288, 4, 4)
    $Label4 = GUICtrlCreateLabel("7. August 2011", 240, 288, 114, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    TraySetToolTip("HotPrice - Lade Konfiguration");
    ; Überprüfe, ob Konfigurationsdatei existiert
    if Not FileExists(@ScriptDir & "\config.ini") Then
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "10")
    IniWrite(@ScriptDir & "\config.ini", "Selective", "Line1", "")
    ; Wenn ja, dann war das der Erststart
    $firstrun = 1;
    Else
    ; Wenn nein, dann wurde das Programm bereits ausgeführt
    $firstrun = 0;
    EndIf
    ; Lese gespeicherte Werte aus
    $UseZack = IniRead(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "")
    $NoticeUpdate = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "")
    $UseTrayTip = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "")
    $UseSound = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "")
    $MessageBox = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "")
    $Selective = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "")
    $interval = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "")
    ; Selektive Benachrichtigung wird etwas schwieriger, da variable Anzahl von Suchstrings
    ; Erste Zeile: Zeile 1
    $i = 1
    ; Erzeuge Array der Länge 1, da 0 nicht möglich.
    Dim $SelectivePArray[1]
    ; Pseudoendlosschleife, wird abgebrochen, wenn keine Zeile mehr vorhanden ist
    while True
    $pattern = IniRead(@ScriptDir & "\config.ini", "Selective", "Line"&$i, "")
    if $pattern = '' Then
    ExitLoop
    Else
    _ArrayAdd ($SelectivePArray, $pattern)
    EndIf
    $i = $i+1;
    WEnd
    ; Lösche ersten Eintrag
    _ArrayDelete($SelectivePArray, '')
    ; Text für Bearbeitung wird generiert
    $SelectivePattern = _ArrayToString($SelectivePArray, @CRLF)
    ; Setze GUI-Anzeigeelemente
    if $UseZack == 1 Then
    GUICtrlSetState($Checkbox1, $GUI_CHECKED)
    EndIf
    if $NoticeUpdate == 1 Then
    GUICtrlSetState($Checkbox2, $GUI_CHECKED)
    EndIf
    if $UseTrayTip == 1 Then
    GUICtrlSetState($Checkbox3, $GUI_CHECKED)
    EndIf
    if $UseSound == 1 Then
    GUICtrlSetState($Checkbox4, $GUI_CHECKED)
    EndIf
    if $MessageBox == 1 Then
    GUICtrlSetState($Checkbox5, $GUI_CHECKED)
    EndIf
    if $Selective == 1 Then
    GUICtrlSetState($Checkbox6, $GUI_CHECKED)
    EndIf
    GUICtrlSetData($Edit1, $SelectivePattern);
    GUICtrlSetData($Input1, $interval);
    ; Prüfe, ob Erststart
    If $firstrun = 1 Then
    ; Wenn ja, zeige GUI und überspringe ersten Abruf
    GUISetState(@SW_SHOW)
    $GUIActive = 1;
    TraySetToolTip("Erststart - Konfiguration");
    Else
    ; Wenn nein, verstecke GUI und beginne mit Abruf
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    $timestamp = TimerInit()
    $data_zack = _GetZackZack();
    _DoMessage();
    EndIf
    ; Endlosschleife - Programm läuft
    While 1
    ; Interaktion mit GUI
    $nMsg = GUIGetMsg()
    Switch $nMsg
    ; X gedrückt
    Case $GUI_EVENT_CLOSE
    ; Möglichkeit: Beenden, Verstecken, Abbrechen
    $end = MsgBox(291, "HotPrice - Programm beenden", "Wollen Sie HotPrice vollständig beenden? Bei Nein wird das Programm in den SystemTray minimiert.")
    if $end == 6 Then
    exit;
    ElseIf $end == 2 Then
    $timestamp = TimerInit()
    Else
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    $timestamp = TimerInit()
    $data_zack = _GetZackZack();
    _DoMessage();
    EndIf
    Case $Button1
    ; Speichere Einstellungen in Ini
    ; == Nicht implementiert, da ZackZack einzige bisher unterstützte Quelle
    ;if GUICtrlRead($Checkbox1) == $GUI_CHECKED Then
    ; IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
    ; $UseZack = 1
    ;Else
    ; IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "0")
    ; $UseZack = 0
    ;EndIf
    ; == MARKIERUNG
    $UseZack = 1
    GUICtrlSetState($Checkbox1, $GUI_CHECKED)
    if GUICtrlRead($Checkbox2) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
    $NoticeUpdate = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "0")
    $NoticeUpdate = 0
    EndIf
    if GUICtrlRead($Checkbox3) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
    $UseTrayTip = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "0")
    $UseTrayTip = 0
    EndIf
    if GUICtrlRead($Checkbox4) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "1")
    $UseSound = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
    $UseSound = 0
    EndIf
    if GUICtrlRead($Checkbox5) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "1")
    $MessageBox = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
    $MessageBox = 0
    EndIf
    if GUICtrlRead($Checkbox6) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "1")
    $Selective = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
    $Selective = 0
    EndIf
    $interval = GUICtrlRead($Input1)
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", $interval)
    ; Selektive Benachrichtigung: Lösche zuerst letzte Einträge in Ini
    IniDelete(@ScriptDir & "\config.ini", "Selective")
    ; Trenne Eingabe in einzelne Suchanfragen
    $SelectivePArray = _StringExplode(GUICtrlRead($Edit1), @CRLF)
    ; Schreibe Zeilen in INI
    For $i = 0 to UBound($SelectivePArray) - 1
    IniWrite(@ScriptDir & "\config.ini", "Selective", "Line"&$i+1, $SelectivePArray[$i])
    Next
    MsgBox(64, "HotPrice - Information", "Einstellungen wurden gespeichert")
    Case $Button2
    MsgBox(64, "HotPrice - Programm minimieren", "HotPrice wird nun in den SystemTray minimiert.")
    ; Bei Betätigung des Verstecken-Buttons wird das Programm in den Systemtray minimiert
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    ; Neue Daten werden abgerufen
    $timestamp = TimerInit()
    $data_zack = _GetZackZack()
    _DoMessage()
    EndSwitch
    ; Interaktion durch TrayIcon
    $msg = TrayGetMsg()
    Switch $msg
    ; Konfiguration
    case $conf
    ; Konfiguration: Zeige Fenster an
    GUISetState(@SW_SHOW)
    $GUIActive = 1
    ; Beenden
    case $ends
    ; Beende Programm
    $end = MsgBox(324, "HotPrice - Programm beenden", "Wollen Sie HotPrice wirklich vollständig beenden?")
    if $end == 6 Then
    exit;
    EndIf
    ; Aktualisieren
    case $refr
    ; Rufe Daten von ZackZack ab.
    $data_zack = _GetZackZack()
    $timestamp = TimerInit()
    _DoMessage()
    ; Nochmal anzeigen
    case $show
    ; Letzte Meldung ausgeben
    _DoMessage()
    EndSwitch
    ; Nach 10 Minuten erneuter Abruf
    if TimerDiff($timestamp) > ($interval*60000) AND $GUIActive = 0 Then
    $timestamp = TimerInit()
    _DoMessage()
    EndIf
    WEnd
    ; UDF: DoZackMessage gibt Informationen von ZackZack aus
    Func _DoMessage()
    ; Übersichtlichkeit: Array der Abruffunktion aufteilen
    $name = $data_zack[0]
    $prs = $data_zack[2]
    $proz = $data_zack[3]
    ; Generiere Text für Benachrichtigung
    Dim $astrng[UBound($name)]
    For $i = 0 to UBound($name)-1
    $astrng[$i] = $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")"
    Next
    ; Füge generiertes Array zusammen
    $string = _ArrayToString($astrng, @CRLF)
    ; Benachrichtige bei normalem Preisabruf?
    if $NoticeUpdate = 1 Then
    ; Verwende TrayTip (Fenster am Tray) ?
    if $UseTrayTip = 1 Then
    TrayTip("Preisinformationen", $string, 15)
    EndIf
    ; Verwende Informationsfenster (Nervig) ?
    if $MessageBox = 1 Then
    MsgBox(64,"HotPrice - Preisinformationen", $string)
    EndIf
    EndIf
    TraySetToolTip("HotPrice - Aktuelle Daten abgerufen");
    ; Selektive Benachrichtigung beginnt hier
    ; Prüfe, ob aktiviert
    If $Selective = 1 Then
    ; Wieder Array der Länge 1, 0 geht ja nicht....
    Dim $selectiveresult[1]
    ; Suche alle angegebenen Produkte nach Übereinstimmungen ab (Durchsucht nur Name)
    For $i = 0 to UBound($name) - 1
    For $y = 0 to UBound($SelectivePArray) - 1
    if StringInStr(StringUpper($name[$i]), StringUpper($SelectivePArray[$y])) Then
    _ArrayAdd($selectiveresult, $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")")
    EndIf
    Next
    Next
    ; Gibt es welche, also Länge vom Array größer 1
    if UBound($selectiveresult) > 1 Then
    ; Entferne Pseudoeintrag
    _ArrayDelete($selectiveresult, '')
    ; Meldung generieren
    $string = _ArrayToString($selectiveresult, @CRLF)
    ; Ausgabe
    TraySetToolTip("HotPrice - Suche erfolgreich!");
    ; Verwende TrayTip (Fenster am Tray) ?
    if $UseTrayTip = 1 Then
    TrayTip("Suche erfolgreich!", $string, 20)
    EndIf
    ; Verwende Informationsfenster (Nervig) ?
    if $MessageBox = 1 Then
    MsgBox(0,"HotPrice - Suche erfolgreich!", $string)
    EndIf
    EndIf
    EndIf
    EndFunc
    ; UDF: GetZackZack holt Daten von ZackZack-Homepage
    Func _GetZackZack()
    TraySetToolTip("HotPrice - Rufe neue Daten ab");
    ; ZackZack-Seite aufrufen und Quelltext ausgeben
    $source = _INetGetSource ("http://www.zack-zack.com/html/index.html")
    ; Suche nach Begrenzer für Produkte und trenne alles davor und dannach ab
    $temp = _StringExplode($source, '<div class="highlightsArea">')
    $source = $temp[1]
    $temp = _StringExplode($source, '<div id="footer">')
    $source = $temp[0]
    ; Zeilenumbrüche entfernen, übernommen aus vorherigem PHP-Script
    $source = StringReplace($source, '\r', "");
    $source = StringReplace($source, '\n', "");
    ; Produkt-ID herausbekommen
    $id = _StringBetween($source, '<span id="percent_', '">')
    ; Anzahl der Produkte herausfinden
    $anzahl = UBound($id);
    ; Verfügbarkeit der angegebenen Produkte herausfinden
    Dim $prozent[$anzahl]
    For $i = 0 to $anzahl - 1
    $percent = _StringBetween($source, '<span id="percent_' & $id[$i] & '">', '</span>')
    $prozent[$i] = $percent[0] & "%";
    Next
    ; Artikeldaten rausbekommen
    $cat = _StringBetween($source, '<div class="category">', '</div>')
    $name = _StringBetween($source, '<div class="articleName">', '</div>')
    $prs = _StringBetween($source, '<span style="font-size:18px;">nur &euro; ', '*</span>')
    ; Leerzeichen korrigieren
    For $i = 0 to $anzahl - 1
    $name[$i] = Stringreplace($name[$i], "&nbsp;", " ")
    Next
    ; Datenarray, welches zurückgegeben wird
    Dim $data_zack[5]
    $data_zack[0] = $name;
    $data_zack[1] = $cat;
    $data_zack[2] = $prs;
    $data_zack[3] = $prozent;
    $data_zack[4] = $id;
    Return $data_zack;
    EndFunc

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


    Was ich gemacht habe?
    Ein paar Schönheitsaufgaben: Style der MsgBox bei Benachrichtigung auf 64(Info) geändert und ein paar andere Sachen ($timestamp definiert).
    Hier ist eine Zeile, die du in deiner Sound-Funktion benutzen solltest (wegen dem Pfad der Pling-Datei von Windows)

    [autoit]


    SoundPlay(@WindowsDir & "\Media\Benachrichtigung.wav") ;Spielt den Sound aus dem Windows-Media Ordner

    [/autoit]


    Sonst gutes Programm...
    Könntest ja ein paar Checkboxen einbauen, wo man einstellen kann, bei welchen Shop man benachrichtigt werden möchte, wie z.B. eBay, Amazon etc..

    MfG button421

    Meine fertigen Projekte:
    VirtualCash
    Monopoly Digital

    Daran arbeite ich gerade:
    Einem Skript, womit man ohne Programmierkentisse eigene Programme machen kann (habe ich selber früher gesucht :D ) Stand: ||||||||||||||||||||||||| 6%

  • Abend, danke für das Lob und für die Verbesserungsvorschläge ;)
    Die $timestamp hatte ich nicht deklariert, da sie in keiner Funktion benötigt wird, zumindest momentan.

    Ich hoffe, ich habe noch alles umgesetzt, was du gesagt hast. Habe nun relativ viel verändert, sodass die Soundbenachrichtigung usw. nur für die Selektive Benachrichtigung funktioniert. Die GUI muss ich ebenfalls noch überarbeiten, um noch mehr Einstellungsmöglichkeiten zur Verfügung zu stellen und die Begrenzung beim TrayTip zu umgehen.

    Geplant ist jetzt noch ein Zusammenspiel mit Geizhals, um bei einem bestimmten Preis informiert zu werden.
    Wobei das eher unabhängig von der bisherigen Funktion laufen wird, sofern mir da nichts einfällt ;)

    Wenn ich das habe, joa, dann wär's glaub ich fertig.

    Quellcode 0.9
    [autoit]

    ; =============================================================================
    ; HotPrice 0.9 Beta
    ; 7. August 2011
    ; =============================================================================
    ; Dieses Script ruft selbstständig aktuelle Sonderangebote ab
    ; Es besteht die Möglichkeit, bei gesuchten Produkten benachrichtigt zu werden
    ; =============================================================================
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <INet.au3>
    #include <String.au3>
    #include <Array.au3>
    ; Einstellungen
    Global $UseZack
    Global $UseMind
    Global $NoticeUpdate
    Global $UseTrayTip
    Global $UseSound
    Global $MessageBox
    Global $Selective
    Global $SelectivePArray
    Global $GUIActive
    Global $database
    Global $timestamp
    ; Parameterunterstützung
    ;If $CmdLine[0] > 0 Then
    ; If $CmdLine[1] == "source" Then
    ; DirCreate (@ScriptDir&"\Source")
    ; FileInstall("source.au3", @ScriptDir&"\Source\source.au3");
    ; MsgBox(0,"HotPrice - Quellcode", "Der Quellcode wurde in folgendes Verzeichnis kopiert: " &@CRLF&""&@ScriptDir&"\Source\source.au3");
    ; Exit
    ; EndIf
    ;EndIf
    ; Intervall für Aktualisierung, Einstellung in GUI folgt
    TraySetToolTip("HotPrice - Zeichne Benutzeroberfläche");
    ; TrayMenü-Einträge anpassen
    Opt("TrayMenuMode", 1)
    $show = TrayCreateItem("Nochmal anzeigen")
    $msgb = TrayCreateItem("Alle Angebote")
    $refr = TrayCreateItem("Aktualisieren")
    $conf = TrayCreateItem("Konfiguration")
    $ends = TrayCreateItem("Beenden")
    ; Erzeuge GUI
    $Form1_1 = GUICreate("Benachrichtigungsoptionen", 501, 321, 360, 285)
    $Group1 = GUICtrlCreateGroup("Verbindung", 8, 8, 209, 65)
    $Checkbox1 = GUICtrlCreateCheckbox("ZackZack", 16, 24, 97, 17)
    $Checkbox7 = GUICtrlCreateCheckbox("Mindstar (Mindfactory)", 16, 48, 145, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Benachrichtigung", 8, 80, 209, 169)
    $Checkbox2 = GUICtrlCreateCheckbox("Bei Update benachrichtigen", 16, 96, 185, 17)
    $Checkbox3 = GUICtrlCreateCheckbox("Verwende TrayTip", 16, 120, 137, 17)
    $Checkbox4 = GUICtrlCreateCheckbox("Akustische Benachrichtigung", 16, 144, 177, 17)
    $Checkbox5 = GUICtrlCreateCheckbox("Meldungsfenster öffnen", 16, 168, 161, 17)
    $Checkbox6 = GUICtrlCreateCheckbox("Selektive Benachrichtigung", 16, 192, 169, 17)
    $Input1 = GUICtrlCreateInput("", 112, 216, 73, 21)
    $Label5 = GUICtrlCreateLabel("Intervall (Minuten):", 16, 216, 91, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group3 = GUICtrlCreateGroup("Selektive Benachrichtigung", 232, 8, 257, 241)
    $Edit1 = GUICtrlCreateEdit("", 240, 48, 241, 185)
    $Label1 = GUICtrlCreateLabel("Suchmuster (1 pro Zeile)", 240, 24, 243, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Button1 = GUICtrlCreateButton("Speichern", 8, 256, 209, 25, 0)
    $Button2 = GUICtrlCreateButton("Verstecken", 8, 288, 209, 25, 0)
    $Group4 = GUICtrlCreateGroup("Über HotPrice", 232, 256, 257, 57)
    $Label2 = GUICtrlCreateLabel("Version 0.9 Beta", 240, 272, 213, 17)
    $Label3 = GUICtrlCreateLabel("", 240, 288, 4, 4)
    $Label4 = GUICtrlCreateLabel("7. August 2011", 240, 288, 114, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    TraySetToolTip("HotPrice - Lade Konfiguration");
    ; Überprüfe, ob Konfigurationsdatei existiert
    if Not FileExists(@ScriptDir & "\config.ini") Then
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseMind", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "10")
    IniWrite(@ScriptDir & "\config.ini", "Selective", "Line1", "")
    ; Wenn ja, dann war das der Erststart
    $firstrun = 1;
    Else
    ; Wenn nein, dann wurde das Programm bereits ausgeführt
    $firstrun = 0;
    EndIf
    ; Lese gespeicherte Werte aus
    $UseZack = IniRead(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "")
    $UseMind = IniRead(@ScriptDir & "\config.ini", "Verbindung", "UseMind", "")
    $NoticeUpdate = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "")
    $UseTrayTip = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "")
    $UseSound = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "")
    $MessageBox = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "")
    $Selective = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "")
    $interval = IniRead(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", "")
    ; Selektive Benachrichtigung wird etwas schwieriger, da variable Anzahl von Suchstrings
    ; Erste Zeile: Zeile 1
    $i = 1
    ; Erzeuge Array der Länge 1, da 0 nicht möglich.
    Dim $SelectivePArray[1]
    ; Pseudoendlosschleife, wird abgebrochen, wenn keine Zeile mehr vorhanden ist
    while True
    $pattern = IniRead(@ScriptDir & "\config.ini", "Selective", "Line"&$i, "")
    if $pattern = '' Then
    ExitLoop
    Else
    _ArrayAdd ($SelectivePArray, $pattern)
    EndIf
    $i = $i+1;
    WEnd
    ; Lösche ersten Eintrag
    _ArrayDelete($SelectivePArray, '')
    ; Text für Bearbeitung wird generiert
    $SelectivePattern = _ArrayToString($SelectivePArray, @CRLF)
    ; Setze GUI-Anzeigeelemente
    if $UseZack == 1 Then
    GUICtrlSetState($Checkbox1, $GUI_CHECKED)
    EndIf
    if $UseMind == 1 Then
    GUICtrlSetState($Checkbox7, $GUI_CHECKED)
    EndIf
    if $NoticeUpdate == 1 Then
    GUICtrlSetState($Checkbox2, $GUI_CHECKED)
    EndIf
    if $UseTrayTip == 1 Then
    GUICtrlSetState($Checkbox3, $GUI_CHECKED)
    EndIf
    if $UseSound == 1 Then
    GUICtrlSetState($Checkbox4, $GUI_CHECKED)
    EndIf
    if $MessageBox == 1 Then
    GUICtrlSetState($Checkbox5, $GUI_CHECKED)
    EndIf
    if $Selective == 1 Then
    GUICtrlSetState($Checkbox6, $GUI_CHECKED)
    EndIf
    GUICtrlSetData($Edit1, $SelectivePattern);
    GUICtrlSetData($Input1, $interval);
    ; Prüfe, ob Erststart
    If $firstrun = 1 Then
    ; Wenn ja, zeige GUI und überspringe ersten Abruf
    GUISetState(@SW_SHOW)
    $GUIActive = 1;
    TraySetToolTip("Erststart - Konfiguration");
    Else
    ; Wenn nein, verstecke GUI und beginne mit Abruf
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    $timestamp = TimerInit()
    _RefreshDataBase()
    _DoMessage();
    EndIf
    ; Endlosschleife - Programm läuft
    While 1
    ; Interaktion mit GUI
    $nMsg = GUIGetMsg()
    Switch $nMsg
    ; X gedrückt
    Case $GUI_EVENT_CLOSE
    ; Möglichkeit: Beenden, Verstecken, Abbrechen
    $end = MsgBox(291, "HotPrice - Programm beenden", "Wollen Sie HotPrice vollständig beenden? Bei Nein wird das Programm in den SystemTray minimiert.")
    if $end == 6 Then
    exit;
    ElseIf $end == 2 Then
    $timestamp = TimerInit()
    Else
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    $timestamp = TimerInit()
    _RefreshDataBase()
    _DoMessage();
    EndIf
    Case $Button1
    ; Speichere Einstellungen in Ini
    if GUICtrlRead($Checkbox1) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "1")
    $UseZack = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseZack", "0")
    $UseZack = 0
    EndIf
    if GUICtrlRead($Checkbox7) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseMind", "1")
    $UseMind = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Verbindung", "UseMind", "0")
    $UseMind = 0
    EndIf
    GUICtrlSetState($Checkbox1, $GUI_CHECKED)
    if GUICtrlRead($Checkbox2) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "1")
    $NoticeUpdate = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "NoticeUpdate", "0")
    $NoticeUpdate = 0
    EndIf
    if GUICtrlRead($Checkbox3) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "1")
    $UseTrayTip = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseTrayTip", "0")
    $UseTrayTip = 0
    EndIf
    if GUICtrlRead($Checkbox4) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "1")
    $UseSound = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "UseSound", "0")
    $UseSound = 0
    EndIf
    if GUICtrlRead($Checkbox5) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "1")
    $MessageBox = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "MessageBox", "0")
    $MessageBox = 0
    EndIf
    if GUICtrlRead($Checkbox6) == $GUI_CHECKED Then
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "1")
    $Selective = 1
    Else
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "Selective", "0")
    $Selective = 0
    EndIf
    $interval = GUICtrlRead($Input1)
    IniWrite(@ScriptDir & "\config.ini", "Benachrichtigung", "interval", $interval)
    ; Selektive Benachrichtigung: Lösche zuerst letzte Einträge in Ini
    IniDelete(@ScriptDir & "\config.ini", "Selective")
    ; Trenne Eingabe in einzelne Suchanfragen
    $SelectivePArray = _StringExplode(GUICtrlRead($Edit1), @CRLF)
    ; Schreibe Zeilen in INI
    For $i = 0 to UBound($SelectivePArray) - 1
    IniWrite(@ScriptDir & "\config.ini", "Selective", "Line"&$i+1, $SelectivePArray[$i])
    Next
    MsgBox(64, "HotPrice - Information", "Einstellungen wurden gespeichert")
    Case $Button2
    MsgBox(64, "HotPrice - Programm minimieren", "HotPrice wird nun in den SystemTray minimiert.")
    ; Bei Betätigung des Verstecken-Buttons wird das Programm in den Systemtray minimiert
    GUISetState(@SW_HIDE)
    $GUIActive = 0;
    ; Neue Daten werden abgerufen
    $timestamp = TimerInit()
    _RefreshDataBase()
    _DoMessage()
    EndSwitch
    ; Interaktion durch TrayIcon
    $msg = TrayGetMsg()
    Switch $msg
    ; Konfiguration
    case $conf
    ; Konfiguration: Zeige Fenster an
    GUISetState(@SW_SHOW)
    $GUIActive = 1
    ; Beenden
    case $ends
    ; Beende Programm
    $end = MsgBox(324, "HotPrice - Programm beenden", "Wollen Sie HotPrice wirklich vollständig beenden?")
    if $end == 6 Then
    exit;
    EndIf
    ; Aktualisieren
    case $refr
    ; Rufe Shopdaten ab
    $timestamp = TimerInit()
    _RefreshDataBase()
    _DoMessage()
    ; Nochmal anzeigen
    case $show
    ; Letzte Meldung ausgeben
    _DoMessage()
    case $msgb
    ; Letzte Meldung ausgeben
    _DoMessageAll()
    EndSwitch
    ; Nach 10 Minuten erneuter Abruf
    if TimerDiff($timestamp) > ($interval*60000) AND $GUIActive = 0 Then
    $timestamp = TimerInit()
    _DoMessage()
    EndIf
    WEnd
    ; UDF: DoZackMessage gibt Informationen von ZackZack aus
    Func _DoMessageAll()
    ; Übersichtlichkeit: Array der Abruffunktion aufteilen
    $name = $database[0]
    $prs = $database[2]
    $proz = $database[3]
    ; Leerzeichen korrigieren
    For $i = 0 to UBound($name) - 1
    $name[$i] = _RMHTMLChats($name[$i])
    Next
    ; Generiere Text für Benachrichtigung
    Dim $astrng[UBound($name)]
    For $i = 0 to UBound($name)-1
    $astrng[$i] = $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")"
    Next
    ; Füge generiertes Array zusammen
    $string = _ArrayToString($astrng, @CRLF)
    MsgBox(64, "HotPrice - Alle abgerufenen Daten", $string)
    EndFunc
    Func _DoMessage()
    ; Übersichtlichkeit: Array der Abruffunktion aufteilen
    $name = $database[0]
    $prs = $database[2]
    $proz = $database[3]
    ; Leerzeichen korrigieren
    For $i = 0 to UBound($name) - 1
    $name[$i] = _RMHTMLChats($name[$i])
    Next
    ; Benachrichtige bei normalem Preisabruf?
    if $NoticeUpdate = 1 Then
    ; Verwende TrayTip (Fenster am Tray) ?
    if $UseTrayTip = 1 Then
    TrayTip("Preisinformationen", "Es wurden "&UBound($name)&" Datensätze abgerufen", 5)
    EndIf
    EndIf

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

    TraySetToolTip("HotPrice - Aktuelle Daten abgerufen");
    ; Selektive Benachrichtigung beginnt hier
    ; Prüfe, ob aktiviert
    If $Selective = 1 Then
    ; Wieder Array der Länge 1, 0 geht ja nicht....
    Dim $selectiveresult[1]
    ; Suche alle angegebenen Produkte nach Übereinstimmungen ab (Durchsucht nur Name)
    For $i = 0 to UBound($name) - 1
    For $y = 0 to UBound($SelectivePArray) - 1
    if StringInStr(StringUpper($name[$i]), StringUpper($SelectivePArray[$y])) Then
    _ArrayAdd($selectiveresult, $name[$i] & " für " & $prs[$i] & "("&$proz[$i]&")")
    EndIf
    Next
    Next
    ; Gibt es welche, also Länge vom Array größer 1
    if UBound($selectiveresult) > 1 Then
    ; Entferne Pseudoeintrag
    _ArrayDelete($selectiveresult, '')
    ; Meldung generieren
    $string = _ArrayToString($selectiveresult, @CRLF)
    If $UseSound = 1 Then
    SoundPlay(@WindowsDir & "\Media\notify.wav")
    EndIf
    ; Ausgabe
    TraySetToolTip("HotPrice - Suche erfolgreich!");
    ; Verwende TrayTip (Fenster am Tray) ?
    if $UseTrayTip = 1 Then
    TrayTip("Suche erfolgreich!", $string, 20)
    EndIf
    ; Verwende Informationsfenster (Nervig) ?
    if $MessageBox = 1 Then
    MsgBox(64, "HotPrice - Suche erfolgreich!", $string)
    EndIf
    EndIf
    EndIf
    EndFunc
    ; UDF: GetZackZack holt Daten von ZackZack-Homepage
    Func _GetZackZack()
    TraySetToolTip("HotPrice - Rufe neue Daten ab");
    ; ZackZack-Seite aufrufen und Quelltext ausgeben
    $source = _INetGetSource ("http://www.zack-zack.com/html/index.html")
    ; Suche nach Begrenzer für Produkte und trenne alles davor und dannach ab
    $temp = _StringExplode($source, '<div class="highlightsArea">')
    $source = $temp[1]
    $temp = _StringExplode($source, '<div id="footer">')
    $source = $temp[0]
    ; Zeilenumbrüche entfernen, übernommen aus vorherigem PHP-Script
    $source = StringReplace($source, '\r', "");
    $source = StringReplace($source, '\n', "");
    ; Produkt-ID herausbekommen
    $id = _StringBetween($source, '<span id="percent_', '">')
    ; Anzahl der Produkte herausfinden
    $anzahl = UBound($id);
    ; Verfügbarkeit der angegebenen Produkte herausfinden
    Dim $prozent[$anzahl]
    For $i = 0 to $anzahl - 1
    $percent = _StringBetween($source, '<span id="percent_' & $id[$i] & '">', '</span>')
    $prozent[$i] = $percent[0] & "%";
    Next
    ; Artikeldaten rausbekommen
    $cat = _StringBetween($source, '<div class="category">', '</div>')
    $name = _StringBetween($source, '<div class="articleName">', '</div>')
    $prs = _StringBetween($source, '<span style="font-size:18px;">nur &euro; ', '*</span>')
    ; Datenarray, welches zurückgegeben wird
    Dim $data_zack[5]
    $data_zack[0] = $name;
    $data_zack[1] = $cat;
    $data_zack[2] = $prs;
    $data_zack[3] = $prozent;
    $data_zack[4] = $id;
    Return $data_zack;
    EndFunc
    Func _GetMindStar()
    ; MindStar-Seite aufrufen und Quelltext ausgeben
    $source = _INetGetSource ("http://www.mindfactory.de/Highlights/MindStar")
    ; Konzentrieren wir uns auf die Produkte
    $temp = _StringExplode($source, 'Informationen zum MindStar:')
    $source = $temp[1]
    $temp = _StringExplode($source, '<div class="floatLeft pat10">', 1)
    $source = $temp[0]
    ; Zeilenumbrüche entfernen, übernommen aus vorherigem PHP-Script
    $source = StringReplace($source, '\r', "");
    $source = StringReplace($source, '\n', "");
    ; Benötigt werden Name, Kategorie, Preis, Prozent und ID
    ; Zuerst zum Preis
    $preise = _StringBetween($source, '<div class="floatRight size16">&euro; ', '*</div>')
    ; Nun zur Verfügbarkeit
    $temp = _StringBetween($source, '<div class="floatRight bold size11">', '</div>')
    ; Wir haben nun Stückzahl und Stückzahl pro Kunde.
    ; Wir benötigen allerdings nur die Stückzahl.
    Dim $verfg[(UBound($temp)/2)]
    For $i = 0 to UBound($temp)-1 Step 2
    _ArrayPush($verfg, $temp[$i])
    Next
    ; Nun ab zum Namen
    $name = _StringBetween($source, '" class="size9 colorblack line" title="', '"')
    ; Zu den IDs
    $id = _StringBetween($source, '<h3 class="size11 notrans"><a href="http://www.mindfactory.de/product_info.php/info/', '_')
    ; Kategorie wäre zu Bandbreitenintensiv, deshalb nicht implementiert.
    Dim $cat[UBound($preise)]
    For $i = 0 to UBound($cat)-1
    $cat[$i] = "Unbekannt"
    Next
    Dim $data_mind[5]
    $data_mind[0] = $name
    $data_mind[1] = $cat
    $data_mind[2] = $preise
    $data_mind[3] = $verfg
    $data_mind[4] = $id
    Return $data_mind
    EndFunc
    Func _RefreshDataBase()
    Dim $temp[1]
    if $UseZack == 1 Then
    _ArrayAdd($temp, _GetZackZack())
    EndIf
    if $UseMind == 1 Then
    _ArrayAdd($temp, _GetMindStar())
    EndIf
    if UBound($temp) > 1 Then
    _ArrayDelete($temp, '')
    $database = $temp[0]
    For $i = 1 to UBound($temp)-1
    $current = $temp[$i]
    For $y = 0 to UBound($database)-1
    _ArrayConcatenate($database[$y], $current[$y])
    Next
    Next
    EndIf
    EndFunc
    Func _RMHTMLChats ($string)
    $string = StringReplace($string, '&auml;','ä')
    $string = StringReplace($string, '&Auml;','Ä')
    $string = StringReplace($string, '&ouml;','ö')
    $string = StringReplace($string, '&Ouml;','Ö')
    $string = StringReplace($string, '&uuml;','ü')
    $string = StringReplace($string, '&Uuml;','Ü')
    $string = StringReplace($string, '&szlig;','ß')
    $string = StringReplace($string, '&nbsp;',' ')
    $string = StringReplace($string, '&quot;','"')
    return $string
    EndFunc

    [/autoit]

    Einmal editiert, zuletzt von ZeroAce (7. August 2011 um 22:38)