Войти

Показать полную графическую версию : Класс WebRequest в Powershell


Uragan66
13-01-2020, 16:48
Добрый день всем!
Есть текстовый файл со ссылками. Необходимо проверить доступность серверов по ним. В ответе достаточно простого StatusCode, поэтому применил, вроде самый быстрый способ проверки, посредством NET класса WebRequest:
$url = 'http://5.28.31.65:4022/udp/232.1.19.6:1235'
$a = ([System.Net.WebRequest]::Create($url)).GetResponse()
$a.StatusCode

Ссылки могут быть на разные типы серверов. Пример ссылок:

http://tviptv.iptv-channel.ru:8000/streaming/clients_live.php?extension=m3u8&username=valerikmosoyan@gmail.com&password=89183640164&stream=17&type=hls&playlist.m3u8
http://mu01.v5iptv.com:8880/BL12MA000587/91417327/2985
http://5.28.31.65:4022/udp/232.1.19.6:1235
http://37.49.181.239:4022/udp/238.1.1.1:1234
http://193.201.98.123:7000/play/a02p

По большинству ссылок, если сервер доступен, ответ будет "ОК"
Но есть некоторые сервера, которые прерывают подключение. К примеру по этой ссылке:
http://heraiptv.vip:25461/QOPuVsib0M/mXi8xlbXG7/3689
сервер отдаёт:
Exception calling "GetResponse" with "0" argument(s): "Удаленный сервер возвратил ошибку: (401) Несанкционированный."
At I:\Проекты\Cecker\Untitled266.ps1:2 char:1
+ $a = ([System.Net.WebRequest]::Create($url)).GetResponse()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : WebException
Или по такой ссылке:
ttp://2.62.216.214:1234/udp/225.54.203.1:5000
ошибка:
Exception calling "GetResponse" with "0" argument(s): "Сервер нарушил протокол. Section=ResponseStatusLine"
At I:\Проекты\Cecker\Untitled266.ps1:2 char:1
+ $a = ([System.Net.WebRequest]::Create($url)).GetResponse()
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : WebException
Может кто сталкивался с использованием WebRequest в коде Powershell, подскажите, пожалуйста, можно ли добавить к запросу какие параметры, чтобы обойти такие ошибки серверов ?
При использовании командлета Invoke-WebRequest с методом HEAD возникают те же ошибки. Другие методы неприменимы в данном случае, так как по некоторым ссылкам, вместо ответа, идёт скачивание потока.

DJ Mogarych
13-01-2020, 20:24
С первым вариантом, скорее всего, надо указывать -Credentials

Второй вариант

function Set-UseUnsafeHeaderParsing
{
param(
[Parameter(Mandatory,ParameterSetName='Enable')]
[switch]$Enable,

[Parameter(Mandatory,ParameterSetName='Disable')]
[switch]$Disable
)

$ShouldEnable = $PSCmdlet.ParameterSetName -eq 'Enable'

$netAssembly = [Reflection.Assembly]::GetAssembly([System.Net.Configuration.SettingsSection])

if($netAssembly)
{
$bindingFlags = [Reflection.BindingFlags] 'Static,GetProperty,NonPublic'
$settingsType = $netAssembly.GetType('System.Net.Configuration.SettingsSectionInternal')

$instance = $settingsType.InvokeMember('Section', $bindingFlags, $null, $null, @())

if($instance)
{
$bindingFlags = 'NonPublic','Instance'
$useUnsafeHeaderParsingField = $settingsType.GetField('useUnsafeHeaderParsing', $bindingFlags)

if($useUnsafeHeaderParsingField)
{
$useUnsafeHeaderParsingField.SetValue($instance, $ShouldEnable)
}
}
}
}
Set-UseUnsafeHeaderParsing -Enable
(Invoke-WebRequest 'http://2.62.216.214:1234/udp/225.54.203.1:5000').StatusDescription

https://stackoverflow.com/a/35260673

Uragan66
13-01-2020, 23:34
DJ Mogarych, спасибо большое!
Но, к сожалению, по Вашему варианту на udpxy потоках, типа:
http://2.62.216.214:1234/udp/225.54.203.1:5000
вместо ответа идёт скачивание потока.
С первым вариантом, скорее всего, надо указывать -Credentials »
хотел указать, но не могу найти информации как правильно указать этот параметр...

DJ Mogarych
14-01-2020, 08:44
Добавьте
-TimeoutSec 3
Идёт скачивание потока, но потом выдаётся результат.

не могу найти информации как правильно указать этот параметр »
https://stackoverflow.com/a/27951845

Uragan66
14-01-2020, 10:53
Идёт скачивание потока, но потом выдаётся результат »
таки да... Спасибо большое!
Хотя по такому методу очень увеличивается время ответа, что при 10-20 линках несущественно, а когда их больше 1000, то да...
Придётся добавлять условие для отбора таких ссылок.
А с -Credentials в данном случае ничего не получится, требуется указание учётных данных, а где их взять то...




© OSzone.net 2001-2012