[HTTPMOD] HTTP-Request POST anstatt GET

Begonnen von Pi_01, 19 April 2020, 20:15:08

Vorheriges Thema - Nächstes Thema

Pi_01

Hallo!
Der HTTPMOD eignet sich hervorragend, um ganze Webseiten auszulesen.

Voraussetzung: man kennt die vollständige URL (z.B. http://testseite.de/index.php?unterseite=1234)

Bei manchen Webseiten werden die Variablen jedoch nicht mit dem GET-Befehl übergeben, sondern mit POST.
In so einem Fall ändert sich meist die URL nicht, selbst wenn man zu einer Unterseite wechselt.
Mögliches Szenario:
- Aufruf der Homepage http://testseite.de
- Über ein Dropdown-Menü wird "Unterseite 1234" selektiert
- Die Webseite ruft die zuvor ausgewählte Unterseite 1234 auf, die URL bleibt jedoch umverändert (http://testseite.de)

Hat man mit dem HTTPMOD nun trotzdem eine Chance, auf den Inhalt von Unterseite 1234 zuzugreifen, wenn KEIN Direktzugriff über die GET-Methode (http://testseite.de/index.php?unterseite=1234) möglich ist?


amenomade

Die POST Request kannst Du auch nachbauen.

Wahrscheinlich wird es dein Problem aber nicht lösen. Nach dem POST gibt es bestimmt ein oder mehrere GETs. Das musst du genauer in Burp oder in der Console des Browser schauen und nachbauen.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Pi_01

Konkret handelt es sich um die URL https://bskv.sportwinner.de/

In der oberen Leiste befindet sich ein Navigationsmenü, und je nachdem was man auswählt, werden Untermenüs geladen. Und irgendwann landet man auf dem Inhalt.

Ich hab mir jetzt mal im Quellcode umgesehen, und werde einfach nicht schlau, wo welche Parameter übergeben werden.

Welche dynamische Scriptsprache steckt eigentlich dahinter? Ich vermute, PHP wird es nicht sein.

amenomade

#3
defmod ligua HTTPMOD https://bskv.sportwinner.de/php/bskv/service.php 0
attr ligua enableControlSet 1
attr ligua get01Data command=GetSchnitt&id_mandant=1&id_saison=5&id_klub=0&id_liga=1699&nr_spieltag=100&group=0&sort=2&anzahl=1
attr ligua get01Encode utf8
attr ligua get01Name MBayernNord
attr ligua getHeader01 Accept: application/json, text/javascript, */*;; q=0.01
attr ligua getHeader02 Origin: https://bskv.sportwinner.de
attr ligua getHeader03 Referer: https://bskv.sportwinner.de/
attr ligua getHeader04 User-Agent: Mozilla/5.0
attr ligua showBody 1


get ligua MBayernNord
Siehe "body" Internal. Viel Spaß :)

EDIT: Oops, hab was vergessen. Warte mal....
EDIT2: OK. Jetzt ist es korrigiert
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Kannst ruhig erweitern (ich weiss nicht genau, welche Daten dich interessieren):
attr ligua get02Data command=GetSpieltagArray&id_mandant=1&id_saison=5&id_liga=1638
attr ligua get02Encode utf8
attr ligua get02Name MBayernNord_Spieltag

attr ligua get03Data command=GetSpiel&id_mandant=1&id_saison=5&id_klub=0&id_land=1&id_bezirk=4&id_kreis=7&id_liga=1638&id_spieltag=0&favorit=&art_bezirk=1&art_kreis=1&art_liga=0&art_spieltag=0
attr ligua get03Encode utf8
attr ligua get03Name MBayernNord_Spiel

attr ligua get04Data command=GetTabelle&id_mandant=1&id_saison=5&id_liga=1638&nr_spieltag=100&sort=0
attr ligua get04Encode utf8
attr ligua get04Name MBayernNord_Tabelle

attr ligua get05Data command=GetRekord&id_mandant=1&id_saison=5&id_liga=1638&nr_spieltag=100
attr ligua get05Encode utf8
attr ligua get05Name MBayernNord_Rekord

Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Pi_01

@amenomade: du bist echt ein Freak, danke!

Kannst du mir verraten, wie du an die Informationen heran gekommen bist?

Wo ist der Zusatz "/php/bskv/service.php" versteckt?

Und wo im Quellcode befinden sich die Variablen "command=GetSchnitt&id_mandant=1&id_saison=5&id_klub=0&id_liga=1699&nr_spieltag=100&group=0&sort=2&anzahl=1"?
Ich selbst konnte die Verlinkung nicht sehen. Oder ist das irgendeine JavaScript-Lösung? (hab damit kaum Erfahrung)

Und warum funktioniert folgender Aufruf nicht:
https://bskv.sportwinner.de/php/bskv/service.php?command=GetSchnitt&id_mandant=1&id_saison=5&id_klub=0&id_liga=1699&nr_spieltag=100&group=0&sort=2&anzahl=1

Und noch eine letzte Frage:
Sind die Angaben

getHeader01 Accept:
getHeader02 Origin:
getHeader03 Referer:
getHeader04 User-Agent:

... zwingend notwendig? Was bewirken diese?

Pi_01

Ich bin jetzt einen Schritt weiter, der Aufruf der PHP-Seite wird anscheinend mit Javascript gesteuert.
Und zwar in der Datei:
https://bskv.sportwinner.de/script/bskv/sportwinner.js

Codeschnipsel:
// Tabelle laden
//
$.post("/php/bskv/service.php", {
command: "GetTabelle",
id_mandant: Globals.Mandant.Id,
id_saison: Settings.Saison.Id || 0,
id_liga: Settings.Liga.Id || 0,
nr_spieltag: Settings.Spieltag.Nummer || 100,
sort: id_tabelle_sort
},


D.h. es wird die Datei ...service.php aufgerufen, mit den Parametern command, id_mandant, id_saison, id_liga, nr_spieltag und sort.

@amenomade: mir ist jetzt aber nicht klar, wo du die Variablenwerte abgerufen hast.
Beispiel:

attr ligua get04Data command=GetTabelle&id_mandant=1&id_saison=5&id_liga=1638&nr_spieltag=100&sort=0

Woher hast du z.B. den Wert "5" (id_saison"), oder den Wert "1638" (id_liga)?

amenomade

Wie schon oben gesagt: Browser Console (F12), dann Reiter Netzwerk.
Siehe Bild (sorry, bei mir auf Französisch ;) )
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Zitat von: Pi_01 am 20 April 2020, 07:50:52
Und warum funktioniert folgender Aufruf nicht:
https://bskv.sportwinner.de/php/bskv/service.php?command=GetSchnitt&id_mandant=1&id_saison=5&id_klub=0&id_liga=1699&nr_spieltag=100&group=0&sort=2&anzahl=1

Und noch eine letzte Frage:
Sind die Angaben

getHeader01 Accept:
getHeader02 Origin:
getHeader03 Referer:
getHeader04 User-Agent:

... zwingend notwendig? Was bewirken diese?
Vielleicht sind die nicht alle nötig, aber Origin und Referer wahrscheinlich schon, da die dem Server sagen, dass es von der Hauptwebseite gerufen wurde. Und deswegen funktioniert den direkten Aufruf auch nicht, da dein Browser die entspr. Headers bei direktem Aufruf nicht mitschickt. Nur wenn von der Hauptseite aufgerufen.

Die findest Du übrigens auch in der Browser Console. Siehe Bild
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Pi_01

Sorry, wenn ich jetzt schon wieder nerve.

Der Code
get ligua MBayernNord

liefert mir den Inhalt als httpbody auf der FHEM-Weboberfläche zurück:

[["235812","20.03.2020","20:30","Blau Wei\u00df Mauern 2","0","0","SV Lengfeld 2","0","0","offen",""],["235813","21.03.2020","13:00","TSV Siegenburg 2","0","0","TSV Rohr 3","0","0","offen",""],["235815","21.03.2020","15:00","TSV Sandelzhausen 2","0","0","Bahnfrei Saal","0","0","offen",""],["235814","22.03.2020","13:30","SpG FAB Befr.halle 3","0","0","TSV Offenstetten","0","0","offen",""]]

Wie kann ich den Inhalt aber z.B. über das stateFormat ausgeben lassen?

Oder noch besser: wie kann ich den Inhalt an ein PERL-Script übergeben?

Im Wiki ist von "attr test2 get01JSON" die Rede, was aber bei mir nicht funktioniert.

amenomade

In Readings mit readingXXname und readingXXJSON oder readingXXRegex => Siehe CommandRef
Oder mit extractAllJSON. Wird aber kompliziert mit so vielen Tabellen, die einzelne Readings miteinander zu verknüpfen.

An ein Perl-Script: mehrere Möglichkeiten:
- über Readings mit ReadingsVal(). Siehe oben für die Readings
- direkt das ganze Internal: InternalVal("ligua","httpbody", ""). Da musst Du aber sicherstellen, dass die Abfrage fertig ist und http200 zurückgeliefert hat
- über  $defs{"ligua"}{"httpbody"} gehen, aber das ist nichts anders als InternatVal() ohne DefaultValue

Ich empfehle nochattr ligua get01Encode utf8 damit die komische \u00df o.ä verschwinden

Die Abfragen kannst Du automatisieren, damit nicht jedes Mal ein get nötig ist. Siehe getXXPoll und getXXPollDelay Attribute in CommandRef
Wenn Du nur eine der Tabellen brauchst, kannst Du auch die URL und ein Interval in DEF eintragen
Also.. CommandRef oder Wiki ist empfohlen.
https://fhem.de/commandref.html#HTTPMOD
https://wiki.fhem.de/wiki/HTTPMOD
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus