PowerShell Invoke-WebRequest:全面指南

你曾经想过通过命令行浏览网页吗?是的,我也没有。但是你曾经需要从网页中获取信息、监控网站或通过自动化提交信息吗?我有,并且我使用 Invoke-Webrequest 来完成!

Invoke-WebRequest PowerShell cmdlet 是网络的瑞士军刀。这个 cmdlet 可以发送任何 HTTP 动词到一个 Web 服务,还可以包括常见的 HTTP 参数,指定不同的 HTTP 头等等。如果你需要进行任何类型的网络自动化操作,你需要熟悉 Invoke-WebRequest 和它的兄弟 cmdlet Invite-RestMethod。

Invoke-WebRequest cmdlet 是 Microsoft.PowerShell.Utility 模块的一部分,它随着 Windows PowerShell 和 PowerShell Core 一起提供。自 PowerShell v3 以来,这个 cmdlet 就已经包含在 PowerShell 中,它非常强大且易于使用。

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

基本用法

在最基本的情况下,Invoke-WebRequest cmdlet 将一个 HTTP 请求方法发送到一个端点,比如一个 URI 或 URL。这个 cmdlet 支持所有常见的请求方法。

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

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

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

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

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

一旦我知道了这一点,我就可以找到所有这些元素,然后只返回innerHTML属性,完成了!

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

使用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)必須能夠創建一個會話,用於跟踪例如 cookies 等信息。一個常見的表單是登錄/密碼表單,所以讓我們登錄到一個虛構的網站吧!

假設我們虛構的登錄表單位於 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 網頁會話變量,你可以閱讀身份驗證後的各種頁面。

解析短網址

最後,Invoke-WebRequest 的另一個很棒的用途是解析短網址。也許您想知道那個縮短的網址背後是什麼,但又不想點擊它去查看!沒問題。使用 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 命令是 PowerShell 中最多用途的命令之一。如果在典型的圖形瀏覽器中可以執行的操作,Invoke-WebRequest 命令也可以做到。您可以通過查看這篇關於 監控 REST API 的文章來找到使用該命令的示例。

Source:
https://adamtheautomator.com/invoke-webrequest/