esekyl
Goto Top

Direkter Zugriff auf Ergebnisseite des php-Formulars möglich?

Hallo Freunde,

ich würde gern die Abfuhrtermine unseres hiesigen Anbieters automatisiert abrufen. Es gibt auf deren Homepage ein Formular, das auch bei Klick auf Ort und Straße die Termine ausspuckt. Ich weiß aus dem Quelltext, welche Variablen mit welchen Werten übergeben werden. Es reicht aber anscheinend nicht, diese Variablen mit der URL zu übertragen um auf die Ergebnisseite zu kommen, es bleibt bei der Anzeige der Formularseite. Hat vielleicht jemand eine Idee, wie ich das Formular "austricksen" kann?

Es handelt sich um dieses Formular: https://www.zaw-online.de/wastel/api/calendar.php (Klick auf "Individueller Kalender")

Vielen Dank!!

Gruß, Tim

Content-Key: 608289

Url: https://administrator.de/contentid/608289

Ausgedruckt am: 19.03.2024 um 10:03 Uhr

Mitglied: falscher-sperrstatus
falscher-sperrstatus 27.09.2020 aktualisiert um 17:54:04 Uhr
Goto Top
Hallo Tim,

parse doch einfach die KalenderUrl.

e.g https://www.zaw-online.de/wastel/api/ical.php?&ticket=c3RyZWV0SUQ9OD ...

da holst du dann die Daten raus und gut ist.

Grüße, Schönen Sonntag,

Christian
Mitglied: maretz
maretz 27.09.2020 um 17:17:04 Uhr
Goto Top
Nun - wenn die auch nur ETWAS Ahnung haben beim Erstellen der Seite würde man ja auf der ersten Seite eben nich nur deine 2-3 Felderchen erstellen sondern auch ne Session starten. Auf der Ergebnisseite prüft man halt dann nur nach ob die Session gestartet wurde - wenn nicht gibts halt auch ne Abfuhr... (das wäre jetzt noch nich mal so die richtige "Schutzfunktion", aber so als unterstes Minimum...). Damit kannst du natürlich nich einfach zur Ergebnisseite gehen ohne ne gültige Session zu besitzen...
Mitglied: Esekyl
Esekyl 27.09.2020 um 17:20:30 Uhr
Goto Top
Ja, dachte mir schon, dass die Ticket-Variable so eine Art Session darstellt. Man kann die Tickets teilweise auch nicht einfach kopieren und im anderen Fenster weiterverwenden. Nun ja, Christians Antwort ist auf jeden Fall die "Notlösung"...
Mitglied: 145916
Lösung 145916 27.09.2020 aktualisiert um 17:58:07 Uhr
Goto Top
Ich würde auch die ICAL Files parsen, wenn du aber unbedingt die HTML Seite haben willst, bitte

Powershell Code
[System.Net.ServicePointManager]::SecurityProtocol = 'Tls','Tls11','Tls12'  
$page = iwr 'https://www.zaw-online.de/wastel/api/calendar.php' -SessionVariable session  
$result = iwr "https://www.zaw-online.de/wastel/api/calendar.php?$([regex]::match($page.Content,'(?is)url\s*:\s*".*?(ticket=[^"]+)').Groups[1].Value)" -Method Post -ContentType 'application/x-www-form-urlencoded' -Body @{filterFormData = 'wastelOrt=MQ&wastelStreet=Nzc0MQ&dateStart=01.01.2020&dateEnd=31.12.2020&artid%5B%5D=Mw&artid%5B%5D=NA&artid%5B%5D=Mg&artid%5B%5D=MQ&artid%5B%5D=NQ&excludeweekly=1&alarmtime=-1'} -WebSession $session  
$result.ParsedHtml.getElementById('termineTable').getElementsByTagName("tr") | %{  
    [pscustomobject]@{Datum = $_.children[1].innerText; Termin = $_.children[2].innerText; Hinweis = $_.children[3].innerText}
}
Hab dir die Tabelle schon passend geparst und in ein Object verwandelt.

Ausgabe des Objekts dann ähnlich wie
Datum      Termin          Hinweis                        
-----      ------          -------                        
07.01.2020 Biomüll         -alle Größen-                  
10.01.2020 Restmüll        Tonnen und Container 14-täglich
11.01.2020 Schadstoffmobil                                
20.01.2020 Papier          Tonnen und Container           
21.01.2020 Biomüll         -alle Größen-                  
21.01.2020 Gelber Sack     -alle Größen-                  
24.01.2020 Restmüll        Tonnen und Container 14-täglich
04.02.2020 Biomüll         -alle Größen-                  
07.02.2020 Restmüll        Tonnen und Container 14-täglich
17.02.2020 Papier          Tonnen und Container           
18.02.2020 Biomüll         -alle Größen-                  
18.02.2020 Gelber Sack     -alle Größen-                  
21.02.2020 Restmüll        Tonnen und Container 14-täglich
03.03.2020 Biomüll         -alle Größen-                  
06.03.2020 Restmüll        Tonnen und Container 14-täglich
07.03.2020 Schadstoffmobil                                
16.03.2020 Papier          Tonnen und Container   

Filter-String für filterFormData einfach mit F12 in den Developer Tools rausfischen
Mitglied: Esekyl
Esekyl 27.09.2020 um 19:01:19 Uhr
Goto Top
Wow, Danke für die Arbeit! Sehr cool! iCal geht zwar, wäre aber ein Problem zu automatisieren, wenn sich etwas ändert. Diese Lösung ist viel besser...
Mitglied: 145916
145916 27.09.2020 aktualisiert um 19:28:32 Uhr
Goto Top
Zitat von @Esekyl:
iCal geht zwar, wäre aber ein Problem zu automatisieren,
Äh nö, ist besser da sich das Format selbst nicht ändert, im Gegensatz zu HTML-Seiten und Tabellen etc.
wenn sich etwas ändert. Diese Lösung ist viel besser...
Wenn sich die HTML-Seite ändert funktioniert der Code oben eben auch nicht mehr, nur zur Info!
Mitglied: maretz
maretz 27.09.2020 um 19:33:48 Uhr
Goto Top
mal ne blöde frage - aber wofür das ganze? Ich würde einfach den Kalender in meinen normalen Kalender importieren (hab ich z.B. auch gemacht) - und bekomme so ne errinnerung 1 tag vorher und morgens... würde mich daher einfach mal interessieren wofür der umweg über das ganze rumgeparse...
Mitglied: 145916
145916 27.09.2020 aktualisiert um 19:37:33 Uhr
Goto Top
Zitat von @maretz:

mal ne blöde frage - aber wofür das ganze? Ich würde einfach den Kalender in meinen normalen Kalender importieren (hab ich z.B. auch gemacht) - und bekomme so ne errinnerung 1 tag vorher und morgens... würde mich daher einfach mal interessieren wofür der umweg über das ganze rumgeparse...
Versteh ich auch nicht, vielleicht will der das ganze ja woanders hin schreiben warum auch immer, k.A. weiß der Geier, sein Bier.
Mitglied: maretz
maretz 27.09.2020 um 19:51:35 Uhr
Goto Top
deshalb frag ich ja - kann ja sein das es gute ideen sind ... geht nich darum das er es sein lässt sondern nur darum das es mich interessiert wofür das ganze ....
Mitglied: Esekyl
Esekyl 27.09.2020 um 20:39:49 Uhr
Goto Top
Hey, also ich baue einen Screen, um an der Haustür anzeigen zu lassen, welche Fenster offen sind, sonstige Alarme usw. und eben auch eine Anzeige, welcher Müll raus muss. Ich will aber nicht manuell irgendwelche Daten neu einlesen, sondern die Termine über ein Script regelmäßig, aber sehr selten, in eine Textdatei schreiben lassen. Aus dieser holt dann der Screen seine Info, was die nächsten Tage dran ist.

Das Problem an der iCal-Variante war nicht iCal selbst, sondern die ledigliche Nutzung des "ticket"s, statt der Variablen. Sofern sich also an der Webseite nichts ändert, funktioniert es also mit der Übergabe der Variablen wahrscheinlich für Jahre problemlos.

Jetzt muss ich nur noch die PowerShell Commands für curl übersetzen, weil auf dem Screen Linux läuft. Ich weiß zwar im Groben, was deine iwr-Commands machen, bin aber mit curl nicht so vertraut.

Danke Euch beiden!
Mitglied: 145916
Lösung 145916 28.09.2020 um 12:49:20 Uhr
Goto Top
Zitat von @Esekyl:
Jetzt muss ich nur noch die PowerShell Commands für curl übersetzen, weil auf dem Screen Linux läuft. Ich weiß zwar im Groben, was deine iwr-Commands machen, bin aber mit curl nicht so vertraut.
Auch kein Thema
#!/bin/bash
URL=$(curl -s 'https://www.zaw-online.de/wastel/api/calendar.php' | grep -Po '(?is)url : ".*?ticket=[^"]+' | cut -d '"' -f2 | head -n1)  
DATA='filterFormData=wastelOrt=MQ&wastelStreet=Nzc0MQ&dateStart=01.01.2020&dateEnd=31.12.2020&artid%5B%5D=Mw&artid%5B%5D=NA&artid%5B%5D=Mg&artid%5B%5D=MQ&artid%5B%5D=NQ&excludeweekly=1&alarmtime=-1'  
curl -s -X POST --data-urlencode "$DATA" -H "Content-Type: application/x-www-form-urlencoded" "$URL" | xmllint --html -xpath "//table[@id='termineTable']" -  
Mitglied: Esekyl
Esekyl 28.09.2020 um 12:59:39 Uhr
Goto Top
Wow, das hätte mich Tage gekostet. Danke nochmals und vielmals!

Du holst dir also ein Sessionticket und postest die Daten dann mitsamt diesem Ticket an den Server, der dir dann die Daten ausgibt. Soweit einigermaßen klar. Xmllint war mir gänzlich unbekannt, da wäre ich wohl dran gescheitert. Es sei denn, in der curl-Ausgabe wäre das Ergebnis schon enthalten. Dann hätte ich mir die Daten gegrept. So ist es natürlich noch viel geiler.
Mitglied: 145916
145916 28.09.2020 aktualisiert um 13:07:23 Uhr
Goto Top
Zitat von @Esekyl:
Du holst dir also ein Sessionticket
Ja vermutlich ein "pseudo" Ticket, offensichtlich ändert sich das für die Abfrage über Ajax aber gar nicht, zumindest nicht seit gestern. Aber vielleicht in größeren Abständen, naja seis drum, das Skript liest sich die Ajax POST-URL aus dem JavaScript-Part der Seite aus.
Xmllint war mir gänzlich unbekannt, da wäre ich wohl dran gescheitert.
XMLlint ist eigentlich ein XML Parser der aber auch HTML mit XPATH-Syntax auslesen kann, ist meist zuverlässiger.