PowerShell Invoke-WebRequest: Um Guia Abrangente

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 precisei e uso Invoke-Webrequest para fazer isso!

O cmdlet PowerShell Invoke-WebRequest é o canivete suíço para a web. Esse cmdlet pode enviar qualquer verbo HTTP para um serviço 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 do PowerShell com os quais 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 o PowerShell Core. Esse cmdlet foi incluído no PowerShell desde a versão 3 e é extremamente poderoso, mas fácil de usar.

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

Uso Básico

No seu mais básico, o cmdlet Invoke-WebRequest envia um método de requisição HTTP para um endpoint como uma URI ou URL. O cmdlet suporta todos os métodos de requisição comuns (request methods).

Até agora, o método mais comum é o método GET. Este método lê informações, como dados de um site ou talvez consulta a uma API REST. O método é definido usando o parâmetro Method. Como precisamos de um ponto de extremidade para a consulta, também precisaremos de uma 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 mais recentes publicados, conforme 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 cavar um pouco. Quando olho para a propriedade de links, vejo que todos os links de vídeo têm a classe ng-binding, como mostrado abaixo.

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

Uma vez que sei disso, posso encontrar todos esses elementos e retornar apenas a propriedade innerHTML, e voilà!

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

Download de arquivos com Invoke-WebRequest

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

Como exemplo, abaixo estou baixando a utilidade SysInternals Handle e expandindo o arquivo zip depois de 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

Envio de um formulário e trabalho com sessões

Podemos usar Invoke-WebRequest também para preencher formulários. Para fazer isso, geralmente precisamos trabalhar com sessões da web. HTTP é um protocolo naturalmente sem estado e seu navegador (neste caso, o 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

Depois de fazer 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, como mostrado abaixo.

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

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

Resolvendo URIs Curtos

Finalmente, mais uma ótima utilização 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 problema. Usando o Invoke-WebRequest, podemos ler a propriedade AbsoluteUri a partir da resposta analisada que ele nos fornece!

Observe que abaixo estou também 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 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 mais versáteis que acompanham o PowerShell. Se há uma ação que pode ser realizada por meio de um navegador gráfico típico, o cmdlet Invoke-WebRequest também pode fazê-la. 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/