PowerShell Invoke-WebRequest: Een Uitgebreide Gids

Heb je ooit willen surfen op het web via de commandoregel? Ja, ik ook niet. Maar heb je ooit informatie van een webpagina moeten halen, een website moeten monitoren of informatie moeten indienen via automatisering? Ik wel, en ik gebruik Invoke-Webrequest om het te doen!

De Invoke-WebRequest PowerShell-cmdlet is het Zwitserse zakmes voor het web. Dit cmdlet kan elke HTTP-methode naar een webservice sturen, samen met veelvoorkomende zaken zoals HTTP-parameters, verschillende HTTP-headers en dergelijke. Invoke-WebRequest samen met zijn broer, Invoke-RestMethod, zijn de twee PowerShell-cmdlets die je wilt leren kennen als je enige vorm van webautomatisering moet doen.

Het Invoke-WebRequest-cmdlet maakt deel uit van de Microsoft.PowerShell.Utility-module die wordt geleverd met Windows PowerShell en PowerShell Core. Dit cmdlet is opgenomen in PowerShell sinds versie 3 en het is er een dat extreem krachtig is maar toch eenvoudig te gebruiken.

Door Invoke-WebRequest te gebruiken, stelt PowerShell een ontwikkelaar in staat om op veel verschillende manieren met websites, webservices en REST-API’s te werken.

Basisgebruik

Op zijn meest elementaire niveau stuurt het Invoke-WebRequest-cmdlet een HTTP-verzoeksmethode naar een eindpunt zoals een URI of URL. Het cmdlet ondersteunt alle gangbare verzoekmethoden.

Op verre afstand is de meest voorkomende methode de GET-methode. Deze methode leest informatie zoals gegevens van een website of het mogelijk bevragen van een REST API. De methode wordt gedefinieerd door gebruik te maken van de Method-parameter. Aangezien we een eindpunt nodig hebben om te bevragen, hebben we ook een URI nodig. Om dit eenvoudig te houden, kies ik een willekeurige website. Om schaamteloos TechSnips te promoten, kies ik techsnips.io.

Stel dat ik een lijst wil krijgen van alle recent gepubliceerde video’s zoals hieronder weergegeven.

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

Om de video’s te krijgen, moet ik wat graven. Wanneer ik naar de links-eigenschap kijk, zie ik een gemeenschappelijkheid dat alle videolinks de klasse ng-binding hebben zoals hieronder weergegeven.

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

Zodra ik dit weet, kan ik vervolgens al die elementen vinden en alleen de eigenschap innerHTML retourneren en voilà!

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

Bestanden downloaden met Invoke-WebRequest

We kunnen ook Invoke-WebRequest gebruiken om bestanden van internet te downloaden en het is echt eenvoudig! We kunnen bestanden downloaden door eenvoudigweg Invoke-WebRequest te richten op de URI van een bestand en de OutFile-parameter te gebruiken om het cmdlet te vertellen het bestand op de lokale schijf op te slaan.

Als voorbeeld download ik hieronder het SysInternals Handle-hulpprogramma en breid ik het zipbestand uit zodra het is gedownload. Het is echt zo eenvoudig!

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

Het indienen van een formulier en werken met sessies

We kunnen Invoke-WebRequest gebruiken om ook formulieren in te vullen. Hiervoor moeten we vaak werken met web-sessies. HTTP is van nature een stateless protocol en je browser (in dit geval PowerShell) moet in staat zijn om een sessie te maken die wordt gebruikt om dingen bij te houden zoals cookies, bijvoorbeeld. Een veelvoorkomend formulier is een inlog-/wachtwoordformulier, dus laten we inloggen op een fictieve website!

Laten we zeggen dat ons fictieve inlogformulier zich bevindt op de URL http://somewebsite.com. We moeten eerst Invoke-WebRequest uitvoeren om de HTML-structuur te downloaden en een sessie te maken.

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

Zodra we dit doen, zal de reactie een Forms-eigenschap hebben die we vervolgens kunnen invullen met een gebruikersnaam en wachtwoord. In dit geval wordt de gebruikersnaam vertegenwoordigd door een veld genaamd user en het wachtwoord moet in een veld genaamd password staan. Dit hangt af van de webpagina.

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

Zodra het formulier is ingevuld, kunnen we opnieuw Invoke-WebRequest gebruiken, maar deze keer hergebruiken we de sessie die we zojuist hebben gemaakt en automatisch de URI achterhalen om het naartoe te sturen door de Action-eigenschap te lezen die op het formulier staat, zoals hieronder wordt getoond.

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

Als je alle juiste veldnamen hebt en de webpagina niets bijzonders doet, zou je moeten zijn ingelogd met de gebruikersnaam en het wachtwoord binnen de $rb web sessie. Op dit punt kun je verschillende pagina’s achter die authenticatie lezen als je de $rb web sessie variabele gebruikt.

Oplossen van korte URI’s

Eindelijk, nog een geweldige toepassing van Invoke-WebRequest is het oplossen van verkorte URL’s. Misschien wil je weten wat er achter die ingekorte URL zit, maar wil je er niet op klikken om erachter te komen! Geen probleem. Met Invoke-WebRequest kunnen we de AbsoluteUri-eigenschap lezen uit de geparseerde respons die het ons geeft!

Let op dat ik hier ook de parameter UseBasicParsing gebruik. Standaard probeert Invoke-WebRequest Internet Explorer (IE) te gebruiken om de geretourneerde HTML te parseren. Dit werkt niet op systemen zonder IE. Om dit te omzeilen, kunnen we de parameter UseBasicParsing gebruiken om de inhoud nog steeds te downloaden, maar slechts licht te parseren.

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

Samenvatting

De cmdlet Invoke-WebRequest is een van de meest veelzijdige cmdlets die bij PowerShell worden geleverd. Als er een actie is die via een typische grafische browser kan worden uitgevoerd, kan de cmdlet Invoke-WebRequest het ook. Je kunt een voorbeeld vinden van het gebruik van deze cmdlet door naar dit artikel over het monitoren van REST API’s te kijken.

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