もっと詳しく

The Invoke-WebRequest コマンドレットを使用して、PowerShellコンソールから直接HTTP / HTTPS/FTPリソースを要求できます。 このコマンドを使用して、HTTPリクエスト(GETおよびPOST)の送信、Webサイトからのファイルのダウンロード、HTML Webページの解析、認証の実行、Webフォームへの入力と送信などを行うことができます。この記事では、使用の基本的な例について説明します。 Webサービスと対話するためのPowerShellのInvoke-WebRequestコマンドレット。

Invoke-WebRequestコマンドレットを使用してWebページコンテンツを取得する

The Invoke-WebRequest コマンドレットを使用すると、GETメソッドを使用してHTTP、HTTPS、またはFTP要求を指定されたWebページに送信し、サーバーから応答を受信できます。 このコマンドレットは、バージョンPowerShell3.0以降のWindowsで使用できます。

WindowsのInvoke-WebRequestコマンドには2つのエイリアスがあります。 iwkwget

次のコマンドを実行します。

Invoke-WebRequest -Uri "http://woshub.com"

ヒント。 プロキシサーバーを介してインターネットに接続している場合は、プロキシサーバーを介してWebにアクセスするようにPowerShellを適切に構成する必要があります。 プロキシパラメータを設定しない場合、IWKコマンドを実行するとエラーが発生します。

Invoke-WebRequest:  Unable to connect to the remote server
CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Invoke-WebRequest:リモートサーバーに接続できません

コマンドはページをロードし、PowerShellコンソールにその内容を表示しました。 返される応答は、ページのHTMLコードだけではありません。 Invoke-WebRequestコマンドレットは、タイプのオブジェクトを返します HtmlWebResponseObject。 このようなオブジェクトは、フォーム、リンク、画像、およびHTMLドキュメントの他の重要な要素のコレクションです。 このオブジェクトのすべてのプロパティを見てみましょう。

$WebResponseObj = Invoke-WebRequest -Uri "http://woshub.com"
$WebResponseObj| Get-Member

HtmlWebResponseObjectプロパティ

に含まれているWebページの生のHTMLコードを取得するには HtmlWebResponseObjectオブジェクト、実行:

$WebResponseObj.content

Webサーバーから返されるHTTPヘッダーと一緒にHTMLコードを一覧表示できます。

$WebResponseObj.rawcontent

Invoke-WebRequestは、Webページでhtml生コードとhttpステータスを取得します

確認できるのは、WebサーバーのHTTPステータスコードとHTMLページのHTTPヘッダーのみです。

$WebResponseObj.Headers

ご覧のとおり、サーバーは応答を返しました 200。 これは、要求が成功し、Webサーバーが使用可能であり、正しく機能していることを意味します。

Key               Value
---               -----
Transfer-Encoding chunked
Connection        keep-alive
Vary              Accept-Encoding,Cookie
Cache-Control     max-age=3, must-revalidate
Content-Type      text/html; charset=UTF-8
Date              Wed, 13 Jul 2022 02:28:32 GMT
Server            nginx/1.20.2
X-Powered-By      PHP/5.6.40

Webページの最終変更時刻を取得するには:

$WebResponseObj.ParsedHtml | Select lastModified

PowerShellはWebページの最終更新日を取得します

Webリソースに接続するときに、ユーザーエージェント文字列を指定できます。 PowerShellには、一連の組み込みのユーザーエージェント文字列があります。

invoke-webRequest -Uri $uri -userAgent ([Microsoft.PowerShell.Commands.PSUserAgent]::Chrome)

PowerShellで使用可能なエージェントのリストは、次のように表示できます。

[Microsoft.PowerShell.Commands.PSUserAgent].GetProperties() | Select-Object Name, @{n='UserAgent';e={ [Microsoft.PowerShell.Commands.PSUserAgent]::$($_.Name) }}

PowerShell:ユーザーエージェントを設定します

または、独自のUserAgent文字列を設定できます。

Invoke-WebRequest -Uri $uri -UserAgent 'MyApplication/1.1'

認証でのInvoke-WebRequestの使用

一部のWebリソースには、アクセスするために認証が必要です。 Invoke-WebRequestコマンドレットでは、さまざまな種類の認証(Basic、NTLM、Kerberos、OAuth、または証明書認証)を使用できます。

基本認証(base64でエンコードされた名前とパスワードによる認証)を実行するには、最初にユーザー名とパスワードを取得する必要があります。

$cred = Get-Credential
wget -Uri 'https://somesite.com' -Credential $cred

現在のWindowsユーザー資格情報を使用してNTLMまたはKerberos認証を実行するには、-UseDefaultCredentialsオプションを追加します。

Invoke-WebRequest 'https://somesite.com' -UseDefaultCredentials

DefaultCredentialsが基本認証で機能しません。

証明書で認証するには、その指紋を指定する必要があります。

Invoke-WebRequest 'https://somesite.com' -CertificateThumbprint xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

PowerShellスクリプトで最新のBearer/OAuthトークン認証を使用できます。

  1. まず、REST APIプロバイダーからOAuthトークンを取得する必要があります(この投稿の範囲外)。
  2. ConvertTo-SecureStringコマンドレットを使用してトークンを変換します。 $Token = "12345678912345678901234567890" | ConvertTo-SecureString -AsPlainText –Force
  3. これで、OAuth認証を実行できます。
    $Params = @{
    Uri = "https://somesite.com"
    Authentication = "Bearer"
    Token = $Token }
    Invoke-RestMethod @Params

PowerShellを使用してWebページのHTMLを解析およびスクレイピングする

Invoke-WebRequestコマンドレットを使用すると、任意のWebページのコンテンツをすばやく簡単に解析できます。 HTMLページを処理すると、リンク、Webフォーム、画像、スクリプトなどのコレクションが作成されます。

Webページ上の特定のオブジェクトにアクセスする方法を見てみましょう。 たとえば、ターゲットHTML Webページ上のすべての送信リンク(A HREFオブジェクト)のリストを取得したいとします。

$SiteAdress = "http://woshub.com"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Foreach {$_.href }

Invoke-WebRequest createhtmlhrefsコレクション

リンクテキスト自体(InnerText要素に含まれている)を取得するには、次のコマンドを使用できます。

$HttpContent.Links | fl innerText, href

特定のCSSクラスのリンクのみを選択できます。

$HttpContent.Links | Where-Object {$_.class -eq "page-numbers"} | fl innerText, href

または、URLアドレスの特定のテキスト:

$HttpContent.Links | Where-Object {$_.href -like "*powershell*"} | fl innerText,href

poshでhtmlオブジェクトをフィルタリングする

次に、このページにすべての画像のリストを表示します。

$Img.Images

これらの画像への完全なURLパスのコレクションを作成します。

$images = $Img.Images | select src

WebClientクラスの新しいインスタンスを初期化します。

$wc = New-Object System.Net.WebClient

そして、すべての画像ファイルをページから(元のファイル名で)c:too1sフォルダーにダウンロードします。

$images | foreach { $wc.DownloadFile( $_.src, ("c:tools"+[io.path]::GetFileName($_.src) ) ) }

Invoke-WebRequest解析htmlページ

PowerShell Wget(Invoke-WebRequest)を使用してHTTP / FTP経由でファイルをダウンロードする方法は?

Invoke-WebRequestを使用すると、WebページまたはFTPサイトからファイルをダウンロードできます(WindowsではWgetまたはcURLのように機能します)。 PowerShellを使用してHTTPからファイルをダウンロードするとします。 次のPowerShellコマンドを実行します。

wget "https://download-installer.cdn.mozilla.net/pub/firefox/releases/102.0.1/win64/en-US/Firefox%20Setup%20102.0.1.exe" -outfile “c:toolsfirefox_setup.exe”

powershell:wgetエイリアスを使用してhttp/httpsファイルをダウンロードする

このコマンドは、HTTPサイトからファイルをダウンロードし、指定されたディレクトリに保存します。

wgetでダウンロードする前に、ファイルのサイズをMB単位で取得できます。

$url = "https://download-installer.cdn.mozilla.net/pub/firefox/releases/102.0.1/win64/en-US/Firefox%20Setup%20102.0.1.exe"
(Invoke-WebRequest $url -Method Head).Headers.'Content-Length'/1Mb

wget:powershellはhttpリンクでファイルサイズを取得します

以下は、ターゲットWebページ上の* .pdfファイルへのすべてのリンクを検索し、検索されたすべてのファイルをWebサイトからコンピューターに一括ダウンロードするPowerShellスクリプトの例です(各pdfファイルはランダムな名前で保存されます)。

$OutDir="C:docsdownloadPDF"
$SiteAdress = "https://sometechdocs.com/pdf"
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Where-Object {$_.href -like "*.pdf"} | %{Invoke-WebRequest -Uri $_.href -OutFile ($OutDir + $(Get-Random 200000)+".pdf")}

ターゲットディレクトリのスクリプトの結果として、ページのすべてのpdfファイルがダウンロードされます。 各ファイルはランダムな名前で保存されます。

最新のPowerShellCore(6.1以降)では、Invoke-WebRequestコマンドレットは再開モードをサポートしています。 PowerShell Coreのバージョンを更新すると、 -履歴書 Invoke-WebRequestコマンドのオプションで、通信チャネルまたはサーバーが使用できない場合にファイルのダウンロードを自動的に再開します。

Invoke-WebRequest -Uri $Uri -OutFile $OutFile –Resume

PowerShellを使用してHTMLフォームに入力して送信する方法は?

多くのWebサービスでは、さまざまなデータをHTMLフォームに入力する必要があります。 Invoke-WebRequestを使用すると、任意のHTMLフォームにアクセスし、必要なフィールドに入力して、完成したフォームをサーバーに送信できます。 この例では、PowerShellを使用して標準のWebフォームからFacebookにサインインする方法を示します。

Powershellを使用してFacebookログインフォームに入力して送信します

次のコマンドを使用して、接続Cookieに関する情報を別のセッション変数に保存します。

$fbauth = Invoke-WebRequest https://www.facebook.com/login.php -SessionVariable session

次のコマンドを使用して、ログインHTMLフォーム(login_form)に入力するフィールドのリストを表示します。

$fbauth.Forms["login_form"].Fields

すべてのフィールドに目的の値を割り当てます。

$fbauth.Forms["login_form"].Fields["email"] = "somemail@gmail.com"

$fbauth.Forms["login_form"].Fields["pass"] = "Coo1P$wd"

等。

記入済みのフォームをサーバーに送信(送信)するには、HTMLフォームのaction属性を呼び出します。

$Log = Invoke-WebRequest -method POST -URI ("https://www.facebook.com/login.php" + $fbauth.Forms["login_form"].Action) -Body $fbauth.Forms["login_form"].Fields -WebSession $session

JSON形式を使用して、POSTメソッドを使用してデータをWebページに送信することもできます。

$headers = @{
'Content-Type'='application/json'
'apikey'='0987654321'
}
$jsonbody = @{
"siteUrl" ="https://somesite.com"
"email" = "max@somesite.com"
}
Invoke-WebRequest -Method 'Post' -Uri $url -Body ($jsonbody |ConvertTo-Json) -Headers $headers -ContentType "application/json"

Invoke-WebRequest:SSL/TLS証明書チェックを無視する

もう1つの問題は、Invoke-WebRequestコマンドレットがInternetExplorerと密接に関連していることです。 たとえば、IEがインストール(または削除)されていないWindows Server Coreエディションでは、Invoke-WebRequestコマンドレットを使用できません。

Invoke-WebRequest: The response content cannot be parsed because the Internet Explorer engine is not available, or Internet Explorer’s first-launch configuration is not complete. Specify the UseBasicParsing parameter and try again.

この場合、Invoke-WebRequestの代わりにWebClientクラスを使用できます。 たとえば、指定したURLからファイルをダウンロードするには、コマンドを使用します。

(New-Object -TypeName 'System.Net.WebClient').DownloadFile($Url, $FileName)

HTTPSサイトで無効なSSL証明書が使用されている場合、またはPowerShellがこのタイプのSSL / TLSプロトコルをサポートしていない場合、Invoke-WebRequestコマンドレットは接続をドロップします。

Invoke-WebRequest : The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.
Invoke-WebRequest : The request was aborted: Could not create SSL/TLS secure channel.

invoke-webrequest powershell:信頼関係を確立できませんでしたSSLTLSセキュアチャネル

既定では、Windows PowerShell(Windows 10、Windows Server 2016、および古いバージョンのWindowsの初期ビルド)は、接続にレガシーで安全でないTLS 1.0プロトコルを使用します(PowerShellモジュールのインストールエラーについて説明しているブログ投稿を確認してください:Install-Module:Unable URIからダウンロードする)。

従来のTLS1.0およびTLS1.1プロトコルがWindowsで無効になっていない場合、PowerShell接続でTLS 1.2を使用するには、次のコマンドを実行する必要があります。

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

HTTPSサイトで自己署名証明書が使用されている場合、Invoke-WebRequestコマンドレットはその証明書からのデータの受信を拒否します。 無効なSSL証明書を無視(スキップ)するには、次のPowerShellコードを使用します。

add-type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
"@
$AllProtocols = [System.Net.SecurityProtocolType]'Ssl3,Tls,Tls11,Tls12'
[System.Net.ServicePointManager]::SecurityProtocol = $AllProtocols
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$result = Invoke-WebRequest -Uri "https://somesite.com"

PowerShell Coreでは、Invoke-WebRequestコマンドレットに追加のパラメーターがあります–SkipCertificateCheck これにより、無効なSSL/TLS証明書を無視できます。

Invoke-WebRequestコマンドレットのもう1つの重大な欠点は、パフォーマンスがかなり低いことです。 ファイルをダウンロードするとき、HTTPストリームは完全にメモリにバッファリングされ、完全な完全ダウンロードが完了した後にのみディスクに保存されます。 したがって、Invoke-WebRequesを使用して大きなファイルをダウンロードすると、RAMが不足する可能性があります。

The post Invoke-WebRequest:HTTPリクエストの実行、ファイルのダウンロード、PowerShellを使用したWebの解析 appeared first on Gamingsym Japan.