Содержание статьи
Invoke-WebRequest
и Invoke-RestMethod
.Командлет Invoke-WebRequest
С помощью командлета Invoke-WebRequest
можно направить веб‑серверу HTTP-запрос и получить от него ответ.
Анализ HTML-страниц
Этот командлет хорошо подходит для анализа HTML-страниц. Еще он умеет сохранять страницы на локальном диске. В этом он похож на консольную утилиту wget и даже имеет такой псевдоним:
PS C:\Script> Get-Alias wgetCommandType Name----------- ----Alias wget -> Invoke-WebRequest
Обратимся с помощью Invoke-WebRequest
к какой‑нибудь простой странице, например Example Domain.
По умолчанию Invoke-WebRequest
выполняет HTTP-запрос с методом GET к ресурсу на веб‑сервере, адрес ресурса указывается в качестве значения параметра -Uri
. В результате возвращается объект типа HtmlWebResponseObject
, в котором хранится информация об ответе сервера:
PS C:\Script> $web = Invoke-WebRequest -Uri https://example.com/index.htmlPS C:\Script> $web | Get-Member TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject. . .PS C:\Script> $webStatusCode : 200StatusDescription : OKContent : <!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; char set=utf-8" /> <meta name="viewport" conten...RawContent : HTTP/1.1 200 OK Age: 497890 Vary: Accept-Encoding X-Cache: HIT Content-Length: 1256 Cache-Control: max-age=604800 Content-Type: text/html; charset=UTF-8 Date: Mon, 12 Jul 2021 16:05:14 GMT Exp...Forms : {}Headers : {[Age, 497890], [Vary, Accept-Encoding], [X-Cache, HIT], [Co ntent-Length, 1256]...}Images : {}InputFields : {}Links : {@{innerHTML=More information...; innerText=More information ...; outerHTML=<A href="https://www.iana.org/domains/example ">More information...</A>; outerText=More information...; ta gName=A; href=https://www.iana.org/domains/example}}ParsedHtml : mshtml.HTMLDocumentClassRawContentLength : 1256
В поле StatusCode
содержится код ответа от сервера (200
для нашего примера), в поле StatusDescription
— текстовое описание этого ответа (OK
).
Современный PowerShell
Эта статья — глава из книги Андрея Попова «Современный PowerShell», вышедшей в издательстве «БХВ» в марте этого года. В книге подробно описан язык PowerShell и работа с оболочкой Windows PowerShell в Windows Terminal, взаимодействие с файловой системой, структурированными данными и веб‑ресурсами. Автор разбирает управление процессами, службами и серверами автоматизации, рассказывает, как создать GUI для сценариев Windows PowerShell, уделяет внимание кросс‑платформенным возможностям PowerShell в macOS и Linux.
Если ты администрируешь рабочие станции, серверы или локальные сети под управлением Windows, книга «Современный PowerShell» поможет тебе освоить секреты и хитрости этой технологии и автоматизировать множество рутинных задач.
Содержимое ответа от сервера и HTTP-заголовки
Содержимое ответа от сервера хранится в виде строки в поле Content
. В нашем случае здесь будет записан HTML-код:
PS C:\Script> $web.Content<!doctype html><html><head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 2em; background-color: #fdfdff; border-radius: 0.5em; box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02); } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { div { margin: 0 auto; width: auto; } } </style></head><body><div> <h1>Example Domain</h1> <p>This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.</p> <p><a href="https://www.iana.org/domains/example">More information...</a></p></div></body></html>
В поле RawContent
записывается полный ответ от сервера с HTTP-заголовками в начале:
PS C:\Script> $web.RawContentHTTP/1.1 200 OKAge: 497890Vary: Accept-EncodingX-Cache: HITContent-Length: 1256Cache-Control: max-age=604800Content-Type: text/html; charset=UTF-8Date: Mon, 12 Jul 2021 16:05:14 GMTExpires: Mon, 19 Jul 2021 16:05:14 GMTETag: "3147526947+ident"Last-Modified: Thu, 17 Oct 2019 07:18:26 GMTServer: ECS (dcb/7F83)<!doctype html><html><head> <title>Example Domain</title>. . .
Заголовки ответа тоже хранятся отдельно — в виде хеш‑таблицы в свойстве headers
:
PS C:\Script> $web.headersKey Value--- -----Age 497890Vary Accept-EncodingX-Cache HITContent-Length 1256Cache-Control max-age=604800Content-Type text/html; charset=UTF-8Date Mon, 12 Jul 2021 16:05:14 GMTExpires Mon, 19 Jul 2021 16:05:14 GMTETag "3147526947+ident"Last-Modified Thu, 17 Oct 2019 07:18:26 GMTServer ECS (dcb/7F83)
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»