PowerShell Invoke-WebRequest: 包括的なガイド

ウェブをコマンドラインで閲覧したいことはありましたか?私もそうではありません。しかし、ウェブページから情報を取得したり、ウェブサイトをモニターしたり、情報を自動化して送信する必要があったことはありますか?私はありますし、それにはInvoke-Webrequestを使用しています!

PowerShellのInvoke-WebRequestコマンドレットは、ウェブのスイスアーミーナイフです。このコマンドレットは、HTTPの動詞をウェブサービスに送信することができ、HTTPパラメーターなどの一般的なものを指定することもできます。Invoke-WebRequestは、Invite-RestMethodという兄弟コマンドレットとともに、ウェブ自動化を行う場合に覚えておくべき二つのPowerShellコマンドレットです。

Invoke-WebRequestコマンドレットは、Windows PowerShellとPowerShell Coreに付属するMicrosoft.PowerShell.Utilityモジュールの一部です。このコマンドレットは、PowerShellのv3以降に含まれており、非常に強力で使いやすいものです。

Invoke-WebRequestを使用することで、PowerShellではさまざまな方法でウェブサイト、ウェブサービス、およびREST APIと連携することができます。

基本的な使用方法

最も基本的な使い方では、Invoke-WebRequestコマンドレットはURIやURLなどのエンドポイントに対してHTTPリクエストメソッドを送信します。このコマンドレットは、すべての一般的なリクエストメソッドをサポートしています。リクエストメソッド

最も一般的な方法は、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を使用してフォームにも入力できます。ただし、通常はWebセッションを使用する必要があります。HTTPは本来ステートレスなプロトコルであり、ブラウザ(この場合はPowerShell)はクッキーなどを追跡するためにセッションを作成できる必要があります。一般的なフォームは、ログイン/パスワードのフォームですので、架空のウェブサイトにログインしてみましょう!

架空のログインフォームが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ウェブセッション変数を使用して、認証された状態でさまざまなページを読むことができます。

短縮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コマンドレットは、PowerShellに付属する最も多機能なコマンドレットの一つです。典型的なグラフィカルブラウザを介して実行できるアクションがあれば、Invoke-WebRequestコマンドレットでも実行できます。このコマンドレットの使用例は、REST APIの監視に関するこの記事を参照してください。

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