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
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
; =============================================================================
; 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 € ', '*</span>')
; Leerzeichen korrigieren
For $i = 0 to $anzahl - 1
$name[$i] = Stringreplace($name[$i], " ", " ")
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