PowerShell Invoke-WebRequest: Um Guia Completo

Alguma vez você já quis navegar na web via linha de comando? Sim. Eu também não. Mas você já precisou extrair informações de uma página da web, monitorar um site ou enviar informações via automação? Eu já precisei e uso o Invoke-Webrequest para fazer isso!

O cmdlet PowerShell Invoke-WebRequest é o canivete suíço para a web. Este cmdlet pode enviar qualquer verbo HTTP para um serviço da web juntamente com coisas comuns como parâmetros HTTP, especificar diferentes cabeçalhos HTTP e assim por diante. Invoke-WebRequest juntamente com seu irmão, Invite-RestMethod, são os dois cmdlets PowerShell que você vai querer se familiarizar se precisar fazer qualquer tipo de automação web.

O cmdlet Invoke-WebRequest faz parte do módulo Microsoft.PowerShell.Utility que vem com o Windows PowerShell e PowerShell Core. Este cmdlet foi incluído no PowerShell desde a versão 3 e é extremamente poderoso e fácil de usar.

Ao usar Invoke-WebRequest, PowerShell permite que um desenvolvedor trabalhe com sites, serviços da web e APIs REST de várias maneiras diferentes.

Uso Básico

No seu uso mais básico, o cmdlet Invoke-WebRequest envia um método de solicitação HTTP para um ponto de extremidade, como um URI ou URL. O cmdlet suporta todos os métodos de solicitação comuns.

De longe, o método mais comum é o método GET. Este método lê informações como informações de um site ou talvez consultando uma API REST. O método é definido usando o parâmetro Method. Como precisamos de um endpoint para consultar, também precisaremos de um URI. Para facilitar, escolherei qualquer site. Para promover descaradamente o TechSnips, escolherei techsnips.io.

Digamos que eu queira obter uma lista de todos os vídeos publicados mais recentes, como mostrado abaixo.

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

Para obter os vídeos, precisarei fazer algumas pesquisas. Quando olho para a propriedade de links, vejo que todas as ligações de vídeo têm uma classe de ng-binding, como mostrado abaixo.

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

Assim que souber disso, posso encontrar todos esses elementos e retornar apenas a propriedade innerHTML e pronto!

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

Baixando arquivos com Invoke-WebRequest

Também podemos usar o Invoke-WebRequest para baixar arquivos da web e é muito fácil! Podemos baixar arquivos simplesmente apontando o Invoke-WebRequest para um URI de um arquivo e usando o parâmetro OutFile para informar ao cmdlet para salvar o arquivo no disco local.

Como exemplo, abaixo estou baixando a utilidade Handle do SysInternals e expandindo o arquivo zip uma vez baixado. É realmente tão fácil!

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

Enviando um formulário e trabalhando com sessões

Podemos usar Invoke-WebRequest para também preencher formulários. Para fazer isso, no entanto, geralmente precisamos trabalhar com sessões web. HTTP é um protocolo naturalmente sem estado e seu navegador (neste caso, PowerShell) deve ser capaz de criar uma sessão que será usada para rastrear coisas como cookies, por exemplo. Um formulário comum é um formulário de login/senha, então vamos fazer login em um site fictício!

Vamos dizer que nosso formulário de login fictício está no URL http://somewebsite.com. Primeiro, precisaríamos executar Invoke-WebRequest para baixar a estrutura HTML e criar uma sessão.

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

Uma vez feito isso, a resposta terá uma propriedade Forms que podemos então preencher com um nome de usuário e senha. Neste caso, o nome de usuário é representado por um campo chamado user e a senha deve estar em um campo chamado password. Isso dependerá da página da web.

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

Depois que o formulário for preenchido, podemos usar Invoke-WebRequest novamente, mas desta vez reutilizar a sessão que acabamos de criar e automaticamente descobrir o URI para enviá-lo lendo a propriedade Action que está no formulário, conforme mostrado abaixo.

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

Se você tiver todos os nomes de campo apropriados corretos e a página da web não estiver fazendo nada sofisticado, você deve estar conectado com o nome de usuário e senha dentro da sessão web $rb. Neste ponto, você pode ler várias páginas atrás dessa autenticação se usar a variável de sessão web $rb.

Resolvendo URIs Curtos

Finalmente, outro ótimo uso do Invoke-WebRequest é resolver URIs curtas. Talvez você precise saber o que está por trás dessa URL encurtada, mas não queira clicar nela para descobrir! Sem problemas. Usando o Invoke-WebRequest, podemos ler a propriedade AbsoluteUri da resposta analisada que nos é fornecida!

Observe abaixo que também estou usando o parâmetro UseBasicParsing. Por padrão, o Invoke-WebRequest tenta usar o Internet Explorer (IE) para analisar o HTML retornado. Isso não funciona em sistemas sem o IE. Para contornar isso, podemos usar o parâmetro UseBasicParsing para baixar o conteúdo, mas apenas analisá-lo superficialmente.

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

Resumo

O cmdlet Invoke-WebRequest é um dos cmdlets mais versáteis que vêm com o PowerShell. Se houver uma ação que possa ser realizada por meio de um navegador gráfico típico, o cmdlet Invoke-WebRequest também poderá fazê-lo. Você pode encontrar um exemplo de uso deste cmdlet dando uma olhada neste artigo sobre monitoramento de APIs REST.

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