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.

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.

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.

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

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!
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.
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.
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.
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.
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.