В интерне­те есть мно­жес­тво сер­висов, с которы­ми мож­но работать, обра­щаясь к их ресур­сам по про­токо­лу HTTP. Веб‑раз­работ­чики пос­тоян­но работа­ют с такими HTTP-зап­росами для дос­тупа к фун­кци­ям внеш­них API или для тес­тирова­ния собс­твен­ных при­ложе­ний. PowerShell для обра­щения к вебу по HTTP пред­лага­ет два стан­дар­тных коман­дле­та: Invoke-WebRequest и Invoke-RestMethod.
 

Командлет Invoke-WebRequest

С помощью коман­дле­та Invoke-WebRequest мож­но нап­равить веб‑сер­веру HTTP-зап­рос и получить от него ответ.

 

Анализ HTML-страниц

Этот коман­длет хорошо под­ходит для ана­лиза HTML-стра­ниц. Еще он уме­ет сох­ранять стра­ницы на локаль­ном дис­ке. В этом он похож на кон­соль­ную ути­литу wget и даже име­ет такой псев­доним:

PS C:\Script> Get-Alias wget
CommandType 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.html
PS C:\Script> $web | Get-Member
TypeName: Microsoft.PowerShell.Commands.HtmlWebResponseObject
. . .
PS C:\Script> $web
StatusCode : 200
StatusDescription : OK
Content : <!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.HTMLDocumentClass
RawContentLength : 1256

В поле StatusCode содер­жится код отве­та от сер­вера (200 для нашего при­мера), в поле StatusDescription — тек­сто­вое опи­сание это­го отве­та (OK).

Современный PowerShell

Современный PowerShell. Андрей Попов
Сов­ремен­ный 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.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
Expires: Mon, 19 Jul 2021 16:05:14 GMT
ETag: "3147526947+ident"
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7F83)
<!doctype html>
<html>
<head>
<title>Example Domain</title>
. . .

За­голов­ки отве­та тоже хра­нят­ся отдель­но — в виде хеш‑таб­лицы в свой­стве headers:

PS C:\Script> $web.headers
Key Value
--- -----
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
Expires Mon, 19 Jul 2021 16:05:14 GMT
ETag "3147526947+ident"
Last-Modified Thu, 17 Oct 2019 07:18:26 GMT
Server ECS (dcb/7F83)

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Подписаться
Уведомить о
1 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии