Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

wget und interaktive webpage

8 views
Skip to first unread message

Jan Schmidt

unread,
Oct 3, 2023, 10:48:11 AM10/3/23
to
Hi,

ich habe bisher immer zyklisch eine csv-Datei von einem Server
gedownloadet. Nun hat der Serverbetreiber vermutlich um die
Wartezeit zu verstecken eine dynamische Seite davor geschaltet
die einen Progressbalken anzeigt. Wenn der auf 100% steht, ist
ein Button klickbar der zur csv Datei führt.

Frage: wie komme ich jetzt an die Datei, wenn ich das z.B. via
cron abholen will?

das ganze funktioniert über die js-Datei

https://data.v3.go-e.io/js/export.js

anbei die html-Datei:

<html>
<head>
<title>Charging Session Export</title>
<link rel="stylesheet" href="/css/bootstrap.min.css"
integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO"
crossorigin="anonymous">
<script src="js/export.js"></script>
<style>

</style>
</head>
<body onload="onload()">
<div class="container">
<h1>Charging Session Export</h1>
<!--<form>
<label for="start">Start Date</label>
<input type="date" name="start" id="start" value=""
required>
<label for="end">End Date</label>
<input type="date" name="end" id="end" required>
<button onclick="getTicket()">Export</button>
</form>-->

<div class="progress"
style="margin-top:10px;height:30px;font-size:100%;background-color:#aaa;display:none">
<div class="progress-bar progress-bar-striped"
role="progressbar" style="width: 0%" aria-valuenow="0"
aria-valuemin="0" aria-valuemax="100" id="progress_0">
Step 1
</div>
</div>

<div class="progress"
style="margin-top:10px;height:30px;font-size:100%;background-color:#aaa;display:none">
<div class="progress-bar progress-bar-striped"
role="progressbar" style="width: 0%" aria-valuenow="0"
aria-valuemin="0" aria-valuemax="100" id="progress_1">
Step 2
</div>
</div>

<div id='status'></div>

<button type="button" class="btn btn-success"
style="display:none;margin-top:10px;" id="download-button">
<a id="download-link" style="color:white">Download</a>
</button>
</div>

</body>
</html>

Danke,
Jan

Peter J. Holzer

unread,
Oct 3, 2023, 2:27:41 PM10/3/23
to
On 2023-10-03 14:48, Jan Schmidt <jan.s...@gmx.de> wrote:
> ich habe bisher immer zyklisch eine csv-Datei von einem Server
> gedownloadet. Nun hat der Serverbetreiber vermutlich um die
> Wartezeit zu verstecken eine dynamische Seite davor geschaltet
> die einen Progressbalken anzeigt. Wenn der auf 100% steht, ist
> ein Button klickbar der zur csv Datei führt.
>
> Frage: wie komme ich jetzt an die Datei, wenn ich das z.B. via
> cron abholen will?

Mein erster Ansatz wäre, mal im Browser mit den Developer-Tools
(typischerweise F12) zu schauen, was da übers Netz geschickt wird und
das nachzubauen. Wenn es nicht so einfach ist, wäre Selenium die nächste
Eskalationsstufe. Um das in Cron verwenden zu können, braucht man aber
einen headless Browser, und da bin ich momentan überfragt (habe ich
zuletzt vor 10 Jahren gebraucht).

hp

Peter J. Holzer

unread,
Oct 3, 2023, 4:08:04 PM10/3/23
to
On 2023-10-03 19:31, Andreas Kohlbach <a...@spamfence.net> wrote:
> On Tue, 3 Oct 2023 20:27:40 +0200, Peter J. Holzer wrote:
>> [...] Um das in Cron verwenden zu können, braucht man aber einen
>> headless Browser, und da bin ich momentan überfragt (habe ich zuletzt
>> vor 10 Jahren gebraucht).
>
> lynx oder w3m vielleicht.

Nein, denn:

> Die können allerdings keine Web-Skripte.

[Web-Skripte? Eiferst Du Stefan Ram nach? Ich fürchte, der ist da
unschlagbar]

Nützt also nichts. (Selenium verwendet man ja nur dann, wenn man die
volle Funktionalität eines Browsers braucht. Im konkreten Fall eben
JavaScript.)

Ein "headless" Browser (für die, die den Begriff nicht kennen) ist
einer, der keine Anzeige hat. Intern macht er alles, was ein graphischer
Browser eben auch macht: DOM aufbauen, Layout berechnen, Scripts
ausführen, auch Input-Events reagieren. Aber es gibt halt kein Fenster,
in dem das angezeigt wird, und Inputs kommen über eine spezielle
Schnittstelle statt Tastatur und Maus. Sowas ist zum Testen praktisch,
aber auch, wenn man eben keine graphische Oberfläche zur Verfügung hat.

> Vielleicht kann man aber was mit POST und GET bauen.

Das stand schon in dem Teil, den Du weggesnippt hast.

hp

Stefan Reuther

unread,
Oct 4, 2023, 3:14:57 AM10/4/23
to
Am 03.10.2023 um 20:27 schrieb Peter J. Holzer:
> On 2023-10-03 14:48, Jan Schmidt <jan.s...@gmx.de> wrote:
>> ich habe bisher immer zyklisch eine csv-Datei von einem Server
>> gedownloadet. Nun hat der Serverbetreiber vermutlich um die
>> Wartezeit zu verstecken eine dynamische Seite davor geschaltet
>> die einen Progressbalken anzeigt. Wenn der auf 100% steht, ist
>> ein Button klickbar der zur csv Datei führt.
>>
>> Frage: wie komme ich jetzt an die Datei, wenn ich das z.B. via
>> cron abholen will?
>
> Mein erster Ansatz wäre, mal im Browser mit den Developer-Tools
> (typischerweise F12) zu schauen, was da übers Netz geschickt wird und
> das nachzubauen.

Ungefähr so würde ich ebenfalls beginnen.

Das JavaScript sieht so aus, als ob der eine Aktion auf dem Server
startet ("get_ticket"), und dann sekündlich pollt, ob die fertig ist
("get_status"), und in der finalen Statusmeldung steht dann die
Download-URL drin. Also kein Fake-Fortschrittsbalken, den man einfach
überspringen könnte. Die Logik wäre dann also (z.B. als Shellscript, mit
while-Schleife, curl und jq) nachzubauen.


Stefan

Peter J. Holzer

unread,
Oct 5, 2023, 4:49:21 PM10/5/23
to
On 2023-10-04 01:11, Andreas Kohlbach <a...@spamfence.net> wrote:
> On Tue, 3 Oct 2023 22:08:03 +0200, Peter J. Holzer wrote:
>>
>> On 2023-10-03 19:31, Andreas Kohlbach <a...@spamfence.net> wrote:
>>> On Tue, 3 Oct 2023 20:27:40 +0200, Peter J. Holzer wrote:
>>>> [...] Um das in Cron verwenden zu können, braucht man aber einen
>>>> headless Browser, und da bin ich momentan überfragt (habe ich zuletzt
>>>> vor 10 Jahren gebraucht).
>>>
>>> lynx oder w3m vielleicht.
>>
>> Nein, denn:
>>
>>> Die können allerdings keine Web-Skripte.
>>
>> [Web-Skripte? Eiferst Du Stefan Ram nach? Ich fürchte, der ist da
>> unschlagbar]
>
> JavaScript z.B.

Das hatte ich schon verstanden. Allerdings ist JavaScript die einzige
relevante Scriptsprache im Web (WASM gibt es auch, aber das ist IMHO
keine Scriptsprache), also ist die Verallgemeinerung sinnlos. Mal davon
abgesehen, dass der OP schon erwähnt hatte, dass es um JavaScript geht.

> Vielleicht hätte ich besser "vom Browser ausführbare
> Skripte" gesagt?

"Die können allerdings kein JavaScript" wäre korrekt und ohne unnötiges
Handgewedel gewesen.


>> Nützt also nichts. (Selenium verwendet man ja nur dann, wenn man die
>> volle Funktionalität eines Browsers braucht. Im konkreten Fall eben
>> JavaScript.)
>>
>> Ein "headless" Browser (für die, die den Begriff nicht kennen) ist
>> einer, der keine Anzeige hat. Intern macht er alles, was ein graphischer
>> Browser eben auch macht: DOM aufbauen, Layout berechnen, Scripts
>> ausführen, auch Input-Events reagieren. Aber es gibt halt kein Fenster,
>> in dem das angezeigt wird, und Inputs kommen über eine spezielle
>> Schnittstelle statt Tastatur und Maus. Sowas ist zum Testen praktisch,
>> aber auch, wenn man eben keine graphische Oberfläche zur Verfügung hat.
>
> lynx, w3m, curl oder wget müssen auch keine GUI haben.

Ich habe absichtliche "keine Anzeige" geschrieben und nicht "kein GUI".
Die haben sehr wohl eine Anzeige, nur halt eine text-basierte. Also
nicht "headless". Was ihnen dafür fehlt, ist ein API, um ihren internen
Zustand abzufragen. Für diese Art der Automatisierung interaktiver
Abläufe also kein Ersatz für richtige headless Browser.

> lynx kennt beispielsweise "-post_data".
>
> Kann halt keine "vom Browser ausführbare Skripte". Das macht diese
> u.a. für aktuelle Webseiten unbrauchbar.

Und hilft somit nicht weiter.

> Für einfache Seiten nutze ich sie trotzdem.

Schön für dich, aber irrelevant.

hp

Peter J. Holzer

unread,
Oct 7, 2023, 4:02:21 AM10/7/23
to
On 2023-10-06 01:33, Andreas Kohlbach <a...@spamfence.net> wrote:
> On Thu, 5 Oct 2023 22:49:19 +0200, Peter J. Holzer wrote:
>> On 2023-10-04 01:11, Andreas Kohlbach <a...@spamfence.net> wrote:
>>> On Tue, 3 Oct 2023 22:08:03 +0200, Peter J. Holzer wrote:
>>>>
>>>> [Web-Skripte? Eiferst Du Stefan Ram nach? Ich fürchte, der ist da
>>>> unschlagbar]
>>>
>>> JavaScript z.B.
>>
>> Das hatte ich schon verstanden. Allerdings ist JavaScript die einzige
>> relevante Scriptsprache im Web (WASM gibt es auch, aber das ist IMHO
>> keine Scriptsprache), also ist die Verallgemeinerung sinnlos.
>
> Macht es dann nicht gerade Sinn?

Meiner Meinung nach Nein. Wenn Du "JavaScript" schreibst, weiß jeder
sofort, was Du meinst. Wenn Du "Web-Skripte" schreibst, muss man erst
mal den ungewohnten Begriff analysieren und fängt dann an, darüber
nachzudenken, welche anderen Script-Sprachen außer JavaScript Du denn
gemeint haben könntest, und ob Du einen Stefan zum Frühstück verspeist
hast, schreibt eine Antwort, antwortet auf die Antwort, etc. Statt 0.1
Sekunden ist das dann mal locker eine Stunde Lebenszeit ...


>>>> Ein "headless" Browser (für die, die den Begriff nicht kennen) ist
>>>> einer, der keine Anzeige hat. Intern macht er alles, was ein graphischer
>>>> Browser eben auch macht: DOM aufbauen, Layout berechnen, Scripts
>>>> ausführen, auch Input-Events reagieren. Aber es gibt halt kein Fenster,
>>>> in dem das angezeigt wird, und Inputs kommen über eine spezielle
>>>> Schnittstelle statt Tastatur und Maus. Sowas ist zum Testen praktisch,
>>>> aber auch, wenn man eben keine graphische Oberfläche zur Verfügung hat.
>>>
>>> lynx, w3m, curl oder wget müssen auch keine GUI haben.
>>
>> Ich habe absichtliche "keine Anzeige" geschrieben und nicht "kein GUI".
>> Die haben sehr wohl eine Anzeige, nur halt eine text-basierte. Also
>> nicht "headless". Was ihnen dafür fehlt, ist ein API, um ihren internen
>> Zustand abzufragen. Für diese Art der Automatisierung interaktiver
>> Abläufe also kein Ersatz für richtige headless Browser.
>
> Wie kam ich jetzt auf GUI?
>
> Ich meinte auch headless (keine Anzeige).
>
> Der Hinweis unten zu lynx mit -post_data bleibt. lynx sendet Daten zum
> Server und gibt ggf. Status-Informationen aus, die man ggf. nach
> /dev/null schieben kann. Sein Interface sieht man in diesem und anderen
> Fällen nicht.

Lynx beendet sich aber nach -post_data, und das ist genau das, was man
hier *nicht* will. Der Browser soll weiterlaufen und sich genauso
verhalten wie ein normaler Browser, nur dass er eben nicht von einem
Menschen bedient wird, der den Output sieht und Inputs über Tastatur,
Maus, etc. gibt, sondern über ein anderes Programm, das dafür den Output
"sehen" und Inputs senden können muss.


> Sorry. Sonst fällt mir zu Deinem Problem auch nichts ein.

Es ist nicht mein Problem. Ich habe nur skizziert, wie ich das Problem
lösen würde (und dabei angemerkt, dass ich für die letzte
Eskalationsstufe - wenn also nichts anderes hilft und man einen headless
Browser braucht - keinen Tipp mehr geben kann, weil es zu lange her ist,
dass ich das gebraucht habe).

hp

Christian Garbs

unread,
Oct 7, 2023, 6:37:32 PM10/7/23
to
Mahlzeit!

Andreas Kohlbach <a...@spamfence.net> wrote:
> On Tue, 3 Oct 2023 20:27:40 +0200, Peter J. Holzer wrote:
>>
>> [...] Um das in Cron verwenden zu können, braucht man aber einen
>> headless Browser, und da bin ich momentan überfragt (habe ich zuletzt
>> vor 10 Jahren gebraucht).
>
> lynx oder w3m vielleicht. Die können allerdings keine
> Web-Skripte. Vielleicht kann man aber was mit POST und GET bauen.

Mir war so, als könnte elinks minimales JavaScript. In der
Paketbeschreibung finde ich allerding nichts dazu.

Dann wollte ich schreiben "leider kann man elinks nicht
automatisieren, also wird man nach Ablauf der Download-Vorbereitungen
dann manuell den 'Speichern unter'-Dialog bedienen müssen" – aber laut
Paketbeschreibung¹ ist er über Perl, Lua und Guile skriptbar.

Vielleicht funktioniert das in der Richtung.
Mangels URL im OP konnte ich das nicht ausprobieren.

Ansonsten würde ich auch in Richtung "den JavaScript-Code in einem
Shellskript nachimplementieren" gehen. Leider fällt das bei
zukünftigen serverseitigen Änderungen auf die Nase.

Gruß
Christian

¹ 'apt-cache show elinks' auf Debian Bookworm
--
....Christian.Garbs....................................https://www.cgarbs.de
The older a man gets, the farther he had to walk to school as a boy.

Jan Schmidt

unread,
Oct 8, 2023, 4:34:04 PM10/8/23
to
Jan Schmidt wrote on 10/3/23 4:48 PM:
> Hi,
>
> ich habe bisher immer zyklisch eine csv-Datei von einem Server
> gedownloadet. Nun hat der Serverbetreiber vermutlich um die
> Wartezeit zu verstecken eine dynamische Seite davor geschaltet
> die einen Progressbalken anzeigt. Wenn der auf 100% steht, ist
> ein Button klickbar der zur csv Datei führt.

danke an alle. Leider haben die über die Woche das serverseitige
script wieder geändert.
Inzwischen basiert das auf bootstrap.js und zeigt die csv-Datei
direkt im Browser an.

Es gibt jetzt auch einen "direct download link", der hat die
selbe URL wie die originale, die auf die Einstiegsseite führt.
Ich hab wget in einer Schleife ausgeführt. Es ist immer nur die
Einstiegsseite ausgeliefert worden.

Ich vermute, das wird via websockets ausgeliefert. Verifizieren
konnte ich das nicht, weil alles https ist.

Mit F12 bin ich nicht weitergekommen (vermutlich muss ich damit
mal 'ne Weile spielen).

(und die URL wollte ich nicht veröffentlichen, weil diese zur
Statistik der Ladevorgänge meiner Wallbox führt.)

Ich werde jetzt mal den Hersteller fragen...

Nochmal danke an alle,
Jan

Christian Garbs

unread,
Oct 8, 2023, 8:01:15 PM10/8/23
to
Mahlzeit!

Andreas Kohlbach <a...@spamfence.net> wrote:

> Mir fiel irgendwann beim Updaten der Pakete in Linux "node"
> auf. Irgendwas wollte das bei seiner Installation mal haben.
>
> Ich habe aus Neugierde geschaut, was node ist. Aus der man Page:
>
> | Node.js is a set of libraries for JavaScript which allows it to be used
> | outside of the browser. It is primarily focused on creating simple,
> | easy-to-build network clients and servers. [...]
>
> Jetzt müsste man per Suchmaschine schauen, welche Browser es dafür gibt,
> und auf seinem System Pakete finden. Vielleicht ist eine Browser bei, der
> das Problem löst.

Du brauchst in Node keinen Browser, Du musst Dich lediglich damit
rumschlagen, dass alles asynchron ist:

- - - 8< - - -

const https = require('https');

https.get('https://example.com')
.on('response', response => {
const data = [];
response.on('data', chunk => data.push(chunk));
response.on('end', () => console.log(Buffer.concat(data).toString()));
})
.on('error', err => console.log('Error: ', err.message));

- - - >8 - - -

Das führt einen HTTP GET aus und gibt die Antwort aus.
Das JavaScript kannst Du dann direkt von Node ausführen lassen.

Da es typisch für das Node-Ökosystem ist, dass ständig alles mit sich
selbst inkompatibel ist, hier der Disclaimer: Das funktioniert mit
Node v18.12.1, für alles andere übernehme ich keine Garantie ;-)



Man könnte sich also das JavaScript vom Server runterladen und dann
lokal per Node ausführen. Vermutlich muss man dann aber die Klassen
Document und/oder Window irgendwie machbauen, ggf. reicht das aber
auch sehr rudimentär. (Was dann eine sehr minimale Version von 'man
braucht noch einen Browser' darstellt.)

Gruß
Christian
--
....Christian.Garbs....................................https://www.cgarbs.de
"Don't give up, lose interest." (Miranda Cornielle, Columbia Internet)

Markus Schaaf

unread,
Oct 10, 2023, 10:22:57 AM10/10/23
to
Am 03.10.23 um 16:48 schrieb Jan Schmidt:

> ich habe bisher immer zyklisch eine csv-Datei von einem Server
> gedownloadet. Nun hat der Serverbetreiber vermutlich um die
> Wartezeit zu verstecken eine dynamische Seite davor geschaltet
> die einen Progressbalken anzeigt. Wenn der auf 100% steht, ist
> ein Button klickbar der zur csv Datei führt.

Ein programmierbarer Headless-Browser, der ziemlich viel kann,
ist HtmlUnit. Nachteil (für mich) ist, dass man in Java
programmieren muss.

Was ich viel lästiger finde, ist dass man in solchen Websites oft
sehr schlecht navigieren kann, da die Elemente, die man per
Programm klicken muss, oft keine (stabilen) IDs haben und selbst
die Dokumentstruktur und die Beschriftung der Knöpfe ändern sich
manchmal wöchentlich. Es ist zum Kotzen. Ich habe gerade bei der
ING nachgefragt, ob sie wenigstens eine Option einbauen können,
meine paar tausend "Nachrichten" in der Postbox mit wenigen
Klicks zusammen downloaden zu können. Habe aber keine große
Hoffnung, dass da was kommt.

MfG

Arno Welzel

unread,
Oct 16, 2023, 9:32:19 AM10/16/23
to
Peter J. Holzer, 2023-10-03 20:27:
Statt Selenium würde ich eher Cypress nehmen, das ist deutlich einfacher
im Einstieg:

<https://www.cypress.io>

Da kann man vergleichsweise einfach auch Interkationen bauen mit
Anklicken von Buttons etc. und das läuft auch in einer Konsole.

Cypress gibt's auch fertig als Docker-Image:

<https://github.com/cypress-io/cypress-docker-images>

Darin ist dann neben Cypress auch ein Browser wie Chromium drin, der
Headless läuft, also ohne Desktop. Das Ganze dann idealerweise unter Linux.

--
Arno Welzel
https://arnowelzel.de

gregor herrmann

unread,
Oct 29, 2023, 7:00:09 PM10/29/23
to
On Tue, 3 Oct 2023 20:27:40 +0200, Peter J. Holzer wrote:

> Wenn es nicht so einfach ist, wäre Selenium die nächste
> Eskalationsstufe. Um das in Cron verwenden zu können, braucht man aber
> einen headless Browser, und da bin ich momentan überfragt (habe ich
> zuletzt vor 10 Jahren gebraucht).

ich verwend fuer sowas mittlerweile unter perl Firefox::Marionette,
das steuert einen headless firefox (auch via cron).

gregor

--
.''`. https://info.comodo.priv.at -- Debian Developer https://www.debian.org
: :' : OpenPGP fingerprint D1E1 316E 93A7 60A8 104D 85FA BB3A 6801 8649 AA06
`. `' Member VIBE!AT & SPI Inc. -- Supporter Free Software Foundation Europe
`-
0 new messages