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.

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.

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.

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

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