PowerShell Invoke-WebRequest: Полное руководство

Вы когда-нибудь хотели просматривать веб-сайты через командную строку? Да. Я тоже нет. Но вам когда-нибудь приходилось извлекать информацию с веб-страницы, отслеживать сайт или отправлять информацию с помощью автоматизации? Мне да, и для этого я использую Invoke-Webrequest!

Командлет PowerShell Invoke-WebRequest – это швейцарский нож для веба. Этот командлет может отправлять любой HTTP-глагол на веб-сервис вместе с общими вещами, такими как HTTP-параметры, указывать различные заголовки HTTP и т. д. Invoke-WebRequest, вместе со своим “братом” Invite-RestMethod, – это два командлета PowerShell, с которыми вам стоит ознакомиться, если вам нужно выполнять какой-либо вид веб-автоматизации.

Командлет Invoke-WebRequest является частью модуля Microsoft.PowerShell.Utility, который поставляется с Windows PowerShell и PowerShell Core. Этот командлет был включен в PowerShell с версии 3 и является чрезвычайно мощным, но простым в использовании.

Используя Invoke-WebRequest, PowerShell позволяет разработчику работать с веб-сайтами, веб-сервисами и REST API различными способами.

Основное использование

В самом простом случае командлет Invoke-WebRequest отправляет метод запроса HTTP на конечную точку, такую как URI или URL. Этот командлет поддерживает все общие методы запроса.

Далеко не самый распространенный метод – это метод 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

Чтобы получить видеоролики, мне нужно немного поискать. Когда я смотрю на свойство links, я вижу общность в том, что у всех ссылок на видео есть класс 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 также для заполнения форм. Для этого нам часто нужно работать с веб-сессиями. HTTP является естественным протоколом без состояния, и ваш браузер (в данном случае PowerShell) должен быть способен создать сессию, которая будет использоваться для отслеживания, например, куки. Обычная форма – это форма входа/пароля, поэтому давайте войдем на вымышленный сайт!

Предположим, что наша вымышленная форма входа находится по адресу 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, но на этот раз повторно использовать созданную нами сессию и автоматически определить URI для отправки, считывая свойство Action, которое находится на форме, как показано ниже.

$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/