Invoke-WebRequest: Отправка HTTP запросов, загрузка файлов и обработка HTML веб-страниц в PowerShell

Командлет Invoke-WebRequest можно использовать для обращения к HTTP/HTTPS/FTP ресурсам прямо из консоли PowerShell. С помощью этой команды вы можете отправить HTTP запросы, скачивать файлы с любых веб-сайтов, парсить HTML веб-страницы, заполнять и отправлять веб-формы. В этой статье мы рассмотрим несколько базовых примеров использования командлета Invoke-WebRequest для работы с веб-сервисами.

Получить содержимое веб-страницы с помощью командлета Invoke-WebRequest

Командлет Invoke-WebRequest доступен в Windows начиная с версии PowerShell 3.0. Командлет Invoke-WebRequest позволяет отправить HTTP запрос с методом GET к указанной веб странице и получить ответ от севера.

В Windows есть два алиаса для команды Invoke-WebRequest: iwk и wget .

Выполните следующую команду:

Invoke-WebRequest -Uri "https://remontka.com"

Совет . Если вы подключены к Интернет через прокси-сервер, нужно правильно настроить PowerShell для доступа через прокси-сервер .

Команда загрузила страницу и отобразила ее содержимое в консоли PowerShell. Возвращенный ответ представляет собой не просто HTML код страницы. Командлет Invoke-WebRequest возвращает объект типа HtmlWebResponseObjec t . Такой объект представляет собой набор коллекции форм, ссылок, изображений и других важных элементов HTML документа. Посмотрим все свойства данного объекта:

$WebResponseObj = Invoke-WebRequest -Uri "https://remontka.com"
$WebResponseObj| Get-Member

Чтобы получить сырой HTML код веб страницы, который содержится в данном объекте, выполните:

$WebResponseObj.content

Вы можете вывести HTML код страницы вместе с HTTP заголовками, которые вернул веб сервер:

$WebResponseObj.rawcontent

Можно получить только код ответа веб-сервера и HTTP заголовки HTML страницы:

$WebResponseObj.StatusCode
$WebResponseObj.Headers

Как вы видите, веб сервер вернул ответ 200 , т.е. запрос выполнен успешно и веб сервер доступен и работает корректно.

Key                       Value_x000D_---                       -----_x000D_Transfer-Encoding         chunked_x000D_Connection                keep-alive_x000D_Vary                      Accept-Encoding,Cookie_x000D_Strict-Transport-Security max-age=31536000;_x000D_Cache-Control             max-age=3, must-revalidate_x000D_Content-Type              text/html; charset=UTF-8_x000D_Date                      Mon, 11 Jul 2022 08:18:05 GMT_x000D_Server                    nginx/1.20.2_x000D_X-Powered-By              PHP/5.6.40

Чтобы получить время последней модификации веб-страницы:

$WebResponseObj.ParsedHtml | Select lastModified

Вы можете указать строку User Agent при подключении к веб-ресурсу. В PowerShell есть набор встроенных строк User Agent:

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

Список доступных агентов можно вывести так:

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

Либо вы можете задать собственную строку:

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

Использование Invoke-WebRequest с аутентификацией

Для доступа к некоторым веб ресурсам нужно выполнить аутентификацию. Вы можете использовать различные типы аутентификации совмести с командлетом Invoke-WebRequest (базовую, NTLM, Kerberos или аутентификацию по сертификату).

Для выполнения базовой аутентификации (Basic auth, аутентификация по имени и паролю зашифрованным в base64) сначала нужно получить имя пользователя и пароль:

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

Для использования текущих учетных данных пользователя Windows для выполнения NTLM или Kerberos аутентификации, используйте параметр UseDefaultCredentials:

Invoke-WebRequest 'http://site.com' -UseDefaultCredentials

DefaultCredentials не работает с Basic аутентфикацией.

Для аутентификации по сертификату, нужно указать его отпечаток:

Invoke-WebRequest 'http://site.com' -CertificateThumbprint xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Вы можете использовать современную Bearer/OAuth аутентификацию с помощью токена в ваших PowerShell скриптах.

  • Сначала нужно получить токен OAuth у вашего провайдера REST API
  • Сконвертируйте токен с помощью ConvertTo-SecureString: $Token = "123123123123123123123123123123123" | ConvertTo-SecureString -AsPlainText –Force
  • Теперь вы можете выполнить OAuth аутентфикацию:
    $Params = @{
    Uri = "https://yoursite.com"
    Authentication = "Bearer"
    Token = $Token }
    Invoke-RestMethod @Params

Парсинг HTML страниц с помощью Powershell

Командлет Invoke-WebRequest позволяет довольно быстро и удобно парсить содержимое любых веб-страниц. При обработке HTML страницы из ее содержимого формируются коллекции ссылок (links), веб-форм (forms), изображений (images), скриптов (scripts) и т.д.

Рассмотрим, как обратиться к конкретным объектам на веб-странице. Например, мы хотим получить список всех исходящих ссылок (объекты HREF) на полученной веб-странице:

$SiteAdress = "http://remontka.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 "*exchange*"} | fl innerText,href

Теперь рассмотрим, как получить все изображения на данной странице:

$Img.Images

Сформируем коллекцию из полных url путей к используемым изображениям:

$images = $Img.Images | select src

Инициализируем новый экземпляр класса WebClient:

$wc = New-Object System.Net.WebClient

И скачаем все изображения со страницы (с оригинальными именами) в каталог c:tools:

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

admin

Share
Published by
admin

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

1 неделя ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

1 неделя ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

1 неделя ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

1 неделя ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

1 неделя ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

1 неделя ago