Neue Version von HTTPMOD mit neuen Features zum Testen

Begonnen von StefanStrobel, 05 Dezember 2015, 08:31:32

Vorheriges Thema - Nächstes Thema

Vize

Guten Abend zusammen,

ich habe heute nochmal ein wenig getüftelt mit der Website meines Speichers, aber ich komme irgendwie nicht weiter...  :(
Insbesondere, was die Umsetzung mit einem notwendigen login plus cookie angeht.

Ich habe zwar schon hier und hier einiges dazu gelesen, aber ich steh trotzdem noch auf dem Schlauch.

Ich weiß z.B. einfach nicht, wie die Attribute für sidHeader, sidURL, sidData aussehen müssen...

Hier nochmal die konkreten Daten aus dem Firefox Inspektor...mit der Burp Suite komm ich irgendwie nicht an die Sachen, da die Seite damit nicht ordentlich läd.

Also,
zuerst habe ich die login-Seite im browser aufgerufen:
https://mein-senec.de/monitoring/

Dort finde ich dann folgendes in der Netzwerkanalyse:
Anfragemethode GET

Anfragekopfzeilen:
Host: mein-senec.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Connection: keep-alive


Dann habe ich die Elemente für E-mail und Passwort ausgewählt, um den html-Abschnitt zu bekommen.
Dazu siehe die Bildanhänge.

Nach Eingabe von E-mail und Passwort wird wohl erstmal folgende Seite geladen:
https://mein-senec.de/monitoring/json/auth/login.php

Dort finde ich dann folgendes in der Netzwerkanalyse:
Anfragemethode POST

Anfragekopfzeilen:
Host: mein-senec.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: application/json, text/plain, */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Content-Type: application/json;charset=utf-8
Referer: https://mein-senec.de/monitoring/
Content-Length: 59
Connection: keep-alive

Antwortkopfzeilen:
Connection: Keep-Alive
Content-Length: 17
Content-Type: application/json
Date: Fri, 29 Apr 2016 19:34:39 GMT
Expires: Fri, 29 Apr 2016 20:34:39 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.10 (Debian)
Set-Cookie: ies_sessid=5723b74f77d35; path=/
ies_secret=GCShrhUc6MWKlU5r; path=/


Weiterhin stehen unter dem Reiter "Cookies" im Inspektor die Set-Cookies von oben als Antwort-Cookies und unter Parameter email und password im Klartext.

Dann wird die Übersichtseite mit den Werten geladen:
https://mein-senec.de/monitoring/json/status/getstatusoverview.php?id=XXXXXXXXXXXXXX

Dort finde ich dann folgendes in der Netzwerkanalyse:
Anfragemethode GET

Anfragekopfzeilen:
Host: mein-senec.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0
Accept: application/json, text/plain, */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate, br
Referer: https://mein-senec.de/monitoring/
Cookie: ies_sessid=5723b74f77d35; ies_secret=GCShrhUc6MWKlU5r
Connection: keep-alive

Antwortkopfzeilen:
Connection: Keep-Alive
Content-Length: 532
Content-Type: application/json
Date: Fri, 29 Apr 2016 19:34:40 GMT
Expires: Fri, 29 Apr 2016 18:34:40 GMT
Keep-Alive: timeout=5, max=96
Server: Apache/2.4.10 (Debian)


Hier stehen im Inspektor unter "Cookies" die oben genannten cookies als Anfrage-Cookies und unter Antwort die Werte, die ich auslesen möchte.

Kann mir hierbei jemand helfen, wie ich ein entsprechendes HTTPMOD aufbauen muss, um an die Werte zu kommen?

Vielen Dank schonmal!!!

Gruß
Andreas

StefanStrobel

#166
Hallo Andreas,

da Deine Site offensichtlich Cookies verwendet, ist es schonmal hilfreich das Cookie-Handling Bei HTTPMOD anzuschalten.
Dann benötigst Du eine Regex zum Erkennen, dass ein Login benötigt wird.
Dann musst Du als Login-Step (sid01 etc) genau die Daten an die Site schicken, die auch Dein Browser beim Absenden des Formulars mit Username und Passwort sendet.

Gruss
    Stefan

Vize

Hallo zusammen,

danke erstmal an Stefan für die Tipps, aber ich krieg es nicht auf die Kette...wahrscheinlich bin ich zu doof dafür... :-[
Ich muss wohl mal an die Hand genommen werden...  :'(

DEF HTTPMOD
https://mein-senec.de/monitoring/json/status/getstatusoverview.php?id=meineID 60

Diese Attribute habe ich mal gesetzt:
enableCookies 1
reAuthRegex .*fehlgeschlagen.*
sid1Data "email":"meine@email.de","password":"meinpasswort"
sid1Header1 Content-Type: text/html,application/xhtml+xml,application/xml
sid1URL https://mein-senec.de/monitoring/


Im buf erscheint daraufhin aber immer noch:
HTTP/1.1 403 Forbidden Date: Mon, 02 May 2016 17:20:32 GMT Server: Apache/2.4.10 (Debian) Expires: Mon, 02 May 2016 16:20:32 GMT Content-Length: 1 Content-Type: application/json

Ich hab dann mal mit Burp - funktioniert nun - das Ganze mitgeschnitten und ein paar scrennshots angehängt.

Rufe ich die Seite https://mein-senec.de/monitoring auf, wird erstmal im Hintergrund die Seite /monitoring/json/auth/userdata.php angefordert.
Mit Fehler 403, da ja noch keine login-Daten da sind. (s. Anhänge 01_Burp_xxx).

Dann gebe ich user (e-mail-Adresse) und Passwort ein, und es wird die Seite /monitoring/json/auth/login.php aufgerufen.
Im request dazu stehen e-mail und Passwort, im response dann eine Erfolgsmeldung, und es werden zwei cookies generiert (s. Anhänge 02_Burp_xxx).

Danach gehts dann nochmal auf die Seite /monitoring/json/auth/userdata.php, und die Benutzerdaten werden dort verarbeitet/geholt(?) (s. Anhang 03_Burp_xxx).

Dann wird die Seite /monitoring/json/status/getstatusoverview.php?id=meineID geladen, die im response die interessenten Daten enthält (s. Anhänge 04_Burp_xxx).

So, nun steh ich da und weiß, ehrlich gesagt, nicht, was ich machen soll bzw. wie ich ein entsprechenden HTTPMOD aufbauen kann, um an die Daten zu gelangen... :-[

Vielleicht kann mir ja jemand helfen, oder es mir möglichst einfach und verständlich erklären...
Ich hab leider keine Idee, wie ich weiterkomme.

Vielen Dank schonmal!

Gruß
Andreas

StefanStrobel

Hallo Andreas,

drei Fehler fallen mir spontan auf:

1) Der Post-Request, in dem die Login-Daten stehen, sollte laut Burp Mitschnitt an https://meine-senec.de/monitoring/json/auth/login.php gehen.
In Deiner Konfig hast Du für den ersten Authentisierungsschritt aber sid1URL https://mein-senec.de/monitoring/ angegeben.

2) Die Login-Daten werden laut Burp als Post Daten mit {"email":"xy", "Password":"geheim"} gesendet.
In Deiner Konfig steht aber  sid1Data "email":"meine@email.de","password":"meinpasswort". Da fehlen die geschweiften Klammern.

3) Die Header, die Du mitschickst stimmen auch nicht mit den Headern aus dem Burp-Mitschnitt Login_request überein.

Ich hoffe das hilft Dir weiter.

Gruss
    Stefan

Vize

Zitat von: StefanStrobel am 04 Mai 2016, 18:19:52
Der Post-Request, in dem die Login-Daten stehen, sollte laut Burp Mitschnitt an https://meine-senec.de/monitoring/json/auth/login.php gehen.
In Deiner Konfig hast Du für den ersten Authentisierungsschritt aber sid1URL https://mein-senec.de/monitoring/ angegeben.

Hallo Stefan,

erstmal vielen Dank für deine Tipps und Mithilfe!

Dann hab ich das wohl etwas falsch verstanden...ich dachte als sid1URL muss ich die Seite angeben, auf der ich die Zugangsdaten eingebe...

Ich werd mal weiter testen und berichten.

Gruß
Andreas

Vize

#170
Horrido, es läuft!!!

Danke nochmal für deine Hilfe Stefan!

Also, hier nochmal kurz zusammengefasst:

1.)
DEF des HTTPMOD:
https://mein-senec.de/monitoring/json/status/getstatusoverview.php?id=<MEINEID> <Intervall>

2.)
folgende Atrribute setzen, damit die Werte ausgelesen und (erstmal) sämtliche Readings gesetzt werden:

enableCookies 1
extractAllJSON 1
reAuthRegex {"success":false}
sid1Data   {"email":"<email>","password":"<Passwort>"}
sid1Header1 Content-Type: application/json
sid1Header2 Accept: */*
sid1URL    https://mein-senec.de/monitoring/json/auth/login.php


***EDIT***
Folgendes Attribut muss noch unbedingt gesetzt werden, hatte ich irgendwie vergessen:
requestHeader1  Cookie: ies_sessid=<cookie1>; ies_secret=<cookie2>

Die jeweils entsprechende Bezeichnung von <cookieX> kann man mit burp oder den Entwicklertools der browser ermitteln.

***ENDE EDIT***

Dann kann man noch nach Belieben seine Readings auswählen und anpassen...

Vielleicht kann es ja noch jemand gebrauchen...Viel Erfolg!

Gruß
Andreas

SirUli

Hi Stefan,

ich wollte nochmal fragen ob das vielleicht machbar wäre?
Zitat von: SirUli am 29 Januar 2016, 23:33:391. MaxAgeReplacementMode: Wäre super wenn man dort auch "reading" nehmen könnte, sodass ich den Wert auf ein anderes Reading setzen könnte. Anwendungsfall wäre die Anzeige von Straßenbahn-Abfahrtszeiten. Meist wird die "Live-Anzeige" mitgeliefert, jedoch ab und an eben nicht. Dann wäre es super, wenn ich das Reading auf die "Fahrplan-Zeit" setzen könnte

Tausend Dank im Voraus!

Viele Grüße,
Uli

StefanStrobel

Hallo,

anbei eine neue Version zum Testen.

Neue Features sind:
- alignTime
- neue MaxAgeReplacementMode-Optionen reading und internal

bereits in der letzten Zwischenversion:

- DeleteIfUnmatched
- DeleteOnError

Gruss
    Stefan

frank

#173
hallo stefan,

1. getXdeleteIfUnmatched: ich habe nun endlich mal das neue getXdeleteIfUnmatched testen können. im prinzip funktioniert es wohl bestens. aber leider überlebt es keinen fhem restart. getestet habe ich immer mit reread und geänderter regex, womit ich entweder 11 oder 15 readings bekomme. vor restart waren es 15 readings und nach restart mit geänderter regex wurden die ersten 11 readings erneuert und die weiteren 4 "alten" readings sind erhalten geblieben. kann dieses verhalten noch verbessert werden?

2. getXPoll: um machmal ein oder mehrere gets aus einem sammel-request zu entfernen wollte ich getXPoll=0 nutzen. das zeigt zumindestens mit reread keine wirkung. erst wenn ich die jeweiligen poll attribute lösche, werden die entsprechenden gets beim sammel-request unterdrückt/ausgelassen.
ist das so beabsichtigt?
gibt es eigentlich auch eine möglichkeit nach dem "abwählen" eines einzelnen gets, die bereits entstandenen readings des korrespondierenden gets zu löschen? getXDeleteIfUnmatched reagiert zumindestens nicht darauf.

3. zyklische requests: ist es richtig, dass der automatische zyklus der requests, die nur aus getX-definitionen bestehen, erst durch "set start" aktiviert wird? in der def steht zb "none 86400". bei definition mit readingXName wurde der zyklus, meine ich, bereits durch die definition selbst aktiviert. allerdings steht dort auch die url in der def.

4. alignTime scheint gut zu funktionieren. zumindestens wird im internal von triggertime immer der korrekte zeitpunkt gesetzt.

5. getXDeleteOnError muss ich noch testen.
edit: getxDeleteOnError funktioniert auch grundsätzlich. aber hier gibt es auch die probleme mit fhem restart. readings von vor dem restart werden nicht gelöscht, wurden wohl "vergessen". ausserdem wird leider das reading LAST_REQUEST nicht gesetzt, wenn ein get einen fehler erzeugt. kannst du das eventuell noch ergänzen?

edit2: eigentlich müsste sogar der fehler, oder zumindestens ein hinweis auf einen fehler, in LAST_REQUEST erscheinen (zb "get1:error"), um die möglichkeit zum einsammeln eventueller fehlermeldungen zu haben. um den kompletten ablauf einfach kontrollieren/überwachen zu können, wäre zb ein kombiniertes state (bisher: last_request) reading ideal. ein request mit 4 gets könnte dann zb im reading so aussehen => get1:match => get2:unmatch => get3:error => get4:match. dann müsste man nur ein reading überwachen und könnte ggf nach jedem trigger in den anderen control readings nähere infos einsehen. noch einfacher, zumindestens für den user, wäre es, alle infos direkt im "state"-reading zu haben, nicht nur der hinweis auf error, match oder unmatch.

danke,
gruss frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

StefanStrobel

Hallo Frank,

vielen Dank für das detaillierte Testen!
Das mit dem Restart hat leider zur Folge, dass ich den Mechanismus nochmal neu implementieren muss. So wie ich es bisher implementiert habe, merkt sich das Modul die relevanten Daten in einem Hash, der natürlich nach einem Restart nicht mehr existiert.
Ich bau das nochmal um und behebe dann auch die anderen Bugs, die Du gefunden hast :-)

In den nächsten Wochen werde ich aber leider noch nicht dazu kommen.

Gruss
    Stefan

frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

brembs

Zitat von: Vize am 04 Mai 2016, 21:44:31
Dann kann man noch nach Belieben seine Readings auswählen und anpassen...

Sehr genial, vielen Dank. Habe das jetzt erstmal so ohne Readings eingerichtet, bekomme aber diese drei Fehlermeldungen:

2016.05.16 14:54:46 3: SENEC: error while parsing JSON data: malformed JSON string, neither array, object, number, string or atom, at character offset 1 (before "(end of string)") at (eval 491) line 1
2016.05.16 14:54:46 3: SENEC: no parsed JSON structure available
2016.05.16 14:54:46 3: SENEC: Read response to update didn't match any Reading


Stimmt das alles so ohne Readings?

Tueftler1983

#177
Hallo ich würde gerne auf dem Webserver meines AVR NET IO auf dem die e2000 Firmware läuft die Pool Pumpe schalten und den Status der Pumpe und des Filters auslesen.
Geht das beides mit httpmod?
Im buffer bekomme ich folgendes
HTTP/1.1 200 OK <html><head><title>E2000-NET-IO</title></head> <body text=white link=white alink=white vlink=white bgcolor=black><font face='Courier New'><h1>E2000-NET-IO</h1> <div style='background:#333;float:left;margin:5px'><a href='p0'>POOL Pum</a></div> <div style='float:left;margin:5px'><a href='p1'>Pool Lic</a></div> <div style='float:left;margin:5px'><a href='p2'>Temperat</a></div> <div style='float:left;margin:5px'><a href='p3'>Garten</a></div> <div style='float:left;margin:5px'><a href='p4'>Carport</a></div> <div style='float:left;margin:5px'><a href='p5'></a></div> <div style='float:left;margin:5px'><a href='s '>Status</a></div><table style='clear:both;width:400px'> <tr><td>Pool Aut</td><td><a href='p0?t000'>Tast</a></td></tr> <tr><td>Pool Man</td><td><a href='p0?t001'>Tast</a></td></tr> <tr><td>Pool M E</td><td>Off</td></tr> <tr><td>Pool P E</td><td>Off</td></tr> <tr><td>Filter</td><td>Off</td></tr> <tr><td>Pumpe AE</td><td>Off</td></tr> </table><p>Created by <a href='http://elektronik2000.de/'>Elektronik2000.de</a></p> <meta http-equiv='refresh' content='3; URL=?'></font></body></html>

Das: Pool Aut</td><td><a href='p0?t000' ist der Taster für die Automatik
Das: Pool Man</td><td><a href='p0?t001' ist der Taster für manuelles einschalten der Pumpe.
Das: Pumpe AE</td><td>On ist der Status für die Automatik
Das: Pool M E</td><td>On ist der Status für den Manuellen Betrieb
Das: Pool P E</td><td>On ist der Status ob die Pumpe läuft
Das: Filter</td><td>Off ist die Meldung das der Filter gespült werden muss
Der direkte http Aufruf zum schalten des Automatik Betriebes sieht so aus: http://192.168.2.90/p0?t000

Hoffe die Infos helfen bei meiner fragestellung.

Tueftler1983

Soweit sogut Status auslesen klappt mit [code(?s).*?Pool A E.*?(Off|On).*?]

Jetzt noch gucken wie ich über httpmod schalten kann

Vize

#179
Hallo zusammen,

hatte nach dem post über die Fehlermeldung von Björn (brembs) zwar schon mit ihm per PN diskutiert, aber möchte das hier auch nochmal anführen.
Da er wohl Probleme mit dem login per HTTPMOD auf der mein-senec.de Seite hat, habe ich bei mir testweise mal ein zweites - zu meinem funktionierenden völlig identisches - HTTPMOD-Device angelegt.

Das Kuriose ist nun, dass damit der login und der Datenabruf - wie bei brembs - nicht funktioniert...
Mein erstes HTTPMOD-Device funktioniert dagegen tadellos. Hab's hundert Mal geprüft...die devices sind komplett identisch.
Dann habe ich mal ein weiteres HTTPMOD-Device mit meinen funktionierenden login-Daten auf eine andere Unterseite des Portals angelegt, und auch hier funktioniert es nicht.

Gibt es dafür irgendeine (logische) Erklärung?

Gruß
Andreas

***Edit***
Im Anhang mal zwei screenshots aus burp von der anderen Unterseite des Portals, an deren Daten ich nicht komme...