Войти

Показать полную графическую версию : Получение контента, сжатого в Brotli


Uragan66
27-03-2020, 09:50
Добрый день всем!
Кто в теме, подскажите, пожалуйста, если на Powershell возможность получить контент веб страницы, сжатой алгоритмом Brotli ?
Имеется ввиду получение текста в читаемой кодировке.

Iska
27-03-2020, 12:19
Uragan66, пример url приведите.

Uragan66
27-03-2020, 14:55
Iska, по некоторым причинам не хотелось бы светить url.
Написал Вам на e-mail. Посмотрите, пожалуйста, почту.

Iska
27-03-2020, 17:00
Uragan66, спасибо, посмотрел.

Как я понимаю, что-то делалось (отсюда: Add support for brotli compression to Web Cmdeltes · Issue #4947 · PowerShell/PowerShell · GitHub (https://github.com/PowerShell/PowerShell/issues/4947)):
Latest nightly w/ merged dotnetcore2.1-rc1 include System.Compression.Brotli
но от меня сие, увы, слишком далеко.

YuS_2
27-03-2020, 18:01
что-то делалось (отсюда: »
Да, в версии 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

Iska
27-03-2020, 20:52
YuS_2, я правильно понимаю, что, в принципе, те же действия можно проделать и с потоком в памяти (без участия внешних промежуточных файлов)?

YuS_2
27-03-2020, 21:25
я правильно понимаю, что, в принципе, те же действия можно проделать и с потоком в памяти (без участия внешних промежуточных файлов)? »
Да, конечно. Перегрузка [io.compression.brotlistream (https://docs.microsoft.com/ru-ru/dotnet/api/system.io.compression.brotlistream.-ctor?view=netcore-2.2)]::new говорит о том, что главное, чтобы тип данных потока соответствовал System.IO.Stream (https://docs.microsoft.com/ru-ru/dotnet/api/system.io.stream?view=netcore-2.1), а откуда он будет поступать - неважно.

Поток - это абстракция последовательности байтов, например файла, устройства ввода-вывода, межпроцессного канала связи или сокета TCP/IP. Класс Stream и его производные классы предоставляют общее представление этих различных типов входных и выходных данных и изолируют программиста от конкретных деталей операционной системы и базовых устройств.

Uragan66
27-03-2020, 22:01
Iska, YuS_2, спасибо большое за помощь!
Получилось отлично, на выходе файл в нужной кодировке.

Iska
27-03-2020, 22:58
Uragan66, ну, вот и славненько ;).

Uragan66
28-03-2020, 07:40
С потоком памяти не сообразил как правильно сделать, написал код с темп файлом:
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

YuS_2
28-03-2020, 09:23
С потоком памяти не сообразил как правильно сделать »
на том же примере картинки:
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

Uragan66
29-03-2020, 10:05
YuS_2, спасибо!
Но почему-то с Вашим примером сайта работает, с моим не хочет, типа как не хватает памяти...
http://images.vfl.ru/ii/1585465416/fe7af5bf/30037455.jpg
Непонятно в чём проблема...
Но да ладно, с темп файлом нормально отрабатывает.

YuS_2
29-03-2020, 10:45
Непонятно в чём проблема... »
Первый параметр функции должен быть правильным массивом байтов, закодированных Brotli.
http://ipic.su/img/img7/tn/Bezimeni20200329134741.1585468145.png (http://ipic.su/img/img7/fs/Bezimeni20200329134741.1585468145.png)




© OSzone.net 2001-2012