Verschiedenes > Off-Topic

Erfahrungen mit Puppeteer?

(1/3) > >>

gestein:
Hallo,

Ich versuche Informationen über meine Devolo Magic 2 in mein FHEM zu bekommen.
Anscheinend gibt es nur die http-Seite dafür - leider nix anders.

Leider wird die Seite über js-Scripte aufgebaut.
Damit kann man HTTPMOD nicht verwenden.

Schlussendlich habe ich verschiedene headless Browser ausprobiert.
Hat aber auch nicht geklappt.

Nun bin ich bei Googles Pupetteer.
Damit scheint es gut zu funktionieren, aber es gäbe nicht einige Details zu klären.
Und ich bin halt kompletter Neuling.

Die Seite von meinen Devolos kann ich schon mal aufrufen und es wird auch was gelesen.
Die Seite kann ich als Text oder als Screenshot abspeichern.
Allerdings wird zuerst verschiedene js-Scripte geladen und die zeigen dann erst eine Tabelle an.
Puppeteer wartet aber nicht, bis die Scripte die Seite geladen haben, sondern zeigt gleich die erste Seite an.
Dort steht dann halt „warten bis Daten geladen sind“.

Gibt es hier jemanden, der sich mit Puppetteer auskennt und mir ein paar Tipps in die richtige Richtung zu geben könnte?

Danke, Lg, Gerhard

gestein:
Hallo,

ich bin inzwischen etwas weitergekommen und kann von den Devolos-Seiten schon mal die Daten extrahieren.
Das Ganze läuft erst sehr rudimentär, aber prinzipiell geht es.

Mein Script schaut so aus:

--- Code: ---'use strict';

const ventriloquist = require('puppeteer');

(async() => {
  const browser = await ventriloquist.launch({product: "chrome", executablePath: "/usr/bin/chromium",});
  const page = await browser.newPage();
//  Devolo URL has the format 'http://x.x.x.x/#/wifi/status';
  const pageURL = process.argv[2];

  process.on('unhandledRejection', (reason, p) => {
    console.error('Unhandled Rejection at: Promise', p, 'reason:', reason);
    browser.close();
  });

  await page.setViewport({ width: 1920, height: 1080 });
  await page.goto( pageURL,{
    waitUntil: 'networkidle0',
  });

  await page.goto( pageURL,{
    waitUntil: 'networkidle0',
  });

  await page.screenshot({path: 'puppetmaster.png'});
  var output = await page.evaluate(() => {
    return;
  });

//  const text = await page.$eval('*', el => el.innerText);
// ng-tns-0-0
//  const text = await page.content();
  const table = await page.$$eval('table tr td', tds => tds.map((td) => {
    return td.innerText;
  }));

  const fs = require('fs');
  fs.writeFileSync('./file.txt', table);

  process.stdout.write(table+'\n');

  await browser.close();
})();
--- Ende Code ---
Verbesserungen gerne willkommen ;-)

Momentan muss ich es noch händisch in der shell mit "node script.js <address of Devolo>" aufrufen.
Dann wird ein Screenshot abgespeichert, die Daten in einem File ausgegeben und gleichzeitig auch auf der Console.

Aber nun wird es spannend.
Denn wie soll ich die Daten in fhem bekommen.

Mir schwebt momentan vor, dass das script in einer Endlos-Schleife läuft, die Seite ausliest und immer wieder die Datei überschreibt.
Dann bräuchte ich eine Möglichkeit in fhem die Datei zu lesen und in Readings zu packen.
Oder ich rufe das über die in fhem eingebaute telnet-Schnittstelle auf.

Weiß jemand, wie man das am Besten angeht?
Was wäre der "richtige" Weg?

Und wie soll man die Endlos-Schleife beenden?
Gibt es da einen (Standard-)Mechanismus in Linux?

Danke für jeden Tipp.
lg, Gerhard

Christoph Morrison:
Sicher, dass diese Javascripte nicht über eine API (XHR, etc.) mit einem Endpunkt kommunizieren, den du dann auch mit HTTPMOD/JSONMOD abfragen kannst?

gestein:
Um ehrlich zu sein: da habe ich absolut keine Ahnung.
Soweit reicht mein Wissen bei weitem nicht.
Ich wüsste nicht mal, wie ich das überprüfen könnte.

Lg, Gerhard

Christoph Morrison:
Hallo Gerhard,

schau z.B. mal hier: https://www.youtube.com/watch?v=nl8iKlo2NeM
Oder hier z.B. https://egghead.io/lessons/tools-examine-ajax-requests-with-chrome-devtools

Da suchst du dann, ob XHR-Request gemacht werden, irgendwo steht dann der Endpunkt und den kann man meistens auch direkt anzapfen.

Gruß
Christoph

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln