如何通过代理使用PowerShell Invoke-WebRequest

3 min read

当您到达这个Invoke-WebRequest PowerShell代理指南的结尾部分时,您将已了解:

让我们开始探索吧!

什么是PowerShell Invoke-WebRequest?

Invoke-WebRequest是一个PowerShell cmdlet,用于向网络服务器和网络服务发送HTTP、HTTPS和FTP请求。在默认情况下,它会自动解析服务器生成的响应,并返回表单、链接、图像或其他重要HTML元素的集合。 

通常,它是用于访问REST API、从网络下载文件,或与网络服务进行交互。这是Invoke-WebRequest请求的基本语法:

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

需要记住的关键参数是:

  • -Uri:您向其发送请求的网络资源的URI。
  • -Method:用于请求的HTTP方法(例如GET、POST、PUT、DELETE)。Invoke-WebRequest默认发送GET请求。
  • -Headers:要包含在请求中的附加HTTP标头。
  • -Body:要发送到服务器的请求的正文。

如您所见,唯一必需的参数是。因此,简而言之,对给定URI执行GET请求的最简单语法是:

Invoke-WebRequest <Uri>

此cmdlet是于2012年在PowerShell3.0中引入的。

安装Invoke-WebRequest

要使用Invoke-WebRequest,您需要PowerShell。那么,让我们来了解如何安装PowerShell以访问Invoke-WebRequest cmlet!

Windows

首先,您需要明白Windows PowerShellPowerShell是两种不同的东西。Windows PowerShell是Windows附带的PowerShell版本,其最新版本是5.1。Windows Powershell提供Invoke-WebRequest cmlet。这意味着,如果您使用的是新版本的Windows,则您已经准备就绪!如果是较旧的版本,请遵循官方PowerShell安装指南

同时,Invoke-WebRequest的某些功能仅从PowerShell 7.x 开始可用。有关如何安装的更多详细信息,请遵循从Windows PowerShell 5.1到PowerShell 7的官方迁移指南。请注意,PowerShell 7.x将安装到新目录,并与Windows PowerShell 5.1并行运行。

您可以使用以下命令验证安装在Windows计算机上的PowerShell当前版本:

$PSVersionTable

在PowerShell 7.x,应会打印出与此类似的内容:

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和Linux

PowerShell 7.x可以安装在macOS和Linux上。但是,仅仅为了访问Invoke-WebRequest cmlet而在操作系统中安装整个PowerShell生态系统,并没有多大意义。相反,您应该使用curl。这个库预装在macOS和大多数Linux发行版中,提供与Invoke-WebRequest相同的功能。要了解更多信息,请参阅我们的curl代理指南。

在PowerShell中开始使用代理的先决条件

代理是客户端与目标服务器之间的中介。它会拦截您的请求,将请求转发到服务器,接收服务器的响应,然后将响应发送回来给您。这样,目标服务器就会将请求视为来自 所选代理服务器的IP和位置,而不是来自您。

要开始使用PowerShell代理发送Invoke-WebRequest,您需要了解代理服务器URL是什么样子。

这是PowerShell Invoke-WebRequest代理的URL:

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

其中包括:

  • :用于连接代理服务器的协议。
  • :代理服务器主机名的IP地址或URL。
  • :代理服务器监听的端口号码。
  • :在代理需要身份验证时填写的可选用户名。
  • :在代理需要身份验证时填写的可选密码。

请注意,URL的://部分是invoke-WebRequest所必需的。如果省略了该部分,请求将失败,并出现以下错误:

Invoke-WebRequest:此操作不支持相对URI。

至于代理协议,最常用的是HTTP、HTTPS 和 SOCKS。PowerShell 5.1中的invoke-WebRequest仅支持HTTP,而在PowerShell 7.x中的invoke-WebRequest还支持HTTPS和SOCKS。

是时候要找一个有效的HTTP代理了!

您可以在线找到一个免费的,如下所示:

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

将这些信息组合起来,就能获得以下代理 URL:

http://190.6.23.219:999

警告

选择免费代理用于学习目的是可以的,但在实际应用中不能依赖它们。免费代理不可靠、容易出错、速度慢、时效短,而且会收集大量数据。不要使用这些代理!

有何解决方案?使用市面上最好的提供商Bright Data的高级代理。订阅并免费试用我们的可靠代理。

Bright Data的代理受身份验证保护,只有受信任的用户才能访问。现在,假设协议是HTTP,主机是45.103.203.109,端口是 9571,一对凭据是admin-4521和rUuH3tJqf。在这种情况下,Invoke-WebRequest代理URL将是:

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

如何在Invoke-WebRequest中指定HTTP代理

开始之前,请在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

请留意“内容”字段。其中包含您的 IP。

为什么?因为HTTPBin项目的/ip端点会返回请求的源IP。换句话说,它会返回执行请求的计算机的IP地址。在这种情况下,这就是您的计算机的IP。

如果您只想访问“内容”字段,您可以使用:

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

$response.Content

This would print:

{

  "origin": "194.34.233.12"

}

如果您通过代理路由该请求,您看到的应该是代理服务器的IP地址,而不是您的IP地址。因此,调用该端点是一个很好的测试,可以验证指定的PowerShell Invoke-WebRequest代理是否按预期运行。

要在Invoke-WebRequest中设置PowerShell代理,有几种方法。在下方的分步指导部分中,可以了解更多信息!

使用命令行选项

Invoke-WebRequest提供-Proxy标志,用于为您的请求指定代理URL。

因此,通过代理服务器使用Invoke-WebRequest的语法变为:

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

如果您现在执行这个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

请注意,内容中的源与代理服务器IP匹配。这意味着目标服务器会如预期一样,以为请求是来自代理。太棒了!

注意:别忘了,免费代理的时效是短暂的!当您在阅读本指南时,上述服务器不大可能仍然存在。如果出现错误,请使用新的代理取代旧的。

使用环境变量

自PowerShell 7.0起,Invoke-WebRequest支持通过环境变量进行代理配置。

因此,在Invoke-WebRequest中使用PowerShell代理的另一种方法,是设置以下两个环境:

  • HTTP_PROXY:用于HTTP请求的代理服务器的URL。
  • HTTPS_PROXY:用于HTTPS请求的代理服务器的URL。

在Windows中,可以使用以下PowerShell语法设置两个环境变量:

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

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

在我们的示例中,命令将变为:

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

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

在macOS和Linux,需要使用以下语法:

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

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

因此,这两个命令将变为:

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

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

从现在起,每个Invoke-WebRequest请求都将通过指定的代理发送,无需添加-Proxy 选项。设置环境后,启动以下命令:

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

要关闭Invoke-WebRequest代理,请使用以下命令取消环境变量设置:

$env:HTTP_PROXY = ""

$env:HTTPS_PROXY = ""

Or on macOS and Linux:

unset HTTP_PROXY

unset HTTPS_PROXY

Invoke-WebRequest将恢复其标准行为,而https://httpbin.org/ip 现在会暴露您的IP。

如何在PowerShell中使用HTTPS和SOCKS代理

如果您需要使用HTTPS或SOCKS代理,必须升级到PowerShell的7.x+版本。否则,invoke-WebRequest将失败,错误为:

invoke-WebRequest:ServicePointManager不支持使用https协议的代理。

或者,如果是SOCKS代理:

invoke-WebRequest:ServicePointManager不支持使用socks协议的代理。

在PowerShell 7.x中处理HTTPS或SOCKS代理时,Invoke-WebRequest命令结构保持不变:

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

变化的是:将是https、socks4、socks4a、socks5或socks5a,而不是http。

如果您尝试通过代理调用请求,而代理使用的是上述协议以外的协议,就会得到这个错误:

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

因此,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

您需要了解的窍门和技巧

查看一些有用技巧和有价值的窍门,让您能专业地处理PowerShell Invoke-WebRequest代理。

忽略PowerShell代理配置

如果您想阻止Invoke-WebRequest使用从环境变量中读取的PowerShell代理配置,可以使用-NoProxy选项,如下所示:

Invoke-WebRequest -NoProxy <Uri>

这会指示Invoke-WebRequest在不使用代理的情况下联系

要验证此方法是否有效,请在环境中设置代理并运行:

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

生成的源将包含您的IP,而非代理服务器的IP。

Avoid SSL Certificate Errors

使用HTTP代理时,请求可能会因SSL证书错误而失败。为避免这种情况,请指定-skipCertificateCheck选项:

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

-SkipCertificateCheck允许不安全的服务器连接,从而避免证书错误。请记住,使用此参数并不安全。仅在处理已知主机时才可设置。

例如,您可以通过代理联系HTTPBin,並使用以下命令绕过SSL问题:

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

应该使用哪个PowerShell代理?

这个问题的答案会根据您想通过Invoke-WebRequest请求实现的目标而改变。要找到适合您需要的PowerShell代理,请查看可用的不同类型代理:

  • 数据中心代理:速度快、价格便宜,但由于其IP范围是可识别的,可能很容易被网站检测到和屏蔽。
  • 住宅代理:提供来自特定位置真实设备的轮換真实IP地址。这意味着它们可以保证高度的匿名性。住宅代理非常适合用于访问依赖地理限制的网站,或用于避免反机器人措施。
  • ISP代理:从已在ISP注册的设备上提供静态IP,快速、安全,高度可靠。ISP代理也称为住宅静态代理,是SEO监控和市面研究的理想解决方案。
  • 移动代理:提供来自真实移动设备的IP,具有高度的匿名性。如要访问专为移动设备而设计的应用程序、网站或内容,它们非常有用。

这只是一个简短的总结,您可以在我们的代理IP类型指南中阅读更多信息。

结语

在本PowerShell代理指南中,您了解了Invoke-WebRequest是什么、如何工作,以及如何通过HTTP/HTTPS/SOCKS代理使用。事实证明,免费提供商提供的代理是不能依赖的。因此,唯一要做出的决定就是应该选用哪个代理提供商。要节省时间和精力,请选择市面上最好的服务提供商Bright Data

Bright Data管控的代理服务器是全球最好的,目前正在为一些财富500强企业和超过20000家客户提供服务。其全球代理网络包括:

总体而言,这是市面上最大、最可靠的抓取导向代理网络之一。