Neue Version von HTTPMOD mit neuen Features zum Testen

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

Vorheriges Thema - Nächstes Thema

StefanStrobel

Hallo andies,

vielen Dank!
Da war tatsächlich noch ein Bug, so dass MaxAge Readings nicht über einen Fhem-Restart hinweg verarbeitet.
In der nächsten Version ist das behoben.

In Deiner Konfiguration sind mir noch zwei Kleinigkeiten aufgefallen:

reading01OExpr $val ist völlig überflüssig und reading01URL gibt es nicht und wird nur akzeptiert wenn jemand das Attribut manuell als userAttr definiert.

Gruss
   Stefan

andies

Alles behoben, Danke!!


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Ich habe ein Problem, für das ich bisher keine rechte Lösung finden konnte. Ich bin mir nicht sicher, ob überhaupt HTTPMOD das kann. Also, es geht wieder um diesen dussligen Speedport, der bei mir manchmal das Portforwarding ohne Anlass zu ändern scheint. Also will ich regelmäßig die Form automatisiert abschicken, in der die Ports festgelegt werden. Das geschieht mit einer POST-Form, habe ich in Burp herausgefunden. Der POST, der da abgeschickt wird, lautet wie folgt

POST /data/Portforwarding.json HTTP/1.1
Host: speedport.ip
Content-Length: 804
Accept: application/json, text/javascript, */*
Origin: http://speedport.ip
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://speedport.ip/html/content/internet/portforwarding.html?lang=de
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: aDuPtHhDA80213deed20=qRzp3ep62calji#Rja1DlIUIE1ta2poHfDV0HlbhnbsxjXntYDUjvPRX; lang=de
Connection: close

tcp_redirect_active%5B1%5D=1&tcp_redirect_active%5B2%5D=1&tcp_redirect_active%5B3%5D=1&tcp_redirect_active%5B4%5D=1&tcp_redirect_active%5B5%5D=1&tcp_public_from%5B1%5D=8082&tcp_public_from%5B2%5D=8084&tcp_public_from%5B3%5D=8081&tcp_public_from%5B4%5D=8083&tcp_public_from%5B5%5D=8080&tcp_public_to%5B1%5D=8082&tcp_public_to%5B2%5D=8084&tcp_public_to%5B3%5D=8081&tcp_public_to%5B4%5D=8083&tcp_public_to%5B5%5D=8080&tcp_private_dest%5B1%5D=8085&tcp_private_dest%5B2%5D=443&tcp_private_dest%5B3%5D=80&tcp_private_dest%5B4%5D=80&tcp_private_dest%5B5%5D=80&tcp_device%5B1%5D=199&tcp_device%5B2%5D=103&tcp_device%5B3%5D=109&tcp_device%5B4%5D=112&tcp_device%5B5%5D=113&tcpredirect_id%5B1%5D=3&tcpredirect_id%5B2%5D=13&tcpredirect_id%5B3%5D=11&tcpredirect_id%5B4%5D=12&tcpredirect_id%5B5%5D=14&httoken=436759627

Der httoken (ganz am Ende) muss ausgelesen werden, weil er mit jedem Zugriff geändert wird. Die anderen Daten sind eigentlich auch veränderlich, das kann ich aber extern kontrollieren. Nun dachte ich, dass ich diesen POST wie folgt nachbaue
defmod Speedport2 HTTPMOD none 0
attr Speedport2 userattr get1Data get1Header1 get1Header2 get1Header3 get1Header4 get1Name get1URL sid1Header sid1IdRegex sid1URL sid2Data sid2Header1 sid2Header2 sid2URL
attr Speedport2 enableCookies 1
attr Speedport2 get1Data tcp_redirect_active%5B1%5D=1&tcp_redirect_active%5B2%5D=1&tcp_redirect_active%5B3%5D=1&tcp_redirect_active%5B4%5D=1&tcp_redirect_active%5B5%5D=1&tcp_public_from%5B1%5D=8082&tcp_public_from%5B2%5D=8083&tcp_public_from%5B3%5D=8080&tcp_public_from%5B4%5D=8081&tcp_public_from%5B5%5D=8084&tcp_public_to%5B1%5D=8082&tcp_public_to%5B2%5D=8083&tcp_public_to%5B3%5D=8080&tcp_public_to%5B4%5D=8081&tcp_public_to%5B5%5D=8084&tcp_private_dest%5B1%5D=8085&tcp_private_dest%5B2%5D=80&tcp_private_dest%5B3%5D=80&tcp_private_dest%5B4%5D=80&tcp_private_dest%5B5%5D=443&tcp_device%5B1%5D=199&tcp_device%5B2%5D=112&tcp_device%5B3%5D=113&tcp_device%5B4%5D=109&tcp_device%5B5%5D=103&tcpredirect_id%5B1%5D=1&tcpredirect_id%5B2%5D=3&tcpredirect_id%5B3%5D=4&tcpredirect_id%5B4%5D=5&tcpredirect_id%5B5%5D=6&httoken=$sid
attr Speedport2 get1Header1 Origin: http://speedport.ip
attr Speedport2 get1Header2 Referer: http://speedport.ip/html/content/internet/portforwarding.html?lang=de
attr Speedport2 get1Header3 Content-Type: application/x-www-form-urlencoded
attr Speedport2 get1Header4 X-Requested-With: XMLHttpRequest
attr Speedport2 get1Name Portforwarding
attr Speedport2 get1URL http://speedport.ip/data/Portforwarding.json
attr Speedport2 reAuthRegex 501 Not Implemented
attr Speedport2 sid1Header Content-Type: text/html
attr Speedport2 sid1IdRegex _httoken = (\d*)
attr Speedport2 sid1URL http://speedport.ip/html/login/index.html?lang=de
attr Speedport2 sid2Data password=XXXXXXXXXXXXXXXXXXXXXXX&showpw=0&httoken=$sid
attr Speedport2 sid2Header1 Content-Type: application/json
attr Speedport2 sid2Header2 Referer: http://speedport.ip/html/login/index.html?lang=de
attr Speedport2 sid2URL http://speedport.ip/data/Login.json


Ich sehe, dass das einloggen klappt und es wird dann anscheinend auch gesendet, denn im Log lese ich
2017.06.04 22:11:12 5: HttpUtils request header:
POST /data/Portforwarding.json HTTP/1.0
Host: speedport.ip
User-Agent: fhem
Origin: http://speedport.ip
Referer: http://speedport.ip/html/content/internet/portforwarding.html?lang=de
Content-Type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Cookie: aDuPtHhDA802e0a870=deleted; aDuPtHhDA802f6cf8a=MSGG8qlVw4zC9pmPdWGBsBGU3wqLl3dXtIDRXNNtqlUN1gC4dqdvQ
Content-Length: 801

2017.06.04 22:11:12 4: http://speedport.ip/data/Portforwarding.json: HTTP response code 200
2017.06.04 22:11:12 4: HttpUtils http://speedport.ip/data/Portforwarding.json: Got data, length: 57

Allerdings steht dann weiter unten
2017.06.04 22:11:12 4: Speedport2: Read callback: request type was get1 retry 1,
Header: HTTP/1.1 200 OK
Server: Apache
Pragma: no-cache
Cache-Control: max-age=0, must-revalidate
Set-Cookie: aDuPtHhDA802e0a870=deleted; Path=/; Expires=Thu, 30 Aug 2012 03:17:38 GMT; HttpOnly
Connection: close
Content-type: application/javascript
Pragma: no-cache
Cache-Control: no-cache
Expires: -1,
Body: [{"vartype":"status","varid":"status","varvalue":"fail"}]

und letzteres heißt, dass das Überschreiben der Werte nicht geklappt hat.

Der Speedport nervt, aber leider brauche ich den wegen Telekom-Fon. Sieht jemand, was ich falsch mache?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

EinEinfach

#408
Anfrage Obsolete, alles im WIKI doch gefunden

Hallo zusammen,

ich möchte mit dem HTTPMOD von zwei URLs JSON-String in einem HTTPMOD-Device parsen und zwar möchte ich vermeiden alles mit ExtractAllJSON zu machen, da die Liste mit Readings zu lang wäre.
Im WIKI habe ich kein Beispiel zu gefunden. -> Natürlich gibt es im WIKI ein Beispiel... wer lesen kan ist klar im Vorteil

Was im WIKI beshchrieben ist:
- 1 URL und ausgewählte Readings
- 2 URLs dann aber alle Readings

Meine Frage ist:
- 2 URLs und ausgewählte Readings
Geht das? Und wenn Ja wie würden in etwa zu setztenden Attribute für get01 bzw get02 aussehen. -> jap das geht

Danke und Gruß
fhem auf Intel NUC6CAYH mit Proxmox im LXC (Debian 10), KNX mit knxd über MDT SCN-IP000.02, Buderus GB192-15i über KM100, Solaredge WR SE9K über Modbus-TCP

Elektrolurch

Hallo,

ich bastele derzeit (mal immer wieder so a bisserl) an dem TVhelper 2.0, der relativ einfach readingGroups aus dem TV - Programm von klack erzeugt. Dabei habe ich vor einiger Zeit das httpmod - Modul etwas missbraucht. Ich habe den internen Buffer ($hash->{buf}) der geladenenen Seite "zu Fuß" nach "tittle...." durchsucht, um die Sendernamen, die die klack - Seite anbietet, zu finden, um so eine Liste der aktuellen Sendernamen auszugeben.
Gestern habe ich nun festgestellt, dass wohl das httpmod - Modul umgestellt wurde und es den Buffer wohl nicht mehr unter ->{buf} gibt.
Gibt es noch eine andere Möglichkeit, an den Speicherbereich zu kommen, um den Inhalt der Webseite zu durchsuchen?
Das {join(' ',sort keys %{$defs{'TV_Programm'}})} liefert:
.getList .readingParseList .setList .updateRequestHash .userReadings BUSY DEF Interval LASTSEND MainURL ModuleVersion NAME NR QUEUE READINGS REQUEST STATE TRIGGERTIME TRIGGERTIME_FMT TYPE addr auth callback code compress conn data defptr displayurl header host httpheader httpversion hu_blocking hu_filecount hu_port hu_portSfx ignoreredirects loglevel path protocol redirects sslargs timeout url value

Die geladene Webseite konnte ich da nicht finden?

Elektrolurch
configDB und Windows befreite Zone!

SCMP77

Hallo,

Zitat von: Elektrolurch am 06 Februar 2018, 10:16:21
Gibt es noch eine andere Möglichkeit, an den Speicherbereich zu kommen, um den Inhalt der Webseite zu durchsuchen?

Wenn das parsen durch HTTPMOD nicht ausreichend ist, warum "missbrauchst" Du es dann um die Seite nur einzulesen? Wäre da nicht eine der Routinen aus HttpUtils nicht sinnvoller (z.B. HttpUtils_NonblockingGet). dann hast Du doch vermutlich gleich den Body der Html-Seite in einem String und kannst ihn dann nach belieben parsen.



Gruß
   SCMP77
Raspberry Pi 3 Model B mit Rasbian, SolvisMax, AVM DECT 200, Sonoff mit Tasmota geflasht

JoeALLb

Zitat von: Elektrolurch am 06 Februar 2018, 10:16:21

Gestern habe ich nun festgestellt, dass wohl das httpmod - Modul umgestellt wurde und es den Buffer wohl nicht mehr unter ->{buf} gibt.


Das Attribut "removeBuf" hast Du nicht gesetzt, oder?
Ich bin fast überzeugt, dass das auch ohne das interne Nutzen von BUF geht, wenn Du dein Beispiel mal komplett postest, würd ich mal drüber schauen.
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Elektrolurch

Hallo JoeALLd,

Frage: removeBuf = 0 => der Buffer wird nicht gelöscht?

Hintergrund: Im ersten Schritt für den TVhelper will ich erst einmal feststellen, welche Sendernamen es überhaupt auf der Seite gibt, um daus automatisiert die readings / attribute für httpmod zu befüllen. Bin ja faul und will mir Schreibarbeit sparen. Die Funktion unten wird quasi auch nur einmal aufgerufen, daher ist eine Abbildung in permanente readings für httpmod eigentlich auch nicht sinnvoll.


sub TVhelper_GetSenderlist($)
{
my ($hash) = @_;
my $name = $hash->{NAME};
# alle Titles in TV_Programm suchen
# zeigt auf den httpmod
my $tvnext = $hash->{tvnext};
return "no buffer loaded by $tvnext" if(!defined($defs{$tvnext}->{buf}));

my $s = \$defs{$tvnext}->{buf};

my %titles;

while ($$s =~m/title="([\w -]+)"></mig)
{
$titles{$1} = $1;
}
# Log(1,"gefundene titles:\n" . join("\n", sort keys %titles));
$hash->{senderList} = \%titles;
my $a = join("/", sort keys %titles);
return $a;
# Ausgabe: /sender1/sender2/...
} # TVhelper_GetSenderlist
################################


Die ausgegebene Liste kann man dann mit den Kanalnamen z.B. seines Enigma - Receivers ergänzen:

ZDF:/DF_HD/Das Erste:Das_Erste_Hd/...
und daraus generiert dann der TVhelper nach Vorlage automatisch die readingsGroup mit klickbaren Icons usw.
Der "Umweg" über die unter "Aktuelles TV-Programm" vorgestellte Excel-Tabelle war mir zu instabil, wenn man mal einen Sendernamen abändern musste.
Elektrolurch
configDB und Windows befreite Zone!

StefanStrobel

Hallo,

Die Ursache liegt eher bei den HttpUtils:
https://forum.fhem.de/index.php/topic,81099.0.html

Das Attribut removeBuf ist seither überflüssig und ich könnte alternativ ein showBuf einbauen...

Gruss
   Stefan

Elektrolurch

Hallo Stefan,

ein Attribut oder eine Subroutine z.B.

sub httpmod_GetBuf($);

returns pointer to buffer.

Wäre für mich ok. Ansonsten müsste ich mir nur für den einen Fall über die httputils und non-blocking das ganze nochmal aufbauen... ja eigentlich überflüssig.

Danke.

Elektrolurch

configDB und Windows befreite Zone!

StefanStrobel

Hallo,

probier doch mal die angehängte neue Version mit dem Attribut showBody.

Gruss
   Stefan


Elektrolurch

Hallo Stefan,

funktioniert. Unter httpbody finde ich jetzt die geladenen Daten und es werden auch wieder alle TV - Sender angezeigt.
Danke. Könnte man also einchecken.

Elektrolurch
configDB und Windows befreite Zone!

Tueftler1983

Ist es möglich HTTPMOD für Daten zu verwenden die mit Oauth und token gesichert sind?

Mit der alten API von DISCOVERGY konnte ich alle Daten meines Zählers abrufen

Jetzt mit der neuen API weiß ich nicht wie ich es anstellen muss

StefanStrobel

Hallo,

Möglich ist das vermutlich schon. Du müsstest ,,nur" die einzelnen Schritte mit sid-Attributen nachbilden und die Tokens jeweils extrahieren und in folgenden Schritten wieder einbauen.
Einfach wird das vermutlich nicht ...

Gruß
   Stefan

EinEinfach

Hallo nach update bekomme auf der Startseite von FHEM folgende Fehlermeldung:
Messages collected while initializing FHEM:
configfile: GigasetElements: unknown attribute removeBuf. Type 'attr GigasetElements ?' for a detailed list.
Heiztherme: unknown attribute removeBuf. Type 'attr Heiztherme ?' for a detailed list.
DR.Rasenmaehroboter.InternalLog: unknown attribute removeBuf. Type 'attr DR.Rasenmaehroboter.InternalLog ?' for a detailed list.
DR.Rasenmaehroboter: unknown attribute removeBuf. Type 'attr DR.Rasenmaehroboter ?' for a detailed list.

Autosave deactivated

Alle Devices sind HTTPMOD-Module

Was läuft hier falsch?
fhem auf Intel NUC6CAYH mit Proxmox im LXC (Debian 10), KNX mit knxd über MDT SCN-IP000.02, Buderus GB192-15i über KM100, Solaredge WR SE9K über Modbus-TCP