Como usar o PowerShell Invoke-WebRequest com um proxy

O cmdlet Invoke-WebRequest no PowerShell é uma ferramenta útil para fazer solicitações HTTP para sites. Se você estiver usando os serviços de proxy da Bright Data, pode usar esse cmdlet com um proxy especificando o parâmetro -Proxy seguido pelos detalhes do seu proxy.
12 min read
Invoke-Webrequest With a Proxy

No final deste guia de proxy do PowerShell do Invoke-WebRequest, você saberá:

Vamos lá! 

O que é o PowerShell Invoke-WebRequest?

Invoke-WebRequest é um cmdlet do PowerShell para enviar solicitações HTTP, HTTPS e FTP para servidores e serviços web. Por padrão, ele analisa automaticamente a resposta produzida pelo servidor e retorna coleções de formulários, links, imagens ou outros elementos HTML significativos. 

Normalmente, ele é usado para acessar APIs REST, baixar arquivos da web ou interagir com serviços da web. Essa é a sintaxe básica de uma solicitação Invoke-WebRequest:

Invoke-WebRequest [-Uri] <Uri> [-Method <WebRequestMethod>] [-Headers <IDictionary>] [-Body <Object>]

Os principais parâmetros a serem lembrados são:

  • -Uri: O URI do recurso da web para o qual a solicitação é enviada.
  • Método: O método HTTP a ser usado na solicitação (por exemplo, GET, POST, PUT, DELETE). Invoke-WebRequest envia solicitações GET por padrão.
  • -Headers: Os cabeçalhos HTTP adicionais a serem incluídos na solicitação.
  • -Corpo: O corpo da solicitação a ser enviada ao servidor.

Como você pode ver, o único argumento necessário é . Assim, em resumo, a sintaxe mais simples para realizar uma solicitação GET para um determinado URI é:

Invoke-WebRequest <Uri>

Esse cmdlet foi introduzido no PowerShell 3.0, em 2012. 

Instalando o Invoke-WebRequest

Para usar Invoke-WebRequest, você precisa do PowerShell. Então, vamos aprender como instalar o PowerShell e obter acesso ao cmlet Invoke-WebRequest!

Windows

Primeiro, você precisa entender que Windows PowerShell e PowerShell são duas coisas diferentes. O Windows PowerShell é a versão do PowerShell fornecida com o Windows, e sua versão mais recente é a 5.1. O Windows Powershell fornece o cmlet Invoke-WebRequest. Isso significa que, se você estiver em uma versão moderna do Windows, você está pronto para começar! Para versões mais antigas, siga o guia oficial de instalação do PowerShell.

Ao mesmo tempo, alguns recursos do Invoke-WebRequest só estão disponíveis a partir do PowerShell 7.x. Para obter mais detalhes sobre como instalá-lo, siga o guia oficial de migração do Windows PowerShell 5.1 para o PowerShell 7. Observe que o PowerShell 7.x é instalado em um novo diretório e executado lado a lado com o Windows PowerShell 5.1.

Você pode verificar a versão atual do PowerShell instalada em sua máquina Windows com este comando:

$PSVersionTable

No PowerShell 7.x, isso deve imprimir algo semelhante a:

PSVersion                      7.4.1

PSEdition                      Core

GitCommitId                    7.4.1

OS                             Microsoft Windows 10.0.22631

Platform                       Win32NT

PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}

PSRemotingProtocolVersion      2.3

SerializationVersion           1.1.0.1

WSManStackVersion              3.0

macOS e Linux

O PowerShell 7.x pode ser instalado no macOS e no Linux. No entanto, não faz muito sentido instalar todo o ecossistema do PowerShell em um sistema operacional apenas para acessar o cmlet Invoke-WebRequest. Em vez disso, você deve usar curl. Essa biblioteca vem pré-instalada com o macOS e a maioria das distribuições Linux, oferecendo os mesmos recursos do Invoke-WebRequest. Saiba mais em nosso guia de proxy curl.

Pré-requisitos para começar a usar um proxy no PowerShell

Um proxy atua como intermediário entre um cliente e o servidor de destino. Ele intercepta suas solicitações, encaminha-as para o servidor, recebe as respostas do servidor e as envia de volta a você. Dessa forma, o servidor de destino verá as solicitações como provenientes do IP e da localização do servidor proxy escolhido e não de você.

Para começar a usar um proxy PowerShell com Invoke-WebRequest, você precisa saber identificar uma URL de servidor proxy. 

Esta é a URL de um proxy PowerShell Invoke-WebRequest:

<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]

Isso consiste em:

  • : O protocolo a ser usado para se conectar ao servidor proxy.
  • : O endereço IP ou URL do nome do host do servidor proxy.
  • : O número da porta que o servidor proxy escuta.
  • : O nome de usuário opcional para especificar quando a autenticação por proxy é necessária.
  • : A senha opcional para especificar quando a autenticação por proxy é necessária.

Observe que a parte :// do URL é exigida pelo Invoke-WebRequest. Se você omiti-la, a solicitação falhará com o seguinte erro:

Invoke-WebRequest : Essa operação não é suportada por um URI relacionado.

Quanto aos protocolos proxy, os mais populares são HTTP, HTTPS e SOCKS. Invoke-WebRequest no PowerShell 5.1 suporta apenas HTTP, enquanto no PowerShell 7.x ele também suporta HTTPS e SOCKS.

É hora de recuperar um proxy HTTP válido!

Você pode encontrar um gratuitamente on-line, conforme abaixo:

Protocol: HTTP; IP Address: 190.6.23.219; Port: 999

Componha essas informações para obter o seguinte URL de proxy:

http://190.6.23.219:999

Aviso

Optar por proxies gratuitos é bom para fins de aprendizado, mas você não pode confiar neles em cenários do mundo real. Os proxies gratuitos não são confiáveis, propensos a erros, lentos, ávidos por dados e têm vida curta. Não os use!

A solução? Proxies premium da Bright Data, o melhor provedor do mercado. Inscreva-se e experimente nossos proxies confiáveis gratuitamente.

Os proxies da Bright Data são protegidos por autenticação para que somente usuários confiáveis possam acessá-los. Agora, suponha que o protocolo seja HTTP, o host seja 45.103.203.109, a porta seja 9571 e o par de credenciais seja admin-4521 e rUuH3tJqf. Nesse caso, a URL do proxy Invoke-WebRequest seria:

http://admin-4521:@rUuH3tJqf45.103.203.109:9571

Como especificar um proxy HTTP em Invoke-WebRequest

Antes de começar, execute o comando abaixo no PowerShell:

Invoke-WebRequest "https://httpbin.org/ip"

That should print something like:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "194.34.233.12"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 32

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 10:46:14 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 32]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 32

Concentre-se no campo Conteúdo. Isso conterá seu IP. 

Por quê? Porque o endpoint /ip do projeto HTTPBin retorna o IP de onde vem a solicitação. Em outras palavras, ele retorna o endereço IP da máquina que realizou a solicitação. Nesse caso, esse é o IP da sua máquina.

Se você quiser acessar somente o campo Conteúdo, você pode fazer isso com:

$response = Invoke-WebRequest "https://httpbin.org/ip"

$response.Content

This would print:

{

  "origin": "194.34.233.12"

}

Se você rotear essa solicitação por meio de um proxy, deverá ver o endereço IP do servidor proxy e não o seu. Chamar esse endpoint é, portanto, um bom teste para verificar se o proxy PowerShell Invoke-WebRequest especificado está funcionando conforme o esperado. 

Existem algumas maneiras de definir um proxy PowerShell em Invoke-WebRequest. Saiba mais nas seções guiadas passo a passo abaixo!

Usando uma opção de linha de comando

Invoke-WebRequest oferece o sinalizador -Proxy para especificar uma URL de proxy para sua solicitação.

Assim sendo, a sintaxe para usar Invoke-WebRequest com um servidor proxy se torna:

Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>

Se você agora executar este comando do PowerShell:

Invoke-WebRequest -Proxy "http://190.6.23.219:999" "https://httpbin.org/ip"
Invoke-WebRequest -Uri "http://httpbin.org/ip" -Proxy "http://brd.superproxy.io:22225" -ProxyCredential (New-Object System.Management.Automation.PSCredential("brd-customer-CUSTOMER_ID-zone-ZONE’S_NAME", ("ZONE’S_PASSWORD" | ConvertTo-SecureString -AsPlainText -Force)))

The result should be:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "190.6.23.219"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 31

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 12:36:56 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 31]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 31

Observe que a origem no Conteúdo corresponde ao IP do servidor proxy. Isso prova que o servidor de destino vê a solicitação como proveniente do proxy, conforme o esperado. Incrível!

Nota: Não se esqueça de que os proxies gratuitos duram pouco! No momento em que você estiver lendo este guia, é improvável que o servidor acima ainda esteja ativo. Em caso de erro, substitua-o por um novo proxy.

Usando variáveis de ambiente

Desde o PowerShell 7.0, o Invoke-WebRequest oferece suporte à configuração de proxy por meio de variáveis de ambiente

Portanto, outra maneira de usar um proxy PowerShell em Invoke-WebRequest é definindo os dois ambientes a seguir:

  • HTTP_PROXY: O URL do servidor proxy a ser usado no caso de solicitações HTTP.
  • HTTPS_PROXY: O URL do servidor proxy a ser usado no caso de solicitações HTTPS.

No Windows, você pode definir as duas variáveis de ambiente com esta sintaxe do PowerShell:

$env:HTTP_PROXY = "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

$env:HTTPS_PROXY = "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

Em nosso exemplo, os comandos se tornarão:

$env:HTTP_PROXY = "http://190.6.23.219:999"

$env:HTTPS_PROXY = "http://190.6.23.219:999"

No macOS e Linux, você precisa usar a sintaxe abaixo:

export HTTP_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

export HTTPS_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

Assim, os dois comandos serão:

export http_proxy="http://190.6.23.219:999"

export https_proxy="http://190.6.23.219:999"

De agora em diante, cada solicitação de Invoke-WebRequest passará pelos proxies especificados sem precisar adicionar a opção -Proxy. Depois de definir os envs, inicie o comando abaixo:

Invoke-WebRequest "https://httpbin.org/ip"

You will get the same result as before:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "190.6.23.219"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 31

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 12:36:56 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 31]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 31

Para desativar os proxies Invoke-WebRequest, remova a configuração das variáveis de ambiente com:

$env:HTTP_PROXY = ""

$env:HTTPS_PROXY = ""

Or on macOS and Linux:

unset HTTP_PROXY

unset HTTPS_PROXY

Invoke-WebRequest voltará ao seu comportamento padrão e https://httpbin.org/ip agora exporá seu IP.

Como usar proxies HTTPS e SOCKS no PowerShell

Se precisar usar um proxy HTTPS ou SOCKS, você deve atualizar para a versão 7.x+ do PowerShell. Caso contrário, Invoke-WebRequest falhará com:

Invoke-WebRequest : O ServicePointManager não oferece suporte a proxies com o esquema https.

Ou no caso de um proxy SOCKS:

Invoke-WebRequest : O ServicePointManager não oferece suporte a proxies com o esquema de socks.

Ao lidar com proxies HTTPS ou SOCKS no PowerShell 7.x, a estrutura de comando Invoke-WebRequest permanece a mesma:

Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>

O que muda é que serão https, socks4, socks4a, socks5 ou socks5a, em vez de http.

Se você tentar invocar uma solicitação com um proxy envolvendo um protocolo diferente dos mencionados acima, você receberá este erro:

Invoke-WebRequest: Only the 'http', 'https', 'socks4', 'socks4a' and 'socks5' schemes are allowed for proxies.

Portanto, um exemplo completo de uma solicitação de proxy Invoke-WebRequest SOCKS é:

Invoke-WebRequest -Proxy "socks5://94.14.109.54:3567" "http://httpbin.org/ip"

As you can expect, the result will be:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "94.14.109.54"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 31

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 12:47:56 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 31]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 31

Dicas e truques que você precisa saber

Veja alguns truques úteis e dicas valiosas para lidar com um proxy PowerShell Invoke-WebRequest como um profissional.

Ignore a configuração do proxy do PowerShell

Se você quiser evitar que Invoke-WebRequest use o proxy PowerShell configurado lido a partir das variáveis de ambiente, você pode usar a opção -NoProxy da seguinte forma:

Invoke-WebRequest -NoProxy <Uri>

Isso instrui Invoke-WebRequest a entrar em contato com sem usar um proxy.

Para verificar se essa abordagem funciona, configure um proxy nos envs e execute:

Invoke-WebRequest -NoProxy "https://httpbin.org/ip"

A origem resultante conterá seu IP, não o do servidor proxy.

Avoid SSL Certificate Errors

Ao usar proxies HTTP, suas solicitações podem falhar devido a erros no certificado SSL. Para evitar isso, especifique a opção -SkipCertificateCheck:

Invoke-WebRequest -SkipCertificateCheck -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>

-SkipCertificateCheck ajuda você a evitar erros de certificado ao permitir conexões de servidor inseguras. Lembre-se de que usar esse parâmetro não é seguro. Configure-o somente quando estiver lidando com hosts conhecidos.

Por exemplo, você pode entrar em contato com o HTTPBin por meio de um proxy e, ao mesmo tempo, ignorar problemas de SSL com:

Invoke-WebRequest -SkipCertificateCheck -Proxy "http://190.6.23.219:999" "https://httpbin.org/ip"

Qual proxy do PowerShell você deve usar?

A resposta a essa pergunta muda com base no que você deseja alcançar com sua solicitação Invoke-WebRequest. Para encontrar o proxy PowerShell certo para suas necessidades, dê uma olhada nos diferentes tipos de proxies disponíveis:

  • Proxies de data center: Eles são rápidos e baratos, mas podem ser facilmente detectados e bloqueados pelos sites por causa de seus intervalos de IP identificáveis.
  • Proxies residenciais: Eles oferecem endereços IP genuínos rotativos de dispositivos reais em locais específicos. Isso significa que eles podem garantir um alto nível de anonimato. Os proxies residenciais são perfeitos para acessar sites que dependem de bloqueios de restrição geográfica ou para evitar medidas anti-bots.
  • Proxies ISP: Eles são seguros, rápidos e altamente confiáveis, pois fornecem IPs estáticos de dispositivos registrados nos ISPs. Os proxies ISP também são chamados de proxies estáticos residenciais e são uma solução perfeita para monitoramento de SEO e pesquisa de mercado.
  • Proxies móveis: Eles fornecem IPs de dispositivos móveis reais para um alto nível de anonimato. Eles são úteis para acessar aplicativos, sites ou conteúdos projetados especificamente para dispositivos móveis.

Esse foi apenas um breve resumo, mas você pode ler mais em nosso guia sobre tipos de IP de proxy.

Conclusão

Neste guia de proxy do PowerShell, você aprendeu o que é Invoke-WebRequest, como funciona e como usá-lo com um proxy HTTP/HTTPS/SOCKS. Como se viu, você não pode confiar em proxies de provedores gratuitos. Portanto, a única decisão a ser tomada é qual provedor de proxy você deve adotar. Economize tempo e energia e escolha diretamente o melhor do mercado, Bright Data.

A Bright Data controla os melhores servidores proxy do mundo, atendendo a empresas listadas na Fortune 500 e a mais de 20.000 clientes. Sua rede mundial de proxy envolve:

No geral, essa é uma das maiores e mais confiáveis redes proxy voltadas para coleta de dados (scrapping) do mercado. 

Converse com um de nossos representantes de vendas e veja quais produtos da Bright Data melhor atendem às suas necessidades.