当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Invoke-WebRequest:PowerShell 的 Web 瑞士军刀

作者:精品下载站 日期:2024-12-14 12:36:44 浏览:14 分类:玩电脑

Invoke-WebRequest:PowerShell 的 Web 瑞士军刀


您是否曾经想通过命令行浏览网页?是的。我也不。但是您是否曾经需要从网页提取信息、监控网站或通过自动化提交信息?我已经并且使用 Invoke-Webrequest 来做到这一点!

Invoke-WebRequest PowerShell cmdlet 是网络领域的瑞士军刀。此 cmdlet 可以将任何 HTTP 动词以及常见的内容(例如 HTTP 参数、指定不同的 HTTP 标头等)发送到 Web 服务。如果您需要执行任何类型的 Web 自动化,Invoke-WebRequest 及其兄弟 Invite-RestMethod 是您需要熟悉的两个 PowerShell cmdlet。

Invoke-WebRequest cmdlet 是 Windows PowerShell 和 PowerShell Core 附带的 Microsoft.PowerShell.Utility 模块的一部分。这个 cmdlet 自 v3 起就包含在 PowerShell 中,它功能极其强大且易于使用。

通过使用 Invoke-WebRequest,PowerShell 允许开发人员以多种不同的方式使用网站、Web 服务和 REST API。

基本用法

最基本的是,Invoke-WebRequest cmdlet 将 HTTP 请求方法发送到端点(例如 URI 或 URL)。该 cmdlet 支持所有常见请求方法。

到目前为止,最常见的方法是GET方法。此方法读取信息,例如来自网站的信息或可能查询 REST API。该方法是使用 Method 参数定义的。由于我们需要一个端点来查询,因此我们还需要一个 URI。为了简单起见,我会选择任何网站。为了无耻地推广 TechSnips,我会选择 techsnips.io。

假设我想获取所有最新发布的视频的列表,如下所示。

[玩转系统] Invoke-WebRequest:PowerShell 的 Web 瑞士军刀

我可以通过运行 Invoke-WebRequest -Uri 'https://techsnips.io' -Method GET 获取此页面的 HTML 表示形式。当我这样做时,Invoke-WebRequest 下载整个网页并返回一个输出,其中包含页面元素周围的各种解析信息。

[玩转系统] Invoke-WebRequest:PowerShell 的 Web 瑞士军刀

为了获得视频,我需要进行一些挖掘。当我查看 links 属性时,我发现一个共同点,即所有视频链接都有一个 ng-binding 类,如下所示。

[玩转系统] Invoke-WebRequest:PowerShell 的 Web 瑞士军刀

一旦我知道了这一点,我就可以找到所有这些元素,并且只返回 innerHTML 属性,瞧!

[玩转系统] Invoke-WebRequest:PowerShell 的 Web 瑞士军刀

使用 Invoke-WebRequest 下载文件

我们还可以使用 Invoke-WebRequest 从网络下载文件,这非常简单!我们只需将 Invoke-WebRequest 指向文件的 URI,并使用 OutFile 参数告诉 cmdlet 将文件保存到本地磁盘即可下载文件。

作为示例,下面我将下载 SysInternals Handle 实用程序并在下载后展开 zip 文件。真的就是这么简单!

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

提交表单并使用会话

我们还可以使用 Invoke-WebRequest 来填写表单。但要做到这一点,我们通常需要使用网络会话。 HTTP 是一种天然的无状态协议,您的浏览器(在本例中为 PowerShell)必须能够创建一个会话,该会话将用于跟踪 Cookie 等内容。常见的表单是登录/密码表单,所以让我们登录到一个虚构的网站!

假设我们虚构的登录表单位于 URL http://somewebsite.com。我们首先需要运行 Invoke-WebRequest 来下载 HTML 结构并创建会话。

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

完成此操作后,响应将具有一个 Forms 属性,然后我们可以使用用户名和密码填充。在本例中,用户名由名为 user 的字段表示,密码应位于名为 password 的字段中。这将取决于网页。

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

填充表单后,我们可以再次使用 Invoke-WebRequest 但这次重新使用我们刚刚创建的会话,并通过读取 Action 自动找出要发送到的 URI表单上的 属性如下所示。

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

如果您正确设置了所有适当的字段名称,并且网页没有任何效果,则您应该在 $rb 网络会话中使用用户名和密码登录。此时,如果您使用 $rb Web 会话变量,您可以读取该身份验证背后的各个页面。

解析短 URI

最后,Invoke-WebRequest 的另一个重要用途是解析短 URI。也许您需要知道缩短的 URL 背后的内容,但又不想点击它来找出答案!没问题。使用 Invoke-WebRequest,我们可以从它提供给我们的解析响应中读取 AbsoluteUri 属性!

请注意,下面我还使用了 UseBasicParsing 参数。默认情况下,Invoke-WebRequest 尝试使用 Internet Explorer (IE) 解析返回的 HTML。这在没有 IE 的系统上不起作用。为了解决这个问题,我们可以使用 UseBasicParsing 参数仍然下载内容,但仅对其进行轻微解析。

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

概括

Invoke-WebRequest cmdlet 是 PowerShell 附带的最通用的 cmdlet 之一。如果某个操作可以通过典型的图形浏览器执行,则 Invoke-WebRequest cmdlet 也可以执行该操作。您可以通过查看有关监视 REST API 的文章来找到使用此 cmdlet 的示例。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯