PowerShell Invoke-WebRequest: Una guida completa

Hai mai desiderato navigare sul web tramite la riga di comando? Sì, nemmeno io. Ma hai mai avuto bisogno di estrarre informazioni da una pagina web, monitorare un sito web o inviare informazioni tramite automazione? Io sì e utilizzo Invoke-Webrequest per farlo!

Il cmdlet PowerShell Invoke-WebRequest è l’arma svizzera per il web. Questo cmdlet può inviare qualsiasi verbo HTTP a un servizio web insieme a cose comuni come parametri HTTP, specificare diversi header HTTP e così via. Invoke-WebRequest insieme al suo fratello Invite-RestMethod sono i due cmdlet PowerShell con cui ti conviene familiarizzare se hai bisogno di fare qualsiasi tipo di automazione web.

Il cmdlet Invoke-WebRequest fa parte del modulo Microsoft.PowerShell.Utility che viene fornito con Windows PowerShell e PowerShell Core. Questo cmdlet è stato incluso in PowerShell sin dalla versione 3 ed è estremamente potente ma facile da usare.

Utilizzando Invoke-WebRequest, PowerShell consente a un sviluppatore di lavorare con siti web, servizi web e REST API in molti modi diversi.

Utilizzo di base

Nella sua forma più semplice, il cmdlet Invoke-WebRequest invia un metodo di richiesta HTTP a un endpoint come un URI o un URL. Il cmdlet supporta tutti i comuni metodi di richiesta.

Finora, il metodo più comune è il metodo GET. Questo metodo legge informazioni come dati da un sito web o forse fa una query a un’API REST. Il metodo è definito utilizzando il parametro Method. Poiché abbiamo bisogno di un endpoint per la query, avremo anche bisogno di un URI. Per semplificare, sceglierò un qualsiasi sito web. Per fare pubblicità spudorata a TechSnips, sceglierò techsnips.io.

Supponiamo che voglia ottenere un elenco di tutti gli ultimi video pubblicati come mostrato di seguito.

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

Per ottenere i video, dovrò fare qualche ricerca. Quando guardo la proprietà dei link, vedo una comunanza: tutti i link dei video hanno una classe di ng-binding, come mostrato di seguito.

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

Una volta che lo so, posso trovare tutti quegli elementi e restituire solo la proprietà innerHTML, e voilà!

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

Scaricare file con Invoke-WebRequest

Possiamo anche utilizzare Invoke-WebRequest per scaricare file da Internet ed è davvero facile! Possiamo scaricare file puntando semplicemente Invoke-WebRequest a un URI di un file e utilizzando il parametro OutFile per dire al cmdlet di salvare il file su disco locale.

Come esempio, di seguito sto scaricando l’utilità SysInternals Handle ed espandendo il file zip una volta scaricato. È davvero così semplice!

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

Invio di un modulo e lavoro con le sessioni

Possiamo utilizzare Invoke-WebRequest anche per compilare moduli. Tuttavia, per fare ciò, è comune lavorare con sessioni web. HTTP è un protocollo naturalmente senza stato e il browser (in questo caso PowerShell) deve essere in grado di creare una sessione che verrà utilizzata per tenere traccia di elementi come i cookie, ad esempio. Un modulo comune è un modulo di accesso utente/password, quindi effettuiamo l’accesso a un sito web immaginario!

Diciamo che il nostro fittizio modulo di accesso si trova all’URL http://sitoimmaginario.com. Prima dovremmo eseguire Invoke-WebRequest per scaricare la struttura HTML e creare una sessione.

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

Dopo aver fatto ciò, la risposta avrà una proprietà Forms che possiamo quindi popolare con un nome utente e una password. In questo caso, il nome utente è rappresentato da un campo chiamato user e la password dovrebbe essere in un campo chiamato password. Questo dipenderà dalla pagina web.

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

Una volta che il modulo è stato compilato, possiamo utilizzare nuovamente Invoke-WebRequest, ma questa volta riutilizzando la sessione che abbiamo appena creato e determinando automaticamente l’URI a cui inviarlo leggendo la proprietà Action che è presente nel modulo come mostrato di seguito.

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

Se hai inserito correttamente tutti i nomi dei campi appropriati e la pagina web non sta facendo nulla di particolare, dovresti essere connesso con il nome utente e la password all’interno della variabile di sessione web $rb. A questo punto, puoi leggere varie pagine dietro quell’autenticazione se utilizzi la variabile di sessione web $rb.

Risoluzione degli URI brevi

Infine, un altro ottimo utilizzo di Invoke-WebRequest è risolvere gli URL abbreviati. Forse hai bisogno di sapere cosa si nasconde dietro quel link abbreviato ma non vuoi cliccarci per scoprirlo! Nessun problema. Utilizzando Invoke-WebRequest, possiamo leggere la proprietà AbsoluteUri dalla risposta analizzata che ci restituisce!

Osserva che qui sto anche utilizzando il parametro UseBasicParsing. Per impostazione predefinita, Invoke-WebRequest cerca di utilizzare Internet Explorer (IE) per analizzare l’HTML restituito. Questo non funziona su sistemi senza IE. Per aggirare questo problema, possiamo utilizzare il parametro UseBasicParsing per scaricare comunque il contenuto, ma solo analizzarlo in modo leggero.

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

Riepilogo

Il cmdlet Invoke-WebRequest è uno dei cmdlet più versatili forniti con PowerShell. Se c’è un’azione che può essere eseguita tramite un normale browser grafico, il cmdlet Invoke-WebRequest può farlo anche. Puoi trovare un esempio di utilizzo di questo cmdlet esaminando questo articolo su monitoraggio delle API REST.

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