ウェブをコマンドラインで閲覧したいことはありましたか?私もそうではありません。しかし、ウェブページから情報を取得したり、ウェブサイトをモニターしたり、情報を自動化して送信する必要があったことはありますか?私はありますし、それには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を選びます。
以下に示すように、最新の公開ビデオのリストを取得したいとします。

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.

ビデオを取得するためには、掘り下げる必要があります。リンクのプロパティを見ると、すべてのビデオリンクにはng-binding
というクラスが共通していることがわかります。

これを知ったら、それらの要素をすべて見つけ、innerHTML
プロパティのみを返すことができます。

Invoke-WebRequestを使用してファイルをダウンロードする
Invoke-WebRequestを使用してウェブからファイルをダウンロードすることもできます。とても簡単です!ファイルをダウンロードするには、Invoke-WebRequest
をファイルのURIに向け、OutFile
パラメータを使用してファイルをローカルディスクに保存するようにcmdletに指示します。
例として、以下ではSysInternals Handleユーティリティをダウンロードし、ダウンロード後にzipファイルを展開しています。本当に簡単です!
フォームの送信とセッションの操作
Invoke-WebRequest
を使用してフォームにも入力できます。ただし、通常はWebセッションを使用する必要があります。HTTPは本来ステートレスなプロトコルであり、ブラウザ(この場合はPowerShell)はクッキーなどを追跡するためにセッションを作成できる必要があります。一般的なフォームは、ログイン/パスワードのフォームですので、架空のウェブサイトにログインしてみましょう!
架空のログインフォームがURL http://somewebsite.comにあると仮定します。最初にInvoke-WebRequest
を実行してHTMLの構造をダウンロードし、セッションを作成する必要があります。
これを行うと、レスポンスにはForms
プロパティが含まれ、ユーザ名とパスワードを入力することができます。この場合、ユーザ名はuser
というフィールドで表され、パスワードはpassword
というフィールドに入力する必要があります。これはウェブページによって異なります。
フォームに入力が完了したら、再びInvoke-WebRequest
を使用してセッションを再利用し、フォームに表示されるAction
プロパティを読み取って自動的に送信するURIを特定することができます。
適切なフィールド名をすべて正しく入力し、ウェブページが特殊な処理をしていない場合は、$rb
ウェブセッション内のユーザ名とパスワードでログインできるはずです。この時点で、$rb
ウェブセッション変数を使用して、認証された状態でさまざまなページを読むことができます。
短縮URIの解決
Invoke-WebRequest
のもう一つの素晴らしい使い方は、短縮URIの解決です。おそらく、その短縮URLの背後にある情報を知りたいけれども、クリックして確認することはしたくありません!問題ありません。Invoke-WebRequest
を使用することで、解析されたレスポンスからAbsoluteUri
プロパティを読み取ることができます!
以下では、UseBasicParsing
パラメータも使用しています。デフォルトでは、Invoke-WebRequest
はInternet Explorer(IE)を使用して返されたHTMLを解析しようとします。しかし、IEがないシステムでは機能しません。この問題を解決するために、UseBasicParsing
パラメータを使用してコンテンツをダウンロードし、軽く解析できます。
概要
Invoke-WebRequest
コマンドレットは、PowerShellに付属する最も多機能なコマンドレットの一つです。典型的なグラフィカルブラウザを介して実行できるアクションがあれば、Invoke-WebRequest
コマンドレットでも実行できます。このコマンドレットの使用例は、REST APIの監視に関するこの記事を参照してください。