k-ist-k
Goto Top

Download File per PowerShell (AGBs akzeptieren)

Hallo ITler,

Ich hab eine URL, die wenn man die im Browser einfügt, als erstes eine Webseite anzeigt, wo man ein Checkbox Feld anklicken muss und dann auf Bestägigung Button klicken muss (AGBs akzeptieren).

Wenn die AGBs akzeptiert wurden 1x, kommt sofort mit der URL ein Instant Download.
Es gibt viele Möglichkeiten Daten herunterzuladen.

$URL = "www.testURL.at/HomeScreen.jpg"  
$Target = "C:\Downloads\HomeScreen.jpg"  

$WebClient = New-Object System.Net.WebClient
$WebClient.DownloadFile("$URL","$Target")  

Das Problem ist, das es zwar im Target das Bild abspeichert, aber mit 7KB und defekt.
Probleme sehe ich darin, das es zu keinen Download kommt, weil AGBs akzeptiert werden müssen.

Sonst kenne ich noch folgende Befehle, für einen Download:
Invoke-RestMethod
Invoke-WebRequest
Start-BitsTransfer

Aber wie kann ich AGBs akzeptieren, die ich in PowerShell nicht sehe?
Die AGBs im Browser vorab akzeptieren und dann in PowerShell Skript ausführen, hilft logischerweise nichts.

Hat wer eine Idee dazu?

Danke und LG K

Content-ID: 6273071770

Url: https://administrator.de/contentid/6273071770

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

6247018886
Lösung 6247018886 08.03.2023 aktualisiert um 14:46:18 Uhr
Goto Top
Moin.
Dafür gibt es kein allgemeingültiges Rezept das überall und immer funktioniert, das hängt immer von der Seite ab. Erster Schritt bei sowas ist, mit F12 im Browser die Entwickler-Tools zu öffnen, dann auf den "Netzwerkanalyse" Tab zu wechseln und den Download manuell anzustoßen.
Dann sieht man welche Daten die Webseite evt. Vorher per POST oder GET übermittelt und kann diesen Request dann manuell in der PS nachbilden. Sollte die URL die du dort erhältst bei jedem mal gleich sein reicht manchmal diese zu verwenden, aber meist ist der Download an bestehenee Cookies, UIDs etc.gebunden die du beim Request wieder mitgeben musst.
Manchmal kommt auch JavaScript ins Spiel, hier ist man dann oftmals auf Fernsteuerung des Browsers angewiesen (z.B. mit Selenium) weil JavaScript nur interpretiert und ausgeführt wird wenn es in einer entsprechenden Umgebung läuft. Wenn man das JavaScript aber vorher analysiert lässt sich auch das in PS nachbauen und umgehen. Wie gesagt hängt und fällt alles mit der entsprechenden Seite.

Wenn du uns die Seite verraten kannst können wir dir spezifischer auf die Seite zugeschnitten mit Codebeispielen helfen.

Anwendungs-Beispiele mit PowerShell wie man sowas macht finden sich aber auch im hiesigen Forum wenn man die Suche an wirft.

Eine Auswahl die ich hier zum Thema finden konnte


Cheers briggs
K-ist-K
K-ist-K 08.03.2023 um 14:57:12 Uhr
Goto Top
Hallo Briggs,

vielen Dank schon Mal für die erste Hilfe.
Ich hab das gleich Mal gemacht, ich teile hier gleich mal ein paar Infos mit.

Leider sind die Prozesse/Strukturen geheim zu halten, ich darf somit kaum bis keine Infos weitergeben.
Wenn es teils auch spannend ist, denn es handelt sich hier um eine öffentliche Webseite.
Ich weiß das somit das unterstützen sehr schwierig ist und das tut mir leid.

Ich kann somit so viel sagen, es handelt sich hier um eine NextCloud.
Spanned ist, wenn ich die öffentliche URL (öffentliche Share Freigabe) nutze komme ich ohne AGBs zum Verzeichnis, wo eine Datei drin liegt.

Hänge ich hinten /download an würde es den vollständigen Inhalt als .zip downloaden.
Hier fragt es aber AGBs ab.

Es gibt
unter "Network" bei Name "ldpDiscoveryLogin gibt es Cookies.
Name: (Response Cookie) M_TXID_Browser_Session und Value aus Buchstaben und Zahlen kombi.
Name: (Request Cookie) csrftoken und Value aus Buchstaben und Zahlen kombi.


Nach dem anhaken und "Einverstanden" drücken hat der Download begonnen.
Und es kam ein neuer Cookie dazu:

Name: (Response Cookie) agb und Value 2.>
csrftoken / agb sind die einzigen Cookie die eine Ablaufzeit haben und nicht an die Session gebunden ist.

Wie kann ich mit dem PowerShell Skript die Cookies mitgeben?
Falls die Infos ausreichend sind.
6247018886
6247018886 08.03.2023 aktualisiert um 15:49:47 Uhr
Goto Top
Zitat von @K-ist-K:
Wie kann ich mit dem PowerShell Skript die Cookies mitgeben?
Falls die Infos ausreichend sind.
Invoke-WebRequest hat den Parameter -SessionVariable und -WebSession

Mit -SessionVariable legt man den Namen der SessionVariablen fest und mit -WebSession nutzt man die Session erneut
# request mit Session
Invoke-Webrequest -Uri 'https://xxxxx.de' -SessionVariable mySession  
# request mit der Session-Variable machen
Invoke-Webrequest -Uri 'https://xxxxx.de' -WebSession $mySession  
Die Variable enthält nach dem ersten Aufruf die Cookies und beim zweiten Request werden evt. erstellte Cookies dann auch wieder übermittelt.

Du musst bei Nextcloud eigentlich nur auf die Seite gehen und dann den individuellen Download-Link kopieren der dort angezeigt wird. Klappt hier im Test dann einwandfrei hiermit von einer Nextcloud.
Invoke-Webrequest -Uri 'https://xxxxxx.de:/s/RnqZ2m6TmtEX4Qz/download/Nextcloud%20Manual.pdf' -OutFile .\test.pdf
Man muss nur <sharelink>/download/<Dateiname URL kodiert> benutzen um den Download direkt anzustoßen.
colinardo
colinardo 08.03.2023 aktualisiert um 18:26:57 Uhr
Goto Top
Servus @K-ist-K,
ich vermute mal deine Seite nutzt die Nextcloud App-Erweiterung nextcloud/terms_of_service um die AGB zur Bestätigung anzuzeigen. Wenn das der Fall ist, kannst du es hiermit versuchen, das hatte ich für diese Nextcloud Apperweiterung mal geschrieben (Share-Link und den lokalen Speicherpfad für die Datei im Kopf anpassen):
# nextcloud share link to download
$sharelink = 'https://domain.de/s/6fc9xLNKmFxS8L6'  
# local download path
$savepath = '.\file.zip'  
# ----------------------------------------
# extract domain part from sharelink
$domain = [regex]::match($sharelink,'(?i)^https?://[^/]+').Value  
# get request token
$token = [regex]::match((Invoke-Webrequest -Uri $sharelink -SessionVariable ws -UseBasicParsing).Content,'data-requesttoken="([^"]+)').Groups[1].Value  
# approve request to download the file (Works with Nextcloud "terms_of_service" App extension) 
Invoke-WebRequest -Uri "$domain/apps/terms_of_service/sign_public" -WebSession $ws -UseBasicParsing -Method POST -ContentType "application/json" -Body '{"termId":1}' -Headers @{requesttoken=$token} | out-null  
# Finally download the file
Invoke-Webrequest -Uri "$sharelink/download" -OutFile $savepath -WebSession $ws -UseBasicParsing -verbose  
#edit# Habe das gerade mal mit einer aktuellen Nextcloud und der o.g. App Erweiterung erfolgreich mit einem Download getestet.

Grüße Uwe
K-ist-K
K-ist-K 09.03.2023 um 08:36:55 Uhr
Goto Top
Guten Morgen Uwe,

danke das du auch gleich ein Skript mitgibst.
Es erstellt zwar ein .zip File (7KB) aber das ist kein Archiv lt. Windows.

Die Ausgabe war folgende:
AUSFÜHRLICH: GET https://TEST.at/index.php/s/3Z53mytpqbjTEYw/download with 0-byte payload
AUSFÜHRLICH: received 7059-byte response of content type text/html; charset=utf-8

In der öffentlichen Freigabe befindet sich nur eine Test .jpg Datei.
Mir fällt am Skript nur auf, das $token leer ist.
Nehme es scheitert hier: 'data-requesttoken="([^"]+)')

(Invoke-Webrequest -Uri $sharelink -SessionVariable ws -UseBasicParsing).Content
Liefert mir html Code, im Text zu erkennen sind die Nutzungsbedienungen.

Hoffe der Screenshot hilft:
ausgabe
colinardo
colinardo 09.03.2023 aktualisiert um 08:57:39 Uhr
Goto Top
So wie der Quellcode aussieht nutzt die Seite das o.g. Plugin nicht es kann also dort damit nicht funktionieren.

Für eine weitere Analyse ist das ohne weitere Infos von der Seite schwer von hier aus. Du kannst aber mal das o.g. Formular per POST "submitten" eventuell reicht das schon.
K-ist-K
K-ist-K 09.03.2023 um 09:00:20 Uhr
Goto Top
@colinardo aktive Apps angesehen.
terms_of_service finde ich nicht, und auch nichts vergleichbares.
Im <head> steht nichts brauchbares.
Einmal Kodierung utf-8
Name="Viewport"
2x Stylesheet und ein Link (Bootstrap, Disclaimer)
Title > Nutzungsbedienungen


@6247018886
Man muss nur <sharelink>/download/<Dateiname URL kodiert> benutzen um den Download direkt anzustoßen.
Das kenne ich, aber auch dann kommt bei mir zuerst AGB Abfrage.
Ohne direkt Download fragt es keine AGBs ab, da müsste ich über WebDav runterladen.
Mit /download kommt AGBs, dann muss ich irgendwie das Cookie mitgeben.
colinardo
Lösung colinardo 09.03.2023 aktualisiert um 10:13:55 Uhr
Goto Top
Wie gesagt kann ich hier dann nur raten ohne weitere Info aus dem Netzwerkanalyse Tab.
Wenn im HTML Code nur diese einzige "Form" vorkommt die du oben gezeigt hast, kannst du mal das hier testen was die gezeigte Form übermittelt, wenn da noch weitere Forms vorhanden sind musst du die Form expliziter referenzieren damit die richtige übermittelt wird (ID/Name/etc):
$sharelink = 'https://domain.de/s/xxxxxxx'  
$savepath = '.\file.zip'  
$req = Invoke-Webrequest $sharelink -SessionVariable ws
Invoke-WebRequest $sharelink -Method POST -Body $req.Forms -WebSession $ws
Invoke-Webrequest "$sharelink/download" -OutFile $savepath -WebSession $ws -UseBasicParsing -verbose  

Mehr Hilfe kann ich dir hier nur auf Anfrage per PN , dafür aber eine Erfolgsgarantie zu 100%.

Viel Erfolg.
Grüße Uwe
K-ist-K
K-ist-K 09.03.2023 um 09:42:05 Uhr
Goto Top
@colinardo

Danke für die Unterstützung.
Das Skript scheitert jetzt aber daran, das $reg.Forms nichts hat, also 0 ist.

$reg hat bei Forms {} nichts.
Ich werde noch weiter suchen, falls ich auf eine Lösung komme poste ich die hier.
Sollte mein zweiter Workarround in der Firma durchgehen, kann ich mir diesen Workarround sparen.

Schönen Tag noch.
colinardo
colinardo 09.03.2023 aktualisiert um 09:43:04 Uhr
Goto Top
$reg.Forms
Du machst einen Tippfehler! Das heißt $req mit kleinem "Q".
K-ist-K
K-ist-K 09.03.2023 um 09:49:17 Uhr
Goto Top
Stimmt, danke.
Dann ist die nicht leer, jetzt läuft es durch, leider halt nur nicht mit Erfolg.
Ich hatte eine Variable nicht geleert gehabt.
K-ist-K
Lösung K-ist-K 09.03.2023 aktualisiert um 10:07:41 Uhr
Goto Top
So hab es jetzt gelöst, das war es bei mir.
# nextcloud share link to download
$sharelink = 'https://test.at/index.php/s/3Z53mytpqbjTEYw/download'  


# local download path
$savepath = '.\file.zip'  

Import-Module Microsoft.PowerShell.Utility
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession

$cookie = New-Object System.Net.Cookie
$cookie.Name = "agb"  
$cookie.Value = "2"  
$cookie.Domain = "test.at"  
$session.Cookies.Add($cookie)

Invoke-WebRequest -Uri $sharelink -WebSession $session -OutFile $savepath