Cómo usar Invoke-WebRequest en PowerShell con un proxy

El cmdlet Invoke-WebRequest en PowerShell es una herramienta útil para realizar solicitudes HTTP a sitios web. Si utilizas los servicios de proxy de Bright Data, puedes usar este cmdlet con un proxy especificando el parámetro -Proxy seguido de los detalles de tu proxy.
13 min read
Invoke-Webrequest With a Proxy

Al final de esta guía de proxy de PowerShell de Invoke-WebRequest, sabrás:

¡Vamos allá! 

¿Qué es Invoke-WebRequest en PowerShell?

Invoke-WebRequest es un cmdlet en PowerShell para enviar solicitudes HTTP, HTTPS y FTP a servidores y servicios web. De forma predeterminada, analiza automáticamente la respuesta producida por el servidor y devuelve colecciones de formularios, enlaces, imágenes u otros elementos HTML importantes. 

Por lo general, se usa para acceder a las API REST, descargar archivos de la web o interactuar con servicios web. Esta es la sintaxis básica de una solicitud Invoke-WebRequest:

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

Los parámetros clave que hay que recordar son:

  • -Uri: el URI del recurso web al que se envía la solicitud.
  • Method: el método HTTP que se utilizará para la solicitud (por ejemplo, GET, POST, PUT, DELETE). Invoke-WebRequest envía solicitudes GET de forma predeterminada.
  • -Headers: los encabezados HTTP adicionales que se incluirán en la solicitud.
  • -Body: el cuerpo de la solicitud que se va a enviar al servidor.

Como puedes ver, el único argumento obligatorio es. Por lo tanto, en resumen, la sintaxis más simple para realizar una solicitud GET a un URI determinado es:

Invoke-WebRequest <Uri>

Este cmdlet se introdujo en PowerShell 3.0 en 2012. 

Instalación de Invoke-WebRequest

Para usar Invoke-WebRequest, necesitas PowerShell. Así que, ¡aprendamos cómo instalar PowerShell y obtener acceso al cmlet Invoke-WebRequest!

Windows

En primer lugar, debes comprender que Windows PowerShell y PowerShell son dos cosas diferentes. Windows PowerShell es la versión de PowerShell que viene con Windows y su versión más reciente es la 5.1. Windows Powershell proporciona el cmlet Invoke-WebRequest. Esto significa que, si estás en una versión moderna de Windows, ¡ya estás listo para empezar! Para versiones anteriores, sigue la guía de instalación oficial de PowerShell.

Al mismo tiempo, algunas funciones de Invoke-WebRequest solo están disponibles a partir de PowerShell 7.x. Para obtener más información sobre cómo instalarlo, sigue la guía oficial de migración de Windows PowerShell 5.1 a PowerShell 7. Ten en cuenta que PowerShell 7.x se instala en un directorio nuevo y se ejecuta en paralelo con Windows PowerShell 5.1.

Puedes verificar la versión actual de PowerShell instalada en tu equipo Windows con este comando:

$PSVersionTable

En PowerShell 7.x, debería imprimir algo similar 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 y Linux

PowerShell 7.x se puede instalar tanto en macOS como en Linux. Sin embargo, no tiene mucho sentido instalar todo el ecosistema de PowerShell en un sistema operativo solo para acceder al cmlet Invoke-WebRequest. En su lugar, debes usar curl. Esta biblioteca viene preinstalada con macOS y la mayoría de las distribuciones de Linux, y ofrece las mismas capacidades que Invoke-WebRequest. Obtén más información en nuestra guía de curl con proxies.

Requisitos previos para empezar a usar un proxy en PowerShell

Un proxy actúa como intermediario entre un cliente y el servidor de destino. Intercepta tus solicitudes, las reenvía al servidor, recibe las respuestas del servidor y te las devuelve. De esta forma, el servidor de destino verá que las solicitudes provienen de la IP y la ubicación del servidor proxy elegido y no de ti.

Para empezar a usar un proxy en PowerShell con Invoke-WebRequest, debes entender qué aspecto tiene la URL de un servidor proxy. 

Esta es la URL de un proxy de Invoke-WebRequest en PowerShell:

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

Esto consiste en:

  • : el protocolo que se utilizará para conectarse al servidor proxy.
  • : la dirección IP o URL del host del servidor proxy.
  • : el número de puerto que escucha el servidor proxy.
  • : el nombre de usuario opcional para especificar cuándo se requiere la autenticación de proxy.
  • : la contraseña opcional para especificar cuándo se requiere la autenticación de proxy.

Ten en cuenta que Invoke-WebRequest requiere la parte :// de la URL. Si lo omites, la solicitud fallará y aparecerá el siguiente error:

Invoke-WebRequest: esta operación no se admite para un URI relativo.

En cuanto a los protocolos proxy, los más populares son HTTP, HTTPS y SOCKS. Invoke-WebRequest en PowerShell 5.1 solo admite HTTP, mientras que en PowerShell 7.x también admite HTTPS y SOCKS.

¡Es hora de recuperar un proxy HTTP válido!

Puedes encontrar uno gratis en línea, como se muestra a continuación:

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

Redacta esa información para obtener la siguiente URL de proxy:

http://190.6.23.219:999

Advertencia

Optar por proxies gratuitos es aceptable para fines de aprendizaje, pero no puedes confiar en ellos en situaciones del mundo real. Los proxies gratuitos son poco fiables, propensos a errores, lentos, ávidos de datos y tienen una corta duración. ¡No los utilices!

¿Cuál es la solución? Proxies prémium de Bright Data, el mejor proveedor del mercado. Suscríbete y prueba nuestros fiables proxies de forma gratuita.

Los proxies de Bright Data están protegidos mediante autenticación para que solo los usuarios de confianza puedan acceder a ellos. Ahora, supongamos que el protocolo es HTTP, el host es 45.103.203.109, el puerto es 9571 y el par de credenciales es admin-4521 y ruuh3tJQF. En este caso, la URL del proxy de Invoke-WebRequest sería:

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

Cómo especificar un proxy HTTP en Invoke-WebRequest

Antes de empezar, ejecuta el siguiente comando en 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

Céntrate en el campo Content. Eso contendrá tu IP. 

¿Por qué? Porque el punto final /ip del proyecto HTTPBin devuelve la IP original de la solicitud. En otras palabras, devuelve la dirección IP del equipo que realizó la solicitud. En este caso, es la IP de tu equipo.

Si quieres acceder solo al campo Content, puedes hacerlo con:

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

$response.Content

This would print:

{

  "origin": "194.34.233.12"

}

Si diriges esa solicitud a través de un proxy, deberías ver la dirección IP del servidor proxy y no la tuya. Por lo tanto, llamar a ese punto final es una buena prueba para verificar que el proxy de Invoke-WebRequest en PowerShell especificado funciona según lo esperado. 

Hay un par de maneras de configurar un proxy de PowerShell en Invoke-WebRequest. ¡Obtén más información en las secciones guiadas paso a paso que aparecen a continuación!

Uso de una opción de línea de comandos

Invoke-WebRequest ofrece el indicador Proxy para especificar una URL de proxy para tu solicitud.

Por lo tanto, la sintaxis para usar Invoke-WebRequest con un servidor proxy es:

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

Si ahora ejecutas este comando de 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

Observa que el origen en Content coincide con la IP del servidor proxy. Esto demuestra que el servidor de destino considera que la solicitud proviene del proxy, tal como se esperaba. ¡Genial!

Nota: ¡no olvides que los proxies gratuitos tiene poca duración! Cuando leas esta guía, es poco probable que el servidor anterior siga activo. En caso de error, sustitúyelo por uno nuevo.

Uso de variables de entorno

Desde PowerShell 7.0, Invoke-WebRequest admite la configuración de proxy mediante variables de entorno

Por lo tanto, otra forma de usar un proxy de PowerShell en Invoke-WebRequest es configurar los dos entornos siguientes:

  • HTTP_PROXY: la URL del servidor proxy que se utilizará en caso de solicitudes HTTP.
  • HTTPS_PROXY: la URL del servidor proxy que se utilizará en caso de solicitudes HTTPS.

En Windows, puedes configurar las dos variables de entorno con esta sintaxis de PowerShell:

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

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

En nuestro ejemplo, los comandos se convertirán en:

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

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

En macOS y Linux, debes usar la siguiente sintaxis:

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

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

Por lo tanto, los dos comandos serán:

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

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

De ahora en adelante, cada solicitud de Invoke-WebRequest pasará por los proxies especificados sin tener que añadir la opción -Proxy. Después de configurar los entornos, ejecuta el siguiente comando:

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 desactivar los proxies de Invoke-WebRequest, desactiva las variables de entorno con:

$env:HTTP_PROXY = ""

$env:HTTPS_PROXY = ""

Or on macOS and Linux:

unset HTTP_PROXY

unset HTTPS_PROXY

Invoke-WebRequest volverá a su comportamiento estándar y https://httpbin.org/ip ahora expondrá tu IP.

Cómo usar los proxies HTTPS y SOCKS en PowerShell

Si necesitas usar un proxy HTTPS o SOCKS, debes actualizar a la versión 7.x o superior de PowerShell. De lo contrario, Invoke-WebRequest fallará con:

Invoke-WebRequest: el ServicePointManager no admite proxies con el sistema https.

O en el caso de un proxy SOCKS:

Invoke-WebRequest : el ServicePointManager no admite proxies con el sistema socks.

Cuando se trata de proxies HTTPS o SOCKS en PowerShell 7.x, la estructura de comandos Invoke-WebRequest sigue siendo la misma:

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

Lo que cambia es que será https, socks4, socks4a, socks5 o socks5a, en lugar de http.

Si intentas invocar una solicitud con un proxy que incluya un protocolo distinto de los mencionados anteriormente, aparecerá este error:

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

Por lo tanto, un ejemplo completo de una solicitud de proxy SOCKS de Invoke-WebRequest es:

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

Consejos y trucos que debes saber

Consulta algunos trucos útiles y consejos valiosos para utilizar un proxy de Invoke-WebRequest en PowerShell como un profesional.

Ignora la configuración de proxies en PowerShell

Si quieres evitar que Invoke-WebRequest utilice el proxy de PowerShell configurado leído desde las variables de entorno, puedes usar la opción -noProxy de la siguiente manera:

Invoke-WebRequest -NoProxy <Uri>

Esto indica a Invoke-WebRequest que contacte con sin usar un proxy.

Para comprobar que este método funciona, configura un proxy en los entornos y ejecuta:

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

El origen resultante contendrá tu IP, no la del servidor proxy.

Avoid SSL Certificate Errors

Al usar proxies HTTP, es posible que tus solicitudes fallen debido a errores en el certificado SSL. Para evitarlo, especifica la opción -SkipCertificateCheck:

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

-SkipCertificateCheck te ayuda a evitar errores de certificación al permitir conexiones de servidor inseguras. Ten en cuenta que el uso de este parámetro no es seguro. Configúralo solo cuando se trate de hosts conocidos.

Por ejemplo, puedes contactar con HTTPBin a través de un proxy y evitar los problemas de SSL con:

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

¿Qué proxy de PowerShell debes utilizar?

La respuesta a esta pregunta cambia en función de lo que quieras lograr con tu solicitud de Invoke-WebRequest. Para encontrar el proxy de PowerShell adecuado para tus necesidades, echa un vistazo a los diferentes tipos de proxies disponibles:

  • Proxies de centros de datos: son rápidos y baratos, pero los sitios pueden detectarlos y bloquearlos fácilmente debido a sus rangos de IP identificables.
  • Proxies residenciales: ofrecen direcciones IP rotativas auténticas de dispositivos reales en ubicaciones específicas. Esto significa que pueden garantizar un alto nivel de anonimato. Los proxies residenciales son perfectos para acceder a sitios que dependen de bloqueos de restricción geográfica o para evitar las medidas antibots.
  • Proxies ISP: son seguros, rápidos y muy fiables, ya que proporcionan direcciones IP estáticas desde dispositivos registrados en los proveedores de Internet (ISP). Los proxies de ISP también se denominan proxies estáticos residenciales y son una solución perfecta para la supervisión de optimización para buscadores (SEO) y la investigación del mercado.
  • Proxies móviles: proporcionan direcciones IP de dispositivos móviles reales para un alto nivel de anonimato. Son útiles para acceder a aplicaciones, sitios o contenido diseñados específicamente para dispositivos móviles.

Este es solo un breve resumen, pero puedes obtener más información en nuestra guía sobre tipos de IP de proxies.

Conclusión

En esta guía de proxies de PowerShell, aprendiste qué es Invoke-WebRequest, cómo funciona y cómo usarlo con un proxy HTTP/HTTPS/SOCKS. Resulta que no te puedes fiar de los proxies de proveedores gratuitos. Por lo tanto, la única decisión que debe tomarse es qué proveedor de proxy debes utilizar. Ahorra tiempo y energía y opta directamente por la mejor opción del mercado: Bright Data.

Bright Data controla los mejores servidores proxy del mundo, prestando servicio a empresas de Fortune 500 y a más de 20 000 clientes. Su red mundial de proxies incluye:

En general, es una de las redes de proxies orientadas al raspado web más grandes y fiables del mercado. 

Habla con uno de nuestros representantes de ventas y descubre cuál de los productos de Bright Data se adapta mejor a tus necesidades.