Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Получение контента, сжатого в Brotli (http://forum.oszone.net/showthread.php?t=344568)

Uragan66 27-03-2020 09:50 2914822

Получение контента, сжатого в Brotli
 
Добрый день всем!
Кто в теме, подскажите, пожалуйста, если на Powershell возможность получить контент веб страницы, сжатой алгоритмом Brotli ?
Имеется ввиду получение текста в читаемой кодировке.

Iska 27-03-2020 12:19 2914841

Uragan66, пример url приведите.

Uragan66 27-03-2020 14:55 2914853

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

Iska 27-03-2020 17:00 2914861

Uragan66, спасибо, посмотрел.

Как я понимаю, что-то делалось (отсюда: Add support for brotli compression to Web Cmdeltes · Issue #4947 · PowerShell/PowerShell · GitHub):
Цитата:

Latest nightly w/ merged dotnetcore2.1-rc1 include System.Compression.Brotli
но от меня сие, увы, слишком далеко.

YuS_2 27-03-2020 18:01 2914874

Цитата:

Цитата 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


Iska 27-03-2020 20:52 2914890

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

YuS_2 27-03-2020 21:25 2914892

Цитата:

Цитата Iska
я правильно понимаю, что, в принципе, те же действия можно проделать и с потоком в памяти (без участия внешних промежуточных файлов)? »

Да, конечно. Перегрузка [io.compression.brotlistream]::new говорит о том, что главное, чтобы тип данных потока соответствовал System.IO.Stream, а откуда он будет поступать - неважно.

Цитата:

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

Uragan66 27-03-2020 22:01 2914895

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

Iska 27-03-2020 22:58 2914901

Uragan66, ну, вот и славненько ;).

Uragan66 28-03-2020 07:40 2914918

С потоком памяти не сообразил как правильно сделать, написал код с темп файлом:
Код:

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 2914926

Цитата:

Цитата 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


Uragan66 29-03-2020 10:05 2914996

YuS_2, спасибо!
Но почему-то с Вашим примером сайта работает, с моим не хочет, типа как не хватает памяти...

Непонятно в чём проблема...
Но да ладно, с темп файлом нормально отрабатывает.

YuS_2 29-03-2020 10:45 2915000

Цитата:

Цитата Uragan66
Непонятно в чём проблема... »

Первый параметр функции должен быть правильным массивом байтов, закодированных Brotli.


Время: 06:52.

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