Дмитрий Яковлев


Собственные значения User-Agent в HTTP-запросах из PowerShell

Стандартное значение строки User-Agent, которое использует командлет Invoke-WebRequest, в зависимости от операционной системы, языка и версии PowerShell, может выглядеть так: Mozilla/5.0 (Windows NT 10.0; Microsoft Windows 10.0.19042; ru-RU) PowerShell/7.1.3. На практике вы можете столкнуться с ситуацией, когда для успешного выполнения HTTP-запроса сервер требует от клиента использования собственного значения User-Agent. Что делать в этом случае?

Для начала немного теории. При выполнении HTTP-запроса клиент посылает серверу информацию о себе в виде текстовой строки, начинающейся с User-Agent:. Чаще всего эта информация включает в себя название и версию приложения-клиента, операционную систему, на которой оно выполняется и язык.

Командлет Invoke-WebRequest позволяет пользователю задать собственный User-Agent двумя способами.

Способ 1: напрямую, при помощи параметра -UserAgent.

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

Способ 2: в составе остальных параметров HTTP заголовка, при помощи параметра -Headers.

$headers = @{
  'method' = 'GET'
  'cache-control' = 'no-cache'
  'user-agent' = 'MyApplication/1.1'
}
Invoke-WebRequest -Uri $uri -Headers $headers

Если сервер не требует передачи собственного User-Agent, но вы хотите заменить стандартное значение командлета Invoke-WebRequest, например, для проверки работы сервера с разными клиентами, то можете использовать предопределённый набор строк User-Agent, предоставляемый классом Microsoft.PowerShell.Commands.PSUserAgent.

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

Например, если хотите имитировать обращение к серверу клиента, использующего браузер Safari, вызов командлета Invoke-WebRequest может выглядеть так:

Invoke-WebRequest -Uri $uri -UserAgent -UserAgent ([Microsoft.PowerShell.Commands.PSUserAgent]::Safari)

Для проверки значения User-Agent, получаемого сервером, можно использовать простой PHP скрипт, выполняемый на локальном встроенном веб-сервере PHP:

<?php
  echo $_SERVER['HTTP_USER_AGENT'];
php -S localhost:8000
Invoke-WebRequest -Uri 'http://localhost:8000/useragent.php' -UserAgent $userAgent | Select-Object -Expand Content