Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

reibuehl

Hallo Stefan,

im Inspector in Firefox sehe ich als Form Parameter:

guid:"750d018a-e091-49ff-a860-5c1ef1e523e8"

Müssen dann da noch die geschweiften Klammern drum?
Reiner.

Cruiser79

Zitat von: Reiner am 31 Januar 2016, 22:08:07
Hallo Stefan,

im Inspector in Firefox sehe ich als Form Parameter:

guid:"750d018a-e091-49ff-a860-5c1ef1e523e8"

Müssen dann da noch die geschweiften Klammern drum?

Müsste doch
attr httpmodReq1 requestData guid=750d018a-e091-49ff-a860-5c1ef1e523e8
heissen?
Ansonsten wird vielleicht noch mehr verlangt beim POST. Könntest dir das Firefox Addon HttpFox installieren und dann den Request damit "aufzeichnen". Da siehst du dann, wie genau die Anfrage an den Server aussehen muss.

Gruß,
Tim
FHEM auf Raspberry Pi
HM-CFG-LAN mit HM-TC-IT-WM-W-EU, HM-CC-RT-DN, HM-WDS10-TH-O, HM-LC-SW1-FM, HM-LC-Bl1-FM
Signalduino mit Elro AB440, LOGILINK WS0002, IT CMR-1000

reibuehl

Ich hab eine erfolgreiche Anfrage aus IE mal mitgeschnitten:

POST http://install.egain.se/Home/CheckInstalled HTTP/1.1
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://install.egain.se/?gid=750d018a-e091-49ff-a860-5c1ef1e523e8
Accept-Language: en-US,de-DE;q=0.5
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
Connection: Keep-Alive
Content-Length: 41
Host: install.egain.se
Pragma: no-cache

guid=750d018a-e091-49ff-a860-5c1ef1e523e8


Aus HTTPMOD heraus klappt es aber mit attr httpmodReq1 requestData guid=750d018a-e091-49ff-a860-5c1ef1e523e8 trotzdem nicht. Ich werde mal mit requestHeader weitere Header hinzufügen. Vielleicht klappt es ja dann.
Reiner.

reibuehl

Gibt es eine Möglichkeit, die Internals Variable HTTPCookies zu löschen bzw. zurückzusetzen? Ein attr <dev> enableCookies 0 scheint dies nämlich nicht zu tun.
Reiner.

StefanStrobel

Hallo Reiner,

die Header und Post Daten sollten genau so gesendet werden, wie der Server das erwartet und von einem Browser auch gesendet bekommt.
Ich verwende meisten die Burp Suite um die korrekte Übertragung zwischen Browser und Server mitzulesen.
Wenn die Post-Daten mit Anführungszeichen gesendet werden, dann solltest Du es auch im Attribut genau so ablegen:

attr httpmodReq1 requestData guid:"750d018a-e091-49ff-a860-5c1ef1e523e8"


wenn noch weitere Header erwartet werden, kann es aber natürlich auch an denen liegen.

Das manuelle Löschen von Cookies war bisher nicht vorgesehen. Der Server überschreibt die bei Bedarf normalerweise. Ich lade aber gleich noch mal eine Neue Version hoch, in der ein Löschen von enableCookies oder ein attr enableCookies 0 auch den Cookiespeicher löscht. Kann vermutlich nichts schaden.

Gruss
    Stefan

reibuehl

Hallo Stefan,

hab es gerade mal mit der neue Version probiert. Die Cookies werden wie gewünscht gelöscht, aber im fhem.log erhalte ich den folgenden Fehler:

2016.02.01 22:36:23 1: PERL WARNING: Use of uninitialized value $value in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 1137.
2016.02.01 22:36:25 3: eGain: Read callback: request type was update retry 0, no headers, body empty,
Error: read from to http://install.egain.se:80 timed out


Reiner.

Hanjo

Hallo Stefan,

schnelles Feedback: ich benutze das neue Modul um das JSON von https://creativecommons.tankerkoenig.de/ zu parsen und die Preise der Tankstellen bei mir in der Nähe anzuzeigen. Alles funktioniert einwandfrei!

Muss ich beim nächsten "update" was beachten?

Danke & viele Grüße
Hanjo

StefanStrobel

Hallo Reiner,

danke für den Hinweis. Die Warnung kommt vermutlich bei ungültigen JSON Daten. Ich hab eine weitere Prüfung eingebaut.
Zudem habe ich den Authentisierungs-Mechanismus etwas umgebaut. Bisher wurden die Authentisierungs-Schritte hinten an die send-Queue angehängt, wenn die ReAuthRegex auf eine Response gepasst hat. Weitere Lese-Requests sind damit noch vor der Authentisierung in der Queue geblieben.
Jetzt werden die Authentisierungsschritte (sidX..) vorgezogen wenn sie benötigt werden.

Gruss
    Stefan

StefanStrobel

Hallo Hanjo,

wenn Du die aktuelle Version aus diesem Thread genommen hast, wird die beim nächsten Update wieder mit der älteren Version aus dem SVN überschrieben. Es sei denn Du verhinderst das über die Schreibrechte.
Ich werde aber die neue Version demnächst einchecken und dann ist das Problem behoben.

Gruss
    Stefan

reibuehl

Hallo Stefan,

die PERL Warning ist mit der neuen Version weg, ich bekomme aber immer noch diese Meldung:

2016.02.02 21:10:26 3: eGain: Read callback: request type was update retry 0, no headers, body empty,
Error: read from to http://install.egain.se:80 timed out


Meine Definition hat sich gegenüber vorgestern nicht geändert. Damals habe ich noch ein 500 Error vom Server zurück bekommen und die Internals buf und header waren gefüllt. Nun bekomme ich gar nichts mehr. Beide Internals sind leer.

Gruß,
Reiner
Reiner.

StefanStrobel

Hallo Reiner,

an den Timeouts habe ich eigentlich nichts geändert. Kann es sein, dass Dein Gerät einfach nicht rechtzeitig geantwortet hat? Ein 500 Error ist ja eine Meldung, die vom Server als Antwort kommt. Der Timeout greift wenn der Server gar nichts antwortet.

Ich habe übrigens gerade noch mal eine Kleinigkeit verbessert und im ersten Post aktualisiert:
Wenn readingXXName vergessen wurde, wird ein readingXXRegex, JSON oder XPath nicht einfach ignoriert sondern bei JSON der Wert des JSON Attributs als Name verwendet und sonst unnamed-XX.
Ich hoffe das führt zu weniger Missverständnissen / Supportfragen.

Gruss
    Stefan

SirUli

Hi Stefan,

seit dem letzten Update aus dem ersten Beitrag:
2016.02.04 22:19:55 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 892.
2016.02.04 22:19:57 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/98_HTTPMOD.pm line 1015.


Hatte an meiner Definition nichts geändert, nur die neueste Version aus dem Beitrag.

Viele Grüße,
Uli

Augschburger

Hallo Stefan,

ich habe folgendes Phänomen/Problem:
Ich lese diese Seite ein:
http://www.bergfex.de/deutschland/schneewerte

und versuche, die Tabelle mit HTTPMOD einzulesen, nur die für mich (meinen Sohn) interessanten Orte, z.B.:
Nesselwang<\/a><\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td class="center nowrap"\s*style="color: #999999;">\s*(.*?)<\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td class="right nowrap" width="100" >(\s*.*?\s*)<\/td>

So funktioniert das auch, ich erhalte die Readings 1 bis 6. Der Teil, auf den gematched werden soll, sieht so aus:
<tr class="tr1"> <td style="width:100%; font-weight: bold;"><a href="/alpspitz-edelsberg-ostallgaeu/schneebericht/">Alpspitz / Edelsberg - Nesselwang</a></td> <td class="right nowrap" width="40">20 cm</td> <td class="right nowrap" width="40">20 cm</td> <td class="right nowrap" width="40">-</td> <td class="center nowrap" style="color: #999999;"> 2/6</td> <td style="padding-top: 2px; padding-bottom: 0; padding: 0; padding-top: 2px;"><img src="/images/icons/lifte-pisten/status1.png" border=0 width=17 height=17></td> <td class="right nowrap" width="100" > Heute, 07:00 </td> </tr>

Eigentlich müsste ich durch ständiges Wiederholen von \s*<td.*?>\s*(.*?)<\/td> auch alle Werte auslesen können, aber das scheitert, irgendwie. In regexr.com funktioniert's. Ich hab mich mehrfach vom Ende her durchgearbeitet und so die Stellen ermittelt, wo es schief geht und dann entsprechend den kompletten Text übernommen, aber ich finde den Haken einfach nicht...
Hast Du mir einen Tipp?

Danke,
  Hans-Jörg

StefanStrobel

Hallo Uli,

danke für den Hinweis, habs gefixt.

@Hans-Jörg: poste doch mal Deine tatsächliche Konfiguration und den ganzen Content, den Du parsen möchtest.

Gruss
    Stefan

StefanStrobel

Hallo Hans-Jörg,

Ich hab mir Deine Frage gerade nochmal etwas genauer angesehen. Wenn ich Dich richtig verstehe, dann möchtest Du die komplexe regex einfacher schreiben, zumal sie # und ; enthält, was fhem nicht so einfach schluckt.

Probiers doch mal mit folgender Minimalkonfiguration:

define stest HTTPMOD http://www.bergfex.de/deutschland/schneewerte 300
attr stest reading01Name Nesselwang
attr stest reading01Regex Nesselwang<\/a><\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td [^>]+>\s*(.*?)<\/td>\s*<td.*?>\s*(.*?)<\/td>\s*<td [^>]+>(\s*.*?\s*)<\/td>


Funktioniert bei mir. Statt 300 Sekunden wäre natürlich ein längeres Intervall sinnvoller. So schnell schneit es ja nicht.

Gruss
    Stefan