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つのエイリアスがあります。 iwk
と wget
。
次のコマンドを実行します。
Invoke-WebRequest -Uri "http://woshub.com"
Invoke-WebRequest: Unable to connect to the remote server CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
コマンドはページをロードし、PowerShellコンソールにその内容を表示しました。 返される応答は、ページのHTMLコードだけではありません。 Invoke-WebRequestコマンドレットは、タイプのオブジェクトを返します HtmlWebResponseObject。 このようなオブジェクトは、フォーム、リンク、画像、およびHTMLドキュメントの他の重要な要素のコレクションです。 このオブジェクトのすべてのプロパティを見てみましょう。
$WebResponseObj = Invoke-WebRequest -Uri "http://woshub.com"
$WebResponseObj| Get-Member
に含まれているWebページの生のHTMLコードを取得するには HtmlWebResponseObjectオブジェクト、実行:
$WebResponseObj.content
Webサーバーから返されるHTTPヘッダーと一緒にHTMLコードを一覧表示できます。
$WebResponseObj.rawcontent
確認できるのは、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
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) }}
または、独自の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トークン認証を使用できます。
- まず、REST APIプロバイダーからOAuthトークンを取得する必要があります(この投稿の範囲外)。
- ConvertTo-SecureStringコマンドレットを使用してトークンを変換します。
$Token = "12345678912345678901234567890" | ConvertTo-SecureString -AsPlainText –Force
- これで、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 }
リンクテキスト自体(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
次に、このページにすべての画像のリストを表示します。
$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) ) ) }
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”
このコマンドは、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
以下は、ターゲット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ファイルがダウンロードされます。 各ファイルはランダムな名前で保存されます。
Invoke-WebRequest -Uri $Uri -OutFile $OutFile –Resume
PowerShellを使用してHTMLフォームに入力して送信する方法は?
多くのWebサービスでは、さまざまなデータをHTMLフォームに入力する必要があります。 Invoke-WebRequestを使用すると、任意のHTMLフォームにアクセスし、必要なフィールドに入力して、完成したフォームをサーバーに送信できます。 この例では、PowerShellを使用して標準のWebフォームから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.
既定では、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.