PowerShell Invoke-WebRequest: Ein umfassender Leitfaden

Hast du jemals im Web über die Befehlszeile surfen wollen? Ja. Ich auch nicht. Aber hast du jemals Informationen von einer Webseite abrufen müssen, eine Website überwachen oder Informationen automatisiert übermitteln müssen? Ich schon, und ich benutze Invoke-Webrequest dafür!

Das Invoke-WebRequest PowerShell-Cmdlet ist das Schweizer Taschenmesser für das Web. Mit diesem Cmdlet können beliebige HTTP-Verben an einen Webdienst gesendet werden, zusammen mit üblichen Dingen wie HTTP-Parametern, verschiedenen HTTP-Headern und so weiter. Invoke-WebRequest zusammen mit seinem Bruder Invite-RestMethod sind die beiden PowerShell-Cmdlets, mit denen du dich vertraut machen solltest, wenn du irgendeine Art von Webautomatisierung durchführen möchtest.

Das Invoke-WebRequest-Cmdlet ist Teil des Microsoft.PowerShell.Utility-Moduls, das mit Windows PowerShell und PowerShell Core geliefert wird. Dieses Cmdlet ist seit PowerShell v3 dabei und es ist eines, das extrem leistungsstark und dennoch einfach zu bedienen ist.

Indem man Invoke-WebRequest verwendet, ermöglicht PowerShell einem Entwickler, auf Websites, Webdienste und REST-APIs auf viele verschiedene Arten zuzugreifen.

Grundlegende Verwendung

Auf dem einfachsten Stand sendet das Invoke-WebRequest-Cmdlet eine HTTP-Anforderungsmethode an einen Endpunkt wie eine URI oder URL. Das Cmdlet unterstützt alle gängigen Anforderungsmethoden.

Bisher ist die gebräuchlichste Methode die GET-Methode. Diese Methode liest Informationen wie Daten von einer Website oder möglicherweise eine Abfrage an eine REST-API. Die Methode wird durch Verwendung des Method-Parameters definiert. Da wir eine Endpunkt benötigen, um Abfragen durchzuführen, benötigen wir auch eine URI. Um es einfach zu halten, wähle ich eine beliebige Website aus. Um schamlos für TechSnips zu werben, wähle ich techsnips.io.

Angenommen, ich möchte eine Liste aller neuesten veröffentlichten Videos wie unten gezeigt erhalten.

Example webpage

I can get an HTML representation of this page by running Invoke-WebRequest -Uri 'https://techsnips.io' -Method GET. When I do this, Invoke-WebRequest downloads the entire web page and returns an output with various parsed information around the elements of the page.

Invoke-WebRequest response

Um die Videos zu erhalten, muss ich etwas graben. Wenn ich mir die Links-Eigenschaft anschaue, sehe ich, dass alle Video-Links eine Gemeinsamkeit haben, nämlich eine Klasse von ng-binding, wie unten gezeigt.

$result.Links | where {$_.class -eq ‘ng-binding’}

Sobald ich dies weiß, kann ich dann alle diese Elemente finden und nur die innerHTML-Eigenschaft zurückgeben, und voilà!

$result.links | where {$_.class -eq ‘ng-binding’} | Select-Object innerHtml

Dateien herunterladen mit Invoke-WebRequest

Wir können auch Invoke-WebRequest verwenden, um Dateien aus dem Internet herunterzuladen, und es ist wirklich einfach! Wir können Dateien herunterladen, indem wir Invoke-WebRequest einfach auf eine URI einer Datei richten und den OutFile-Parameter verwenden, um dem Cmdlet mitzuteilen, die Datei auf der lokalen Festplatte zu speichern.

Zum Beispiel lade ich unten das SysInternals Handle-Dienstprogramm herunter und entpacke die Zip-Datei, sobald sie heruntergeladen ist. Es ist wirklich so einfach!

Invoke-WebRequest -Uri 'https://download.sysinternals.com/files/Handle.zip' -OutFile C:\handle.zi Expand-Archive -Path C:\handle.zip

Ein Formular senden und mit Sitzungen arbeiten

Wir können Invoke-WebRequest verwenden, um auch Formulare auszufüllen. Dafür müssen wir jedoch in der Regel mit Web-Sitzungen arbeiten. HTTP ist ein naturgemäß zustandsloses Protokoll, und Ihr Browser (in diesem Fall PowerShell) muss in der Lage sein, eine Sitzung zu erstellen, die zur Verfolgung von Dingen wie Cookies verwendet wird, zum Beispiel. Ein häufiges Formular ist ein Anmelde-/Passwortformular. Lassen Sie uns also auf einer fiktiven Website einloggen!

Angenommen, unser fiktives Anmeldeformular befindet sich unter der URL http://somewebsite.com. Wir müssen zuerst Invoke-WebRequest ausführen, um die HTML-Struktur herunterzuladen und eine Sitzung zu erstellen.

$response = Invoke-WebRequest -Uri 'http://somewebsite.com' -SessionVariable rb

Sobald wir dies tun, wird die Antwort eine Forms-Eigenschaft haben, die wir dann mit einem Benutzernamen und einem Passwort ausfüllen können. In diesem Fall wird der Benutzername durch ein Feld namens user und das Passwort durch ein Feld namens password repräsentiert. Dies hängt von der Webseite ab.

$form = $response.Forms[0]
$form.Fields["user"] = "username"
$form.Fields["password"] = "password"

Nachdem das Formular ausgefüllt wurde, können wir erneut Invoke-WebRequest verwenden, diesmal jedoch die gerade erstellte Sitzung wiederverwenden und automatisch die URI herausfinden, an die sie gesendet werden soll, indem wir die Action-Eigenschaft auf dem Formular lesen, wie unten gezeigt.

$response = Invoke-WebRequest -Uri $form.Action -WebSession $rb -Method POST

Wenn Sie alle entsprechenden Feldnamen richtig haben und die Webseite nichts Besonderes macht, sollten Sie mit dem Benutzernamen und dem Passwort innerhalb der $rb-Web-Sitzung eingeloggt sein. Zu diesem Zeitpunkt können Sie verschiedene Seiten hinter dieser Authentifizierung lesen, wenn Sie die Variable der $rb-Web-Sitzung verwenden.

Auflösen von kurzen URIs

Schließlich, eine weitere großartige Verwendung von Invoke-WebRequest ist die Auflösung von kurzen URLs. Vielleicht möchten Sie wissen, was sich hinter dieser verkürzten URL verbirgt, möchten aber nicht darauf klicken, um es herauszufinden! Kein Problem. Mit Invoke-WebRequest können wir die AbsoluteUri-Eigenschaft aus der geparsten Antwort lesen!

Beachten Sie unten, dass ich auch den UseBasicParsing-Parameter verwende. Standardmäßig versucht Invoke-WebRequest, den zurückgegebenen HTML-Code mit dem Internet Explorer (IE) zu parsen. Dies funktioniert nicht auf Systemen ohne IE. Um das zu umgehen, können wir den UseBasicParsing-Parameter verwenden, um den Inhalt dennoch herunterzuladen, aber nur leicht zu parsen.

$Url = 'buff.ly/2sWvPOH'
$Web = Invoke-WebRequest -Uri $Url -UseBasicParsing
$Web.BaseResponse.ResponseUri.AbsoluteUri

Zusammenfassung

Das Invoke-WebRequest-Cmdlet ist eines der vielseitigsten Cmdlets, die mit PowerShell geliefert werden. Wenn eine Aktion über einen typischen grafischen Browser durchgeführt werden kann, kann das Invoke-WebRequest-Cmdlet dies auch tun. Ein Beispiel für die Verwendung dieses Cmdlets finden Sie in diesem Artikel über das Überwachen von REST-APIs.

Source:
https://adamtheautomator.com/invoke-webrequest/