Получение контента, сжатого в Brotli
Добрый день всем!
Кто в теме, подскажите, пожалуйста, если на Powershell возможность получить контент веб страницы, сжатой алгоритмом Brotli ?
Имеется ввиду получение текста в читаемой кодировке.
|
Uragan66, пример url приведите.
|
Iska, по некоторым причинам не хотелось бы светить url.
Написал Вам на e-mail. Посмотрите, пожалуйста, почту.
|
Цитата:
Цитата Iska
что-то делалось (отсюда: »
|
Да, в версии PS 6.1 появилась поддержка Brotli
т.е. можно тот пример из ссылки использовать так:
Код:
Invoke-WebRequest https://www.bayden.com/test/brotliimg.aspx -Headers @{'Accept-Encoding'='br'} -OutFile C:\temp\brotli.jpg
а потом распаковать файл примерно таким скриптом:
Код:
param(
$infile = 'C:\temp\brotli.jpg',
$outfile = 'C:\temp\brotli_out.jpg'
)
function BrotliDecompress {
param (
[parameter(Mandatory=$true)]
[string]$a,
[parameter(Mandatory=$true)]
[string]$b
)
$in = [io.filestream]::new($a, [io.filemode]::open)
$out = [io.filestream]::new($b, [io.filemode]::create)
$decompress = [io.compression.brotlistream]::new(
$in,[io.compression.compressionmode]::decompress
)
$decompress.copyto($out)
$in.dispose()
$out.dispose()
}
BrotliDecompress $infile $outfile
|
YuS_2, я правильно понимаю, что, в принципе, те же действия можно проделать и с потоком в памяти (без участия внешних промежуточных файлов)?
|
Цитата:
Цитата Iska
я правильно понимаю, что, в принципе, те же действия можно проделать и с потоком в памяти (без участия внешних промежуточных файлов)? »
|
Да, конечно. Перегрузка [io.compression.brotlistream]::new говорит о том, что главное, чтобы тип данных потока соответствовал System.IO.Stream, а откуда он будет поступать - неважно.
Цитата:
Поток - это абстракция последовательности байтов, например файла, устройства ввода-вывода, межпроцессного канала связи или сокета TCP/IP. Класс Stream и его производные классы предоставляют общее представление этих различных типов входных и выходных данных и изолируют программиста от конкретных деталей операционной системы и базовых устройств.
|
|
Iska, YuS_2, спасибо большое за помощь!
Получилось отлично, на выходе файл в нужной кодировке.
|
Uragan66, ну, вот и славненько ;).
|
С потоком памяти не сообразил как правильно сделать, написал код с темп файлом:
Код:
param(
$infile = "$file.FullName",
$outfile = 'I:\brotli_out.txt'
)
function BrotliDecompress {
param (
[parameter(Mandatory=$true)]
[string]$a,
[parameter(Mandatory=$true)]
[string]$b
)
$in = [io.filestream]::new($a, [io.filemode]::open)
$out = [io.filestream]::new($b, [io.filemode]::create)
$decompress = [io.compression.brotlistream]::new(
$in,[io.compression.compressionmode]::decompress
)
$decompress.copyto($out)
$in.dispose()
$out.dispose()
}
$file = New-TemporaryFile
Invoke-WebRequest -Uri "какой-то сайт" -Headers @{"method"="GET"; "accept"="text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"; "referer"="другая страница сайта"; "accept-encoding"="gzip, deflate, br"; "accept-language"="ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7"} -OutFile $file.FullName
BrotliDecompress $file.FullName $outfile
Remove-Item $file.FullName -errorAction silentlycontinue
|
Цитата:
Цитата Uragan66
С потоком памяти не сообразил как правильно сделать »
|
на том же примере картинки:
Код:
function MemBrotliDecompress {
param (
[parameter(Mandatory=$true)]
[byte[]]$a,
[parameter(Mandatory=$true)]
[string]$b
)
$out = [io.filestream]::new($b, [io.filemode]::create)
$decompress = [io.compression.brotlistream]::new(
[io.memorystream]$a,[io.compression.compressionmode]::decompress
)
$decompress.copyto($out)
$out.dispose()
$decompress.dispose()
}
$mem = Invoke-WebRequest https://www.bayden.com/test/brotliimg.aspx -Headers @{'Accept-Encoding'='br'}
$outfile = 'C:\temp\brotli_out.jpg'
MemBrotliDecompress $mem.content $outfile
|
YuS_2, спасибо!
Но почему-то с Вашим примером сайта работает, с моим не хочет, типа как не хватает памяти...

Непонятно в чём проблема...
Но да ладно, с темп файлом нормально отрабатывает.
|
Цитата:
Цитата Uragan66
Непонятно в чём проблема... »
|
Первый параметр функции должен быть правильным массивом байтов, закодированных Brotli.

|
Время: 06:52.
© OSzone.net 2001-