HTTPMOD wie richtige Abfrage eintragen - Devolo Magic 2 Wifi

Begonnen von gestein, 22 Februar 2021, 00:19:26

Vorheriges Thema - Nächstes Thema

gestein

Hallo,

ich würde bei meinen Devolos gerne abfragen, welche Geräte gerade per Wifi eingeloggt ist.
Die Adapter bieten dafür eine Webansicht.
Wenn ich mir den Quelltext anschaue, dann steht dort:
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Webui</title>
  <base href="./">
  <link rel="stylesheet" type="text/css" href="assets/custom/customization.css" />
  <link id="favicon" rel="shortcut icon" type="image/x-icon" href="data:image/x-icon;," />
  <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.b061e17a8972461828aa.css"></head>

<body>
  <app-root></app-root>
<script src="runtime.a90ff0fd1c815e6d8b1f.js" defer></script><script src="polyfills-es5.c566157a0d51a72bebf7.js" nomodule defer></script><script src="polyfills.1203deef5399a57aabc9.js" defer></script><script src="main.21c5172460c0272228fe.js" defer></script></body>

</html>


Wenn ich den Quellcode untersuche, dann kommt jede Menge html-Code, mit dem ich aber leider nix anfangen kann (siehe Bilder im Anhang).
Die Daten hätte ich schon mal gefunden, die stehen in einer Tabelle und dort in einem Feld.

Wie kann ich das extrahieren?
Ich nehme an, dass mir da HTTPMOD am besten helfen kann, aber wie gehe ich das an?

Danke für jeden Tipp.
lg, Gerhard

Wernieman

Dein Problem wird sein, das die Daten per Script aufgerufen werden. Siehe z.B.
Zitatruntime.a90ff0fd1c815e6d8b1f.js
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

gestein

Bitte entschuldige, dass ich so unbedarft frage:
Aber was heißt das dann?
Heißt das, das es mit HTTPMOD nicht funktioniert?

Und wenn ich das Script direkt aufrufe? Würde es dann klappen?

Danke, Lg, Gerhard

Wernieman

Das Script wird im browser aufgerufen.  Du müstest gucken, welche Daten das Scipt den beim Server abfragt
Entweder Mitsniffen (Stichwort Wireshark)
Oder im Browser gucken, welche Daten  der Brwoser sich vom Server holt (Entwicklertools->Netzwerktab)

Bin jetzt auch nicht sooo fit, das ich Dir weitere Tips "aus der Ferne" geben könnte
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

gestein

Danke für die Tipps.
Habe mich gestern Abend mal damit beschäftigt, komme aber nicht weiter.
Da reichen meine Kenntnisse leider bei weitem nicht aus.

Anscheinend fragt mein Browser über die Javascripts um JASON-Daten und als Antwort kommt dann z.B.:
{"jsonrpc":"2.0","id":"a44316d0-9434-4f66-ad68-c0c6b3fac3cf","result":[0,{"clients":{"E0:98:06:8D:28:BC":{"connected_time":36419,"vendor"{"name":"Espressi","description":"Espressif Inc."},"rx":{"rate":24000},"tx":{"rate":57000}}}}]}

Würde es jemandem helfen, wenn ich den vollständigen Verkehr poste?
Könnte mir dann bitte jemand beim Analysieren helfen?

Oder kennt jemand eine Möglichkeit, wie man die Seite richtig auf dem raspberry laden und dann den html-Code bekommt?

Dazu müsste ich wahrscheinlich am besten einen headless browser installieren, der javascript kann. Oder?
Und dann müsste ich den Code irgendwie abspeichern und analysieren. Oder?

Danke im Voraus
lg, Gerhard

Wernieman

Wenn Du die Url-weißt, um diesen JSON zu kriegen, hast Du doch schon gewonnen?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

gestein

Und in den "Entwicklertools->Netzwerktab" sieht man es sogar noch besser.
Das hätte ich gleich machen sollen.

Es gibt ein Json-Objekt (heißt das so?):
jsonrpc: "2.0", id: "4260f3b7-4c60-403b-aed3-ba806059bc84", result: [0, {clients: {,...}}]}
id: "4260f3b7-4c60-403b-aed3-ba806059bc84"
jsonrpc: "2.0"
result: [0, {clients: {,...}}]
0: 0
1: {clients: {,...}}
clients: {,...}
00:0E:58:36:6D:9C: {vendor: {name: "Sonos", description: "Sonos, Inc."}, radio: "0", ssid: "PinkZeder",...}
00:0E:58:D5:53:DE: {vendor: {name: "Sonos", description: "Sonos, Inc."}, radio: "0", ssid: "PinkZeder",...}
.....
.....


Wie kann man daraus nun die richtige Definition von HTTPMOD "basteln"?

Und wo bekomme ich die URL her?
Könnte das das sein?
Request URL: http://192.168.0.xxx/ubus
Request Method: POST
Status Code: 200 OK
Remote Address: 192.168.0.xxx:80
Referrer Policy: strict-origin-when-cross-origin


Liebe Grüße
Gerhard

gestein

Braucht man die "Request Payload" vielleicht auch noch?
{jsonrpc: "2.0", method: "call", id: "4260f3b7-4c60-403b-aed3-ba806059bc84",...}
id: "4260f3b7-4c60-403b-aed3-ba806059bc84"
jsonrpc: "2.0"
method: "call"
params: ["45ed90f660cb9b55d2a877aa9897e5c1", "network.info", "unconnected_clients", {}]


Denn ein simples defmod klappt leider nicht:
defmod Devolo_Test HTTPMOD http://192.168.0.xxx/ubus 120
attr Devolo_Test extractAllJSON 2

Wernieman

HTTPMod kann Json direkt selber encoden. Fürs testen einfach mal alles: Stichwort extractAllJSON
Also einfach setzen
attr DeinDevice extractAllJSON 1

Was steht denn in deinem Browser, wenn Du die Url selber aufrufst?

Edit:
Meines Wissens (Bin d a aber auch erst 1 Woche beo HTTPMod dabei), ist der Parameter für extractAllJSON 1 und nicht 2
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

gestein

Danke. Ich habe es immer auf "2" gesetzt.
CommandRef:
if set to 1 it will create a reading for every JSON object. The reading names will be deducted from the JSON strings hierarchically concatenated by "_".
if set to 2 it will create attributes for naming and parsing the JSON objects to make it easier to rename or remove some of them.


Ist aber - in dem Fall glaube ich - nicht so wichtig.
Denn leider sagt der log:
2021.02.23 18:48:39.560 5: Devolo_Test: AddToQueue adds type update to URL http://192.168.0.xxx/ubus, no data, no headers, retry 0, initial queue len: 0
2021.02.23 18:48:39.561 5: Devolo_Test: HandleSendQueue called from AddToSendQueue, qlen = 1
2021.02.23 18:48:39.561 4: Devolo_Test: HandleSendQueue sends update with timeout 2 to http://192.168.0.xxx/ubus, No Data, No Header
2021.02.23 18:48:39.820 5: Devolo_Test: ReadCallback called from __ANON__
2021.02.23 18:48:39.821 4: Devolo_Test: Read callback: request type was update retry 0,
header: HTTP/1.0 400 Bad Request
Connection: close
Content-Type: text/html, body length 35
2021.02.23 18:48:39.821 5: Devolo_Test: Read callback: body
<h1>Bad Request</h1>Invalid Request
2021.02.23 18:48:39.822 4: Devolo_Test: BodyDecode found no charset header (bodyDecode was set to auto)
2021.02.23 18:48:39.822 3: Devolo_Test: error while parsing JSON data: malformed JSON string, neither tag, array, object, number, string or atom, at character offset 0 (before "<h1>Bad Request</h1>...") at lib/FHEM/HTTPMOD/Utils.pm line 668.

Da fehlt also noch etwas.
Im Browser steht einfach nur "http://192.168.0.xxx/#/wifi/status".
Wenn ich diese URL im Def des Devices verwende, dann kommt der folgende Log-Eintrag:
2021.02.23 18:56:28.924 4: Devolo_Test: HandleSendQueue sends update with timeout 2 to http://192.168.0.xxx/#/wifi/status, No Data, No Header

Wenn ich die URL "http://192.168.0.xxx/ubus" im Browser aufrufe, dann kommt die Meldung:
Bad Request
Invalid Request


Danke für Deine Hilfe!
lg, Gerhard

Wernieman

Zitat<h1>Bad Request</h1>Invalid Request
Dann brauchst Du eben mehr Infos. Was jetzt das Script sendet (oder nicht) , kann ich Dir nicht sagen. Eventuell ist auch vorher ein Login erforderlich .... da ich so ein Gerät nicht habe, kann ich Dir nicht weiterhelfen.

Eventuell man im Netz suchen, vielleicht hat jemand ein Scirpt für Linux geschrieben ... DAS kann man dann "super"  adaptieren.

Mal auf die Schnelle:
https://github.com/KiboOst/php-devoloDHC
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

gestein

Da scheint tatsächlich noch ein Login zu passieren.

Nach anderen Lösungen habe ich auch schon gesucht.
Danke für den Hinweis auf KiboOst. Das scheint aber für Devolo Home Control zu sein.
Das kannte ich auch schon. Aber vielleicht ist da das login auch abgehandelt.

Als Idee ist mir noch eingefallen, dass ich ja mit headless browsern auf dem Raspberry arbeiten könnte.
Aber die die ich gefunden habe, scheinen kein Javascript zu können.
Zumindest konnte keiner die Seite öffnen.

lg, Gerhard